coverage-report

Code coverage report for All files

npmtest-echarts (v0.0.1)

Code coverage report for All files

Statements: 17.21% (3728 / 21666)      Branches: 2.43% (257 / 10564)      Functions: 3.01% (101 / 3350)      Lines: 17.21% (3725 / 21641)      Ignored: 26 statements, 1 function, 30 branches     

File Statements Branches Functions Lines
node-npmtest-echarts/ 100% (153 / 153) 100% (126 / 126) 100% (28 / 28) 100% (153 / 153)
node-npmtest-echarts/node_modules/echarts/ 97.67% (42 / 43) 0% (0 / 4) 100% (0 / 0) 97.67% (42 / 43)
node-npmtest-echarts/node_modules/echarts/extension/ 50% (1 / 2) 100% (0 / 0) 0% (0 / 1) 100% (1 / 1)
node-npmtest-echarts/node_modules/echarts/extension/bmap/ 6.25% (9 / 144) 0% (0 / 46) 0% (0 / 29) 6.25% (9 / 144)
node-npmtest-echarts/node_modules/echarts/extension/dataTool/ 8.4% (10 / 119) 0% (0 / 58) 0% (0 / 15) 8.4% (10 / 119)
node-npmtest-echarts/node_modules/echarts/lib/ 26.58% (210 / 790) 6.93% (26 / 375) 10.95% (15 / 137) 26.58% (210 / 790)
node-npmtest-echarts/node_modules/echarts/lib/action/ 21.67% (13 / 60) 0% (0 / 26) 22.22% (2 / 9) 21.67% (13 / 60)
node-npmtest-echarts/node_modules/echarts/lib/chart/ 97.9% (140 / 143) 100% (0 / 0) 0% (0 / 2) 97.9% (140 / 143)
node-npmtest-echarts/node_modules/echarts/lib/chart/bar/ 14.32% (64 / 447) 0% (0 / 190) 0% (0 / 63) 14.32% (64 / 447)
node-npmtest-echarts/node_modules/echarts/lib/chart/boxplot/ 20.71% (29 / 140) 0% (0 / 24) 0% (0 / 19) 20.71% (29 / 140)
node-npmtest-echarts/node_modules/echarts/lib/chart/candlestick/ 27.73% (33 / 119) 0% (0 / 42) 0% (0 / 18) 27.73% (33 / 119)
node-npmtest-echarts/node_modules/echarts/lib/chart/chord/ 13.33% (16 / 120) 0% (0 / 40) 0% (0 / 19) 13.33% (16 / 120)
node-npmtest-echarts/node_modules/echarts/lib/chart/effectScatter/ 40% (6 / 15) 0% (0 / 2) 0% (0 / 6) 40% (6 / 15)
node-npmtest-echarts/node_modules/echarts/lib/chart/funnel/ 11.96% (25 / 209) 0% (0 / 43) 0% (0 / 26) 11.96% (25 / 209)
node-npmtest-echarts/node_modules/echarts/lib/chart/gauge/ 7.98% (15 / 188) 0% (0 / 62) 0% (0 / 17) 7.98% (15 / 188)
node-npmtest-echarts/node_modules/echarts/lib/chart/graph/ 10.23% (71 / 694) 0% (0 / 296) 0% (0 / 101) 10.23% (71 / 694)
node-npmtest-echarts/node_modules/echarts/lib/chart/heatmap/ 7.39% (15 / 203) 0% (0 / 80) 0% (0 / 19) 7.39% (15 / 203)
node-npmtest-echarts/node_modules/echarts/lib/chart/helper/ 18% (207 / 1150) 0% (0 / 463) 0% (0 / 150) 18% (207 / 1150)
node-npmtest-echarts/node_modules/echarts/lib/chart/line/ 7.74% (39 / 504) 0% (0 / 257) 0% (0 / 41) 7.8% (39 / 500)
node-npmtest-echarts/node_modules/echarts/lib/chart/lines/ 12.5% (17 / 136) 0% (0 / 98) 0% (0 / 20) 12.5% (17 / 136)
node-npmtest-echarts/node_modules/echarts/lib/chart/map/ 11.86% (23 / 194) 0% (0 / 94) 0% (0 / 37) 11.86% (23 / 194)
node-npmtest-echarts/node_modules/echarts/lib/chart/parallel/ 15.86% (23 / 145) 0% (0 / 55) 0% (0 / 28) 15.86% (23 / 145)
node-npmtest-echarts/node_modules/echarts/lib/chart/pie/ 10.56% (38 / 360) 0% (0 / 157) 0% (0 / 39) 10.56% (38 / 360)
node-npmtest-echarts/node_modules/echarts/lib/chart/radar/ 13.13% (21 / 160) 0% (0 / 54) 0% (0 / 27) 13.13% (21 / 160)
node-npmtest-echarts/node_modules/echarts/lib/chart/sankey/ 13.87% (38 / 274) 0% (0 / 50) 0% (0 / 59) 13.87% (38 / 274)
node-npmtest-echarts/node_modules/echarts/lib/chart/scatter/ 28.57% (6 / 21) 0% (0 / 8) 0% (0 / 6) 28.57% (6 / 21)
node-npmtest-echarts/node_modules/echarts/lib/chart/themeRiver/ 9.84% (25 / 254) 0% (0 / 46) 0% (0 / 30) 9.84% (25 / 254)
node-npmtest-echarts/node_modules/echarts/lib/chart/treemap/ 13.01% (108 / 830) 0% (0 / 497) 0% (0 / 106) 13.01% (108 / 830)
node-npmtest-echarts/node_modules/echarts/lib/component/ 39.17% (170 / 434) 0% (0 / 193) 1.92% (1 / 52) 39.17% (170 / 434)
node-npmtest-echarts/node_modules/echarts/lib/component/axis/ 14.44% (94 / 651) 0.66% (2 / 301) 1.56% (1 / 64) 14.44% (94 / 651)
node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/ 16.86% (134 / 795) 0% (0 / 440) 0% (0 / 113) 16.86% (134 / 795)
node-npmtest-echarts/node_modules/echarts/lib/component/brush/ 22.31% (58 / 260) 0% (0 / 152) 1.59% (1 / 63) 22.31% (58 / 260)
node-npmtest-echarts/node_modules/echarts/lib/component/calendar/ 4.26% (8 / 188) 0% (0 / 84) 0% (0 / 14) 4.26% (8 / 188)
node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/ 13.66% (115 / 842) 0.24% (1 / 416) 0.62% (1 / 161) 13.66% (115 / 842)
node-npmtest-echarts/node_modules/echarts/lib/component/geo/ 15.38% (2 / 13) 0% (0 / 9) 0% (0 / 3) 15.38% (2 / 13)
node-npmtest-echarts/node_modules/echarts/lib/component/helper/ 16.87% (151 / 895) 0% (0 / 397) 0.58% (1 / 173) 16.87% (151 / 895)
node-npmtest-echarts/node_modules/echarts/lib/component/legend/ 11.43% (20 / 175) 0% (0 / 122) 0% (0 / 28) 11.43% (20 / 175)
node-npmtest-echarts/node_modules/echarts/lib/component/marker/ 12.48% (64 / 513) 0% (0 / 267) 0% (0 / 76) 12.48% (64 / 513)
node-npmtest-echarts/node_modules/echarts/lib/component/radar/ 7.79% (6 / 77) 0% (0 / 26) 0% (0 / 10) 7.79% (6 / 77)
node-npmtest-echarts/node_modules/echarts/lib/component/timeline/ 13.15% (56 / 426) 0% (0 / 220) 0% (0 / 66) 13.15% (56 / 426)
node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/ 14.29% (18 / 126) 0% (0 / 77) 4.55% (1 / 22) 14.29% (18 / 126)
node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/feature/ 19.22% (89 / 463) 0% (0 / 218) 0% (0 / 77) 19.22% (89 / 463)
node-npmtest-echarts/node_modules/echarts/lib/component/tooltip/ 9.22% (39 / 423) 0% (0 / 245) 0% (0 / 54) 9.22% (39 / 423)
node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/ 11.63% (104 / 894) 0% (0 / 532) 0% (0 / 151) 11.63% (104 / 894)
node-npmtest-echarts/node_modules/echarts/lib/coord/ 17.86% (60 / 336) 0% (0 / 199) 3.33% (2 / 60) 17.86% (60 / 336)
node-npmtest-echarts/node_modules/echarts/lib/coord/calendar/ 13.67% (19 / 139) 0% (0 / 69) 0% (0 / 30) 13.67% (19 / 139)
node-npmtest-echarts/node_modules/echarts/lib/coord/cartesian/ 20.88% (76 / 364) 0% (0 / 182) 0% (0 / 77) 20.88% (76 / 364)
node-npmtest-echarts/node_modules/echarts/lib/coord/geo/ 14.09% (51 / 362) 2.47% (4 / 162) 2.13% (1 / 47) 14.13% (51 / 361)
node-npmtest-echarts/node_modules/echarts/lib/coord/geo/fix/ 53.13% (17 / 32) 0% (0 / 6) 0% (0 / 6) 53.13% (17 / 32)
node-npmtest-echarts/node_modules/echarts/lib/coord/parallel/ 18.05% (50 / 277) 0% (0 / 97) 0% (0 / 45) 18.05% (50 / 277)
node-npmtest-echarts/node_modules/echarts/lib/coord/polar/ 24.07% (39 / 162) 0% (0 / 57) 0% (0 / 32) 24.07% (39 / 162)
node-npmtest-echarts/node_modules/echarts/lib/coord/radar/ 17.61% (31 / 176) 0% (0 / 50) 4.55% (1 / 22) 17.61% (31 / 176)
node-npmtest-echarts/node_modules/echarts/lib/coord/single/ 21.01% (25 / 119) 0% (0 / 52) 0% (0 / 28) 21.01% (25 / 119)
node-npmtest-echarts/node_modules/echarts/lib/data/ 13.38% (106 / 792) 0.8% (3 / 375) 0.88% (1 / 114) 13.38% (106 / 792)
node-npmtest-echarts/node_modules/echarts/lib/data/helper/ 22.22% (18 / 81) 0% (0 / 47) 0% (0 / 16) 22.22% (18 / 81)
node-npmtest-echarts/node_modules/echarts/lib/layout/ 6.72% (9 / 134) 0% (0 / 71) 0% (0 / 16) 6.72% (9 / 134)
node-npmtest-echarts/node_modules/echarts/lib/loading/ 16.67% (4 / 24) 0% (0 / 2) 0% (0 / 2) 16.67% (4 / 24)
node-npmtest-echarts/node_modules/echarts/lib/model/ 16.39% (88 / 537) 0.63% (2 / 317) 0% (0 / 112) 16.39% (88 / 537)
node-npmtest-echarts/node_modules/echarts/lib/model/mixin/ 27.94% (19 / 68) 3.39% (2 / 59) 7.14% (1 / 14) 27.94% (19 / 68)
node-npmtest-echarts/node_modules/echarts/lib/preprocessor/ 18.52% (10 / 54) 0% (0 / 34) 0% (0 / 8) 18.52% (10 / 54)
node-npmtest-echarts/node_modules/echarts/lib/preprocessor/helper/ 9.3% (4 / 43) 0% (0 / 34) 0% (0 / 3) 9.3% (4 / 43)
node-npmtest-echarts/node_modules/echarts/lib/processor/ 7.27% (4 / 55) 0% (0 / 28) 0% (0 / 11) 7.27% (4 / 55)
node-npmtest-echarts/node_modules/echarts/lib/scale/ 23.97% (76 / 317) 0% (0 / 121) 3.33% (2 / 60) 23.97% (76 / 317)
node-npmtest-echarts/node_modules/echarts/lib/util/ 21.23% (289 / 1361) 2.51% (22 / 875) 8.21% (16 / 195) 21.36% (289 / 1353)
node-npmtest-echarts/node_modules/echarts/lib/util/array/ 12.82% (5 / 39) 0% (0 / 8) 0% (0 / 9) 12.82% (5 / 39)
node-npmtest-echarts/node_modules/echarts/lib/view/ 55.81% (24 / 43) 0% (0 / 6) 0% (0 / 17) 55.81% (24 / 43)
node-npmtest-echarts/node_modules/echarts/lib/visual/ 18.06% (69 / 382) 0% (0 / 209) 3.26% (3 / 92) 18.06% (69 / 382)
node-npmtest-echarts/node_modules/echarts/map/js/ 50% (24 / 48) 41.18% (21 / 51) 66.67% (6 / 9) 50% (24 / 48)
node-npmtest-echarts/node_modules/echarts/src/ 5.26% (1 / 19) 0% (0 / 2) 0% (0 / 4) 5.26% (1 / 19)
node-npmtest-echarts/node_modules/echarts/src/coord/ 2.9% (2 / 69) 0% (0 / 24) 0% (0 / 15) 2.9% (2 / 69)
node-npmtest-echarts/node_modules/echarts/src/data/ 0.67% (3 / 447) 0% (0 / 222) 0% (0 / 53) 0.67% (3 / 447)
node-npmtest-echarts/node_modules/echarts/src/model/ 7.14% (4 / 56) 0% (0 / 39) 0% (0 / 15) 7.14% (4 / 56)
node-npmtest-echarts/node_modules/echarts/src/util/ 2.3% (5 / 217) 0% (0 / 154) 0% (0 / 34) 2.39% (5 / 209)
node-npmtest-echarts/node_modules/echarts/theme/ 58.68% (71 / 121) 40% (48 / 120) 68% (17 / 25) 57.63% (68 / 118)
Code coverage report for node-npmtest-echarts/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/

Statements: 100% (153 / 153)      Branches: 100% (126 / 126)      Functions: 100% (28 / 28)      Lines: 100% (153 / 153)      Ignored: 26 statements, 1 function, 30 branches     

All files » node-npmtest-echarts/
File Statements Branches Functions Lines
example.js 100% (83 / 83) 100% (73 / 73) 100% (12 / 12) 100% (83 / 83)
lib.npmtest_echarts.js 100% (16 / 16) 100% (14 / 14) 100% (3 / 3) 100% (16 / 16)
test.js 100% (54 / 54) 100% (39 / 39) 100% (13 / 13) 100% (54 / 54)
Code coverage report for node-npmtest-echarts/example.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/example.js

Statements: 100% (83 / 83)      Branches: 100% (73 / 73)      Functions: 100% (12 / 12)      Lines: 100% (83 / 83)      Ignored: 26 statements, 1 function, 30 branches     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328                                                  2   2         2   2   2 2 2         1             2       2       2   2               1 2           2     2     2 2   1       2     1 1 1   1 1     1 1   1     1   2           1   1   1         1 2 2 3 3 3 3 1     3 3         3       1 3 1       1 1               1   1 1 1   1   1                                                                                                                                                                                       1 1                       1     6 6   1   2   1   2         1 1   1         1             1     1 1     1 1   1 1 1 1 1 1 1   1 1   1        
/*
example.js
 
quickstart example
 
instruction
    1. save this script as example.js
    2. run the shell command:
        $ npm install npmtest-echarts && PORT=8081 node example.js
    3. play with the browser-demo on http://127.0.0.1:8081
*/
 
 
 
/* istanbul instrument in package npmtest_echarts */
/*jslint
    bitwise: true,
    browser: true,
    maxerr: 8,
    maxlen: 96,
    node: true,
    nomen: true,
    regexp: true,
    stupid: true
*/
(function () {
    'use strict';
    var local;
 
 
 
    // run shared js-env code - pre-init
    (function () {
        // init local
        local = {};
        // init modeJs
        local.modeJs = (function () {
            try {
                return typeof navigator.userAgent === 'string' &&
                    typeof document.querySelector('body') === 'object' &&
                    typeof XMLHttpRequest.prototype.open === 'function' &&
                    'browser';
            } catch (errorCaughtBrowser) {
                return module.exports &&
                    typeof process.versions.node === 'string' &&
                    typeof require('http').createServer === 'function' &&
                    'node';
            }
        }());
        // init global
        local.global = local.modeJs === 'browser'
            ? window
            : global;
        // init utility2_rollup
        local = local.global.utility2_rollup || (local.modeJs === 'browser'
            ? local.global.utility2_npmtest_echarts
            : global.utility2_moduleExports);
        // export local
        local.global.local = local;
    }());
    switch (local.modeJs) {
 
 
 
    // post-init
    // run browser js-env code - post-init
    /* istanbul ignore next */
    case 'browser':
        local.testRunBrowser = function (event) {
            Eif (!event || (event &&
                    event.currentTarget &&
                    event.currentTarget.className &&
                    event.currentTarget.className.includes &&
                    event.currentTarget.className.includes('onreset'))) {
                // reset output
                Array.from(
                    document.querySelectorAll('body > .resettable')
                ).forEach(function (element) {
                    switch (element.tagName) {
                    case 'INPUT':
                    case 'TEXTAREA':
                        element.value = '';
                        break;
                    default:
                        element.textContent = '';
                    }
                });
            }
            switch (event && event.currentTarget && event.currentTarget.id) {
            case 'testRunButton1':
                // show tests
                Eif (document.querySelector('#testReportDiv1').style.display === 'none') {
                    document.querySelector('#testReportDiv1').style.display = 'block';
                    document.querySelector('#testRunButton1').textContent =
                        'hide internal test';
                    local.modeTest = true;
                    local.testRunDefault(local);
                // hide tests
                } else {
                    document.querySelector('#testReportDiv1').style.display = 'none';
                    document.querySelector('#testRunButton1').textContent = 'run internal test';
                }
                break;
            // custom-case
            default:
                break;
            }
            Iif (document.querySelector('#inputTextareaEval1') && (!event || (event &&
                    event.currentTarget &&
                    event.currentTarget.className &&
                    event.currentTarget.className.includes &&
                    event.currentTarget.className.includes('oneval')))) {
                // try to eval input-code
                try {
                    /*jslint evil: true*/
                    eval(document.querySelector('#inputTextareaEval1').value);
                } catch (errorCaught) {
                    console.error(errorCaught);
                }
            }
        };
        // log stderr and stdout to #outputTextareaStdout1
        ['error', 'log'].forEach(function (key) {
            console[key + '_original'] = console[key];
            console[key] = function () {
                var element;
                console[key + '_original'].apply(console, arguments);
                element = document.querySelector('#outputTextareaStdout1');
                Iif (!element) {
                    return;
                }
                // append text to #outputTextareaStdout1
                element.value += Array.from(arguments).map(function (arg) {
                    return typeof arg === 'string'
                        ? arg
                        : JSON.stringify(arg, null, 4);
                }).join(' ') + '\n';
                // scroll textarea to bottom
                element.scrollTop = element.scrollHeight;
            };
        });
        // init event-handling
        ['change', 'click', 'keyup'].forEach(function (event) {
            Array.from(document.querySelectorAll('.on' + event)).forEach(function (element) {
                element.addEventListener(event, local.testRunBrowser);
            });
        });
        // run tests
        local.testRunBrowser();
        break;
 
 
 
    // run node js-env code - post-init
    /* istanbul ignore next */
    case 'node':
        // export local
        module.exports = local;
        // require modules
        local.fs = require('fs');
        local.http = require('http');
        local.url = require('url');
        // init assets
        local.assetsDict = local.assetsDict || {};
        /* jslint-ignore-begin */
        local.assetsDict['/assets.index.template.html'] = '\
<!doctype html>\n\
<html lang="en">\n\
<head>\n\
<meta charset="UTF-8">\n\
<meta name="viewport" content="width=device-width, initial-scale=1">\n\
<title>{{env.npm_package_name}} (v{{env.npm_package_version}})</title>\n\
<style>\n\
/*csslint\n\
    box-sizing: false,\n\
    universal-selector: false\n\
*/\n\
* {\n\
    box-sizing: border-box;\n\
}\n\
body {\n\
    background: #dde;\n\
    font-family: Arial, Helvetica, sans-serif;\n\
    margin: 2rem;\n\
}\n\
body > * {\n\
    margin-bottom: 1rem;\n\
}\n\
.utility2FooterDiv {\n\
    margin-top: 20px;\n\
    text-align: center;\n\
}\n\
</style>\n\
<style>\n\
/*csslint\n\
*/\n\
textarea {\n\
    font-family: monospace;\n\
    height: 10rem;\n\
    width: 100%;\n\
}\n\
textarea[readonly] {\n\
    background: #ddd;\n\
}\n\
</style>\n\
</head>\n\
<body>\n\
<!-- utility2-comment\n\
<div id="ajaxProgressDiv1" style="background: #d00; height: 2px; left: 0; margin: 0; padding: 0; position: fixed; top: 0; transition: background 0.5s, width 1.5s; width: 25%;"></div>\n\
utility2-comment -->\n\
<h1>\n\
<!-- utility2-comment\n\
    <a\n\
        {{#if env.npm_package_homepage}}\n\
        href="{{env.npm_package_homepage}}"\n\
        {{/if env.npm_package_homepage}}\n\
        target="_blank"\n\
    >\n\
utility2-comment -->\n\
        {{env.npm_package_name}} (v{{env.npm_package_version}})\n\
<!-- utility2-comment\n\
    </a>\n\
utility2-comment -->\n\
</h1>\n\
<h3>{{env.npm_package_description}}</h3>\n\
<!-- utility2-comment\n\
<h4><a download href="assets.app.js">download standalone app</a></h4>\n\
<button class="onclick onreset" id="testRunButton1">run internal test</button><br>\n\
<div id="testReportDiv1" style="display: none;"></div>\n\
utility2-comment -->\n\
\n\
\n\
\n\
<label>stderr and stdout</label>\n\
<textarea class="resettable" id="outputTextareaStdout1" readonly></textarea>\n\
<!-- utility2-comment\n\
{{#if isRollup}}\n\
<script src="assets.app.js"></script>\n\
{{#unless isRollup}}\n\
utility2-comment -->\n\
<script src="assets.utility2.rollup.js"></script>\n\
<script src="jsonp.utility2._stateInit?callback=window.utility2._stateInit"></script>\n\
<script src="assets.npmtest_echarts.rollup.js"></script>\n\
<script src="assets.example.js"></script>\n\
<script src="assets.test.js"></script>\n\
<!-- utility2-comment\n\
{{/if isRollup}}\n\
utility2-comment -->\n\
<div class="utility2FooterDiv">\n\
    [ this app was created with\n\
    <a href="https://github.com/kaizhu256/node-utility2" target="_blank">utility2</a>\n\
    ]\n\
</div>\n\
</body>\n\
</html>\n\
';
        /* jslint-ignore-end */
        Iif (local.templateRender) {
            local.assetsDict['/'] = local.templateRender(
                local.assetsDict['/assets.index.template.html'],
                {
                    env: local.objectSetDefault(local.env, {
                        npm_package_description: 'the greatest app in the world!',
                        npm_package_name: 'my-app',
                        npm_package_nameAlias: 'my_app',
                        npm_package_version: '0.0.1'
                    })
                }
            );
        } else {
            local.assetsDict['/'] = local.assetsDict['/assets.index.template.html']
                .replace((/\{\{env\.(\w+?)\}\}/g), function (match0, match1) {
                    // jslint-hack
                    String(match0);
                    switch (match1) {
                    case 'npm_package_description':
                        return 'the greatest app in the world!';
                    case 'npm_package_name':
                        return 'my-app';
                    case 'npm_package_nameAlias':
                        return 'my_app';
                    case 'npm_package_version':
                        return '0.0.1';
                    }
                });
        }
        // run the cli
        Eif (local.global.utility2_rollup || module !== require.main) {
            break;
        }
        local.assetsDict['/assets.example.js'] =
            local.assetsDict['/assets.example.js'] ||
            local.fs.readFileSync(__filename, 'utf8');
        // bug-workaround - long $npm_package_buildCustomOrg
        /* jslint-ignore-begin */
        local.assetsDict['/assets.npmtest_echarts.rollup.js'] =
            local.assetsDict['/assets.npmtest_echarts.rollup.js'] ||
            local.fs.readFileSync(
                local.npmtest_echarts.__dirname + '/lib.npmtest_echarts.js',
                'utf8'
            ).replace((/^#!/), '//');
        /* jslint-ignore-end */
        local.assetsDict['/favicon.ico'] = local.assetsDict['/favicon.ico'] || '';
        // if $npm_config_timeout_exit exists,
        // then exit this process after $npm_config_timeout_exit ms
        if (Number(process.env.npm_config_timeout_exit)) {
            setTimeout(process.exit, Number(process.env.npm_config_timeout_exit));
        }
        // start server
        if (local.global.utility2_serverHttp1) {
            break;
        }
        process.env.PORT = process.env.PORT || '8081';
        console.error('server starting on port ' + process.env.PORT);
        local.http.createServer(function (request, response) {
            request.urlParsed = local.url.parse(request.url);
            if (local.assetsDict[request.urlParsed.pathname] !== undefined) {
                response.end(local.assetsDict[request.urlParsed.pathname]);
                return;
            }
            response.statusCode = 404;
            response.end();
        }).listen(process.env.PORT);
        break;
    }
}());
 
 
Code coverage report for node-npmtest-echarts/lib.npmtest_echarts.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/lib.npmtest_echarts.js

Statements: 100% (16 / 16)      Branches: 100% (14 / 14)      Functions: 100% (3 / 3)      Lines: 100% (16 / 16)      Ignored: none     

All files » node-npmtest-echarts/ » lib.npmtest_echarts.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55                      2   2         2   2   2 2 2         1             2       2   2   2 1   1 1 1          
/* istanbul instrument in package npmtest_echarts */
/*jslint
    bitwise: true,
    browser: true,
    maxerr: 8,
    maxlen: 96,
    node: true,
    nomen: true,
    regexp: true,
    stupid: true
*/
(function () {
    'use strict';
    var local;
 
 
 
    // run shared js-env code - pre-init
    (function () {
        // init local
        local = {};
        // init modeJs
        local.modeJs = (function () {
            try {
                return typeof navigator.userAgent === 'string' &&
                    typeof document.querySelector('body') === 'object' &&
                    typeof XMLHttpRequest.prototype.open === 'function' &&
                    'browser';
            } catch (errorCaughtBrowser) {
                return module.exports &&
                    typeof process.versions.node === 'string' &&
                    typeof require('http').createServer === 'function' &&
                    'node';
            }
        }());
        // init global
        local.global = local.modeJs === 'browser'
            ? window
            : global;
        // init utility2_rollup
        local = local.global.utility2_rollup || local;
        // init lib
        local.local = local.npmtest_echarts = local;
        // init exports
        if (local.modeJs === 'browser') {
            local.global.utility2_npmtest_echarts = local;
        } else {
            module.exports = local;
            module.exports.__dirname = __dirname;
            module.exports.module = module;
        }
    }());
}());
 
 
Code coverage report for node-npmtest-echarts/test.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/test.js

Statements: 100% (54 / 54)      Branches: 100% (39 / 39)      Functions: 100% (13 / 13)      Lines: 100% (54 / 54)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197                      2   2         2   2   2 2 2         1             2     2     1       1     1   1     2           2 2   2           1           1           2 2   2           1             1       1     1             1             1 1     1             1 1 1 1 1 1     1         2 2     1             2 2     1             2 2     1             2 2     1             1 1       1 1        
/* istanbul instrument in package npmtest_echarts */
/*jslint
    bitwise: true,
    browser: true,
    maxerr: 8,
    maxlen: 96,
    node: true,
    nomen: true,
    regexp: true,
    stupid: true
*/
(function () {
    'use strict';
    var local;
 
 
 
    // run shared js-env code - pre-init
    (function () {
        // init local
        local = {};
        // init modeJs
        local.modeJs = (function () {
            try {
                return typeof navigator.userAgent === 'string' &&
                    typeof document.querySelector('body') === 'object' &&
                    typeof XMLHttpRequest.prototype.open === 'function' &&
                    'browser';
            } catch (errorCaughtBrowser) {
                return module.exports &&
                    typeof process.versions.node === 'string' &&
                    typeof require('http').createServer === 'function' &&
                    'node';
            }
        }());
        // init global
        local.global = local.modeJs === 'browser'
            ? window
            : global;
        switch (local.modeJs) {
        // re-init local from window.local
        case 'browser':
            local = local.global.utility2.objectSetDefault(
                local.global.utility2_rollup || local.global.local,
                local.global.utility2
            );
            break;
        // re-init local from example.js
        case 'node':
            local = (local.global.utility2_rollup || require('utility2'))
                .requireExampleJsFromReadme();
            break;
        }
        // export local
        local.global.local = local;
    }());
 
 
 
    // run shared js-env code - function
    (function () {
        return;
    }());
    switch (local.modeJs) {
 
 
 
    // run browser js-env code - function
    case 'browser':
        break;
 
 
 
    // run node js-env code - function
    case 'node':
        break;
    }
 
 
 
    // run shared js-env code - post-init
    (function () {
        return;
    }());
    switch (local.modeJs) {
 
 
 
    // run browser js-env code - post-init
    case 'browser':
        local.testCase_browser_nullCase = local.testCase_browser_nullCase || function (
            options,
            onError
        ) {
        /*
         * this function will test browsers's null-case handling-behavior-behavior
         */
            onError(null, options);
        };
 
        // run tests
        local.nop(local.modeTest &&
            document.querySelector('#testRunButton1') &&
            document.querySelector('#testRunButton1').click());
        break;
 
 
 
    // run node js-env code - post-init
    /* istanbul ignore next */
    case 'node':
        local.testCase_buildApidoc_default = local.testCase_buildApidoc_default || function (
            options,
            onError
        ) {
        /*
         * this function will test buildApidoc's default handling-behavior-behavior
         */
            options = { modulePathList: module.paths };
            local.buildApidoc(options, onError);
        };
 
        local.testCase_buildApp_default = local.testCase_buildApp_default || function (
            options,
            onError
        ) {
        /*
         * this function will test buildApp's default handling-behavior-behavior
         */
            local.testCase_buildReadme_default(options, local.onErrorThrow);
            local.testCase_buildLib_default(options, local.onErrorThrow);
            local.testCase_buildTest_default(options, local.onErrorThrow);
            local.testCase_buildCustomOrg_default(options, local.onErrorThrow);
            options = [];
            local.buildApp(options, onError);
        };
 
        local.testCase_buildCustomOrg_default = local.testCase_buildCustomOrg_default ||
            function (options, onError) {
            /*
             * this function will test buildCustomOrg's default handling-behavior
             */
                options = {};
                local.buildCustomOrg(options, onError);
            };
 
        local.testCase_buildLib_default = local.testCase_buildLib_default || function (
            options,
            onError
        ) {
        /*
         * this function will test buildLib's default handling-behavior
         */
            options = {};
            local.buildLib(options, onError);
        };
 
        local.testCase_buildReadme_default = local.testCase_buildReadme_default || function (
            options,
            onError
        ) {
        /*
         * this function will test buildReadme's default handling-behavior-behavior
         */
            options = {};
            local.buildReadme(options, onError);
        };
 
        local.testCase_buildTest_default = local.testCase_buildTest_default || function (
            options,
            onError
        ) {
        /*
         * this function will test buildTest's default handling-behavior
         */
            options = {};
            local.buildTest(options, onError);
        };
 
        local.testCase_webpage_default = local.testCase_webpage_default || function (
            options,
            onError
        ) {
        /*
         * this function will test webpage's default handling-behavior
         */
            options = { modeCoverageMerge: true, url: local.serverLocalHost + '?modeTest=1' };
            local.browserTest(options, onError);
        };
 
        // run test-server
        local.testRunServer(local);
        break;
    }
}());
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/

Statements: 97.67% (42 / 43)      Branches: 0% (0 / 4)      Functions: 100% (0 / 0)      Lines: 97.67% (42 / 43)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/
File Statements Branches Functions Lines
index.js 100% (40 / 40) 100% (0 / 0) 100% (0 / 0) 100% (40 / 40)
webpack.config.js 66.67% (2 / 3) 0% (0 / 4) 100% (0 / 0) 66.67% (2 / 3)
Code coverage report for node-npmtest-echarts/node_modules/echarts/index.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/index.js

Statements: 100% (40 / 40)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (40 / 40)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54      1     1 1 1 1 1   1 1 1 1 1 1 1 1 1 1 1 1 1 1   1 1 1 1 1 1 1 1 1 1 1   1   1 1   1 1 1   1 1   1    
/**
 * Export echarts as CommonJS module
 */
module.exports = require('./lib/echarts');
 
// Import all charts and components
require('./lib/chart/line');
require('./lib/chart/bar');
require('./lib/chart/pie');
require('./lib/chart/scatter');
require('./lib/chart/radar');
 
require('./lib/chart/map');
require('./lib/chart/treemap');
require('./lib/chart/graph');
require('./lib/chart/gauge');
require('./lib/chart/funnel');
require('./lib/chart/parallel');
require('./lib/chart/sankey');
require('./lib/chart/boxplot');
require('./lib/chart/candlestick');
require('./lib/chart/effectScatter');
require('./lib/chart/lines');
require('./lib/chart/heatmap');
require('./lib/chart/pictorialBar');
require('./lib/chart/themeRiver');
 
require('./lib/component/graphic');
require('./lib/component/grid');
require('./lib/component/legend');
require('./lib/component/tooltip');
require('./lib/component/axisPointer');
require('./lib/component/polar');
require('./lib/component/geo');
require('./lib/component/parallel');
require('./lib/component/singleAxis');
require('./lib/component/brush');
require('./lib/component/calendar');
 
require('./lib/component/title');
 
require('./lib/component/dataZoom');
require('./lib/component/visualMap');
 
require('./lib/component/markPoint');
require('./lib/component/markLine');
require('./lib/component/markArea');
 
require('./lib/component/timeline');
require('./lib/component/toolbox');
 
require('zrender/lib/vml/vml');
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/webpack.config.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/webpack.config.js

Statements: 66.67% (2 / 3)      Branches: 0% (0 / 4)      Functions: 100% (0 / 0)      Lines: 66.67% (2 / 3)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 232 2                                          
var PROD = process.argv.indexOf('-p') >= 0;
var webpack = require('webpack');
 
module.exports = {
    plugins: [
        new webpack.DefinePlugin({
            'typeof __DEV__': JSON.stringify('boolean'),
            __DEV__: PROD ? false : true
        })
    ],
    entry: {
        'echarts': __dirname + '/index.js',
        'echarts.simple': __dirname + '/index.simple.js',
        'echarts.common': __dirname + '/index.common.js'
    },
    output: {
        libraryTarget: 'umd',
        library: 'echarts',
        path: __dirname + '/dist',
        filename: PROD ? '[name].min.js' : '[name].js'
    }
};
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/

Statements: 50% (1 / 2)      Branches: 100% (0 / 0)      Functions: 0% (0 / 1)      Lines: 100% (1 / 1)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/extension/
File Statements Branches Functions Lines
echarts.js 50% (1 / 2) 100% (0 / 0) 0% (0 / 1) 100% (1 / 1)
Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/echarts.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/echarts.js

Statements: 50% (1 / 2)      Branches: 100% (0 / 0)      Functions: 0% (0 / 1)      Lines: 100% (1 / 1)      Ignored: none     

1 22  
define('echarts', [], function () {return echarts;});
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/bmap/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/bmap/

Statements: 6.25% (9 / 144)      Branches: 0% (0 / 46)      Functions: 0% (0 / 29)      Lines: 6.25% (9 / 144)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/extension/bmap/
File Statements Branches Functions Lines
BMapCoordSys.js 5% (4 / 80) 0% (0 / 18) 0% (0 / 17) 5% (4 / 80)
BMapModel.js 22.22% (2 / 9) 0% (0 / 6) 0% (0 / 5) 22.22% (2 / 9)
BMapView.js 4.44% (2 / 45) 0% (0 / 22) 0% (0 / 4) 4.44% (2 / 45)
bmap.js 10% (1 / 10) 100% (0 / 0) 0% (0 / 3) 10% (1 / 10)
Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/bmap/BMapCoordSys.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/bmap/BMapCoordSys.js

Statements: 5% (4 / 80)      Branches: 0% (0 / 18)      Functions: 0% (0 / 17)      Lines: 5% (4 / 80)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 1592       1                                                                                                                                       1 1                                                                                                                                                                          
define(function (require) {
 
    var echarts = require('echarts');
 
    function BMapCoordSys(bmap, api) {
        this._bmap = bmap;
        this.dimensions = ['lng', 'lat'];
        this._mapOffset = [0, 0];
 
        this._api = api;
 
        this._projection = new BMap.MercatorProjection();
    }
 
    BMapCoordSys.prototype.dimensions = ['lng', 'lat'];
 
    BMapCoordSys.prototype.setZoom = function (zoom) {
        this._zoom = zoom;
    };
 
    BMapCoordSys.prototype.setCenter = function (center) {
        this._center = this._projection.lngLatToPoint(new BMap.Point(center[0], center[1]));
    };
 
    BMapCoordSys.prototype.setMapOffset = function (mapOffset) {
        this._mapOffset = mapOffset;
    };
 
    BMapCoordSys.prototype.getBMap = function () {
        return this._bmap;
    };
 
    BMapCoordSys.prototype.dataToPoint = function (data) {
        var point = new BMap.Point(data[0], data[1]);
        // TODO mercator projection is toooooooo slow
        // var mercatorPoint = this._projection.lngLatToPoint(point);
 
        // var width = this._api.getZr().getWidth();
        // var height = this._api.getZr().getHeight();
        // var divider = Math.pow(2, 18 - 10);
        // return [
        //     Math.round((mercatorPoint.x - this._center.x) / divider + width / 2),
        //     Math.round((this._center.y - mercatorPoint.y) / divider + height / 2)
        // ];
        var px = this._bmap.pointToOverlayPixel(point);
        var mapOffset = this._mapOffset;
        return [px.x - mapOffset[0], px.y - mapOffset[1]];
    };
 
    BMapCoordSys.prototype.pointToData = function (pt) {
        var mapOffset = this._mapOffset;
        var pt = this._bmap.overlayPixelToPoint({
            x: pt[0] + mapOffset[0],
            y: pt[1] + mapOffset[1]
        });
        return [pt.lng, pt.lat];
    };
 
    BMapCoordSys.prototype.getViewRect = function () {
        var api = this._api;
        return new echarts.graphic.BoundingRect(0, 0, api.getWidth(), api.getHeight());
    };
 
    BMapCoordSys.prototype.getRoamTransform = function () {
        return echarts.matrix.create();
    };
 
    var Overlay;
 
    // For deciding which dimensions to use when creating list data
    BMapCoordSys.dimensions = BMapCoordSys.prototype.dimensions;
 
    function createOverlayCtor() {
        function Overlay(root) {
            this._root = root;
        }
 
        Overlay.prototype = new BMap.Overlay();
        /**
         * 初始化
         *
         * @param {BMap.Map} map
         * @override
         */
        Overlay.prototype.initialize = function (map) {
            map.getPanes().labelPane.appendChild(this._root);
            return this._root;
        };
        /**
         * @override
         */
        Overlay.prototype.draw = function () {};
 
        return Overlay;
    }
 
    BMapCoordSys.create = function (ecModel, api) {
        var bmapCoordSys;
        var root = api.getDom();
 
        // TODO Dispose
        ecModel.eachComponent('bmap', function (bmapModel) {
            var viewportRoot = api.getZr().painter.getViewportRoot();
            if (typeof BMap === 'undefined') {
                throw new Error('BMap api is not loaded');
            }
            Overlay = Overlay || createOverlayCtor();
            if (bmapCoordSys) {
                throw new Error('Only one bmap component can exist');
            }
            if (!bmapModel.__bmap) {
                // Not support IE8
                var bmapRoot = root.querySelector('.ec-extension-bmap');
                if (bmapRoot) {
                    // Reset viewport left and top, which will be changed
                    // in moving handler in BMapView
                    viewportRoot.style.left = '0px';
                    viewportRoot.style.top = '0px';
                    root.removeChild(bmapRoot);
                }
                bmapRoot = document.createElement('div');
                bmapRoot.style.cssText = 'width:100%;height:100%';
                // Not support IE8
                bmapRoot.classList.add('ec-extension-bmap');
                root.appendChild(bmapRoot);
                var bmap = bmapModel.__bmap = new BMap.Map(bmapRoot);
 
                var overlay = new Overlay(viewportRoot);
                bmap.addOverlay(overlay);
            }
            var bmap = bmapModel.__bmap;
 
            // Set bmap options
            // centerAndZoom before layout and render
            var center = bmapModel.get('center');
            var zoom = bmapModel.get('zoom');
            if (center && zoom) {
                var pt = new BMap.Point(center[0], center[1]);
                bmap.centerAndZoom(pt, zoom);
            }
 
            bmapCoordSys = new BMapCoordSys(bmap, api);
            bmapCoordSys.setMapOffset(bmapModel.__mapOffset || [0, 0]);
            bmapCoordSys.setZoom(zoom);
            bmapCoordSys.setCenter(center);
 
            bmapModel.coordinateSystem = bmapCoordSys;
        });
 
        ecModel.eachSeries(function (seriesModel) {
            if (seriesModel.get('coordinateSystem') === 'bmap') {
                seriesModel.coordinateSystem = bmapCoordSys;
            }
        });
    };
 
    return BMapCoordSys;
});
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/bmap/BMapModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/bmap/BMapModel.js

Statements: 22.22% (2 / 9)      Branches: 0% (0 / 6)      Functions: 0% (0 / 5)      Lines: 22.22% (2 / 9)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 372   1                                                                    
define(function (require) {
 
    function v2Equal(a, b) {
        return a && b && a[0] === b[0] && a[1] === b[1];
    }
 
    return require('echarts').extendComponentModel({
        type: 'bmap',
 
        getBMap: function () {
            // __bmap is injected when creating BMapCoordSys
            return this.__bmap;
        },
 
        setCenterAndZoom: function (center, zoom) {
            this.option.center = center;
            this.option.zoom = zoom;
        },
 
        centerOrZoomChanged: function (center, zoom) {
            var option = this.option;
            return !(v2Equal(center, option.center) && zoom === option.zoom);
        },
 
        defaultOption: {
 
            center: [104.114129, 37.550339],
 
            zoom: 5,
 
            mapStyle: {},
 
            roam: false
        }
    });
});
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/bmap/BMapView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/bmap/BMapView.js

Statements: 4.44% (2 / 45)      Branches: 0% (0 / 22)      Functions: 0% (0 / 4)      Lines: 4.44% (2 / 45)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 882                                                             1                                                                                                                
define(function (require) {
 
    return require('echarts').extendComponentView({
        type: 'bmap',
 
        render: function (bMapModel, ecModel, api) {
            var rendering = true;
 
            var bmap = bMapModel.getBMap();
            var viewportRoot = api.getZr().painter.getViewportRoot();
            var coordSys = bMapModel.coordinateSystem;
            var moveHandler = function (type, target) {
                if (rendering) {
                    return;
                }
                var offsetEl = viewportRoot.parentNode.parentNode.parentNode;
                var mapOffset = [
                    -parseInt(offsetEl.style.left, 10) || 0,
                    -parseInt(offsetEl.style.top, 10) || 0
                ];
                viewportRoot.style.left = mapOffset[0] + 'px';
                viewportRoot.style.top = mapOffset[1] + 'px';
 
                coordSys.setMapOffset(mapOffset);
                bMapModel.__mapOffset = mapOffset;
 
                api.dispatchAction({
                    type: 'bmapRoam'
                });
            };
 
            function zoomEndHandler() {
                if (rendering) {
                    return;
                }
                api.dispatchAction({
                    type: 'bmapRoam'
                });
            }
 
            bmap.removeEventListener('moving', this._oldMoveHandler);
            // FIXME
            // Moveend may be triggered by centerAndZoom method when creating coordSys next time
            // bmap.removeEventListener('moveend', this._oldMoveHandler);
            bmap.removeEventListener('zoomend', this._oldZoomEndHandler);
            bmap.addEventListener('moving', moveHandler);
            // bmap.addEventListener('moveend', moveHandler);
            bmap.addEventListener('zoomend', zoomEndHandler);
 
            this._oldMoveHandler = moveHandler;
            this._oldZoomEndHandler = zoomEndHandler;
 
            var roam = bMapModel.get('roam');
            if (roam && roam !== 'scale') {
                bmap.enableDragging();
            }
            else {
                bmap.disableDragging();
            }
            if (roam && roam !== 'move') {
                bmap.enableScrollWheelZoom();
                bmap.enableDoubleClickZoom();
                bmap.enablePinchToZoom();
            }
            else {
                bmap.disableScrollWheelZoom();
                bmap.disableDoubleClickZoom();
                bmap.disablePinchToZoom();
            }
 
            var originalStyle = bMapModel.__mapStyle;
 
            var newMapStyle = bMapModel.get('mapStyle') || {};
            // FIXME, Not use JSON methods
            var mapStyleStr = JSON.stringify(newMapStyle);
            if (JSON.stringify(originalStyle) !== mapStyleStr) {
                // FIXME May have blank tile when dragging if setMapStyle
                if (Object.keys(newMapStyle).length) {
                    bmap.setMapStyle(newMapStyle);
                }
                bMapModel.__mapStyle = JSON.parse(mapStyleStr);
            }
 
            rendering = false;
        }
    });
});
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/bmap/bmap.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/bmap/bmap.js

Statements: 10% (1 / 10)      Branches: 100% (0 / 0)      Functions: 0% (0 / 3)      Lines: 10% (1 / 10)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29      2                                                  
/**
 * BMap component extension
 */
define(function (require) {
 
    require('echarts').registerCoordinateSystem(
        'bmap', require('./BMapCoordSys')
    );
    require('./BMapModel');
    require('./BMapView');
 
    // Action
    require('echarts').registerAction({
        type: 'bmapRoam',
        event: 'bmapRoam',
        update: 'updateLayout'
    }, function (payload, ecModel) {
        ecModel.eachComponent('bmap', function (bMapModel) {
            var bmap = bMapModel.getBMap();
            var center = bmap.getCenter();
            bMapModel.setCenterAndZoom([center.lng, center.lat], bmap.getZoom());
        });
    });
 
    return {
        version: '1.0.0'
    };
});
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/dataTool/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/dataTool/

Statements: 8.4% (10 / 119)      Branches: 0% (0 / 58)      Functions: 0% (0 / 15)      Lines: 8.4% (10 / 119)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/extension/dataTool/
File Statements Branches Functions Lines
gexf.js 8.99% (8 / 89) 0% (0 / 40) 0% (0 / 11) 8.99% (8 / 89)
prepareBoxplotData.js 3.85% (1 / 26) 0% (0 / 16) 0% (0 / 2) 3.85% (1 / 26)
quantile.js 25% (1 / 4) 0% (0 / 2) 0% (0 / 2) 25% (1 / 4)
Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/dataTool/gexf.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/dataTool/gexf.js

Statements: 8.99% (8 / 89)      Branches: 0% (0 / 40)      Functions: 0% (0 / 11)      Lines: 8.99% (8 / 89)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205    2         1                                                                 1                   1                                                                                                                                                   1                                                                                   1       1                                 1                                  
// GEXF File Parser
// http://gexf.net/1.2draft/gexf-12draft-primer.pdf
define(function (require) {
 
    'use strict';
    var zrUtil = require('echarts').util;
 
    function parse(xml) {
        var doc;
        if (typeof xml === 'string') {
            var parser = new DOMParser();
            doc = parser.parseFromString(xml, 'text/xml');
        }
        else {
            doc = xml;
        }
        if (!doc || doc.getElementsByTagName('parsererror').length) {
            return null;
        }
 
        var gexfRoot = getChildByTagName(doc, 'gexf');
 
        if (!gexfRoot) {
            return null;
        }
 
        var graphRoot = getChildByTagName(gexfRoot, 'graph');
 
        var attributes = parseAttributes(getChildByTagName(graphRoot, 'attributes'));
        var attributesMap = {};
        for (var i = 0; i < attributes.length; i++) {
            attributesMap[attributes[i].id] = attributes[i];
        }
 
        return {
            nodes: parseNodes(getChildByTagName(graphRoot, 'nodes'), attributesMap),
            links: parseEdges(getChildByTagName(graphRoot, 'edges'))
        };
    }
 
    function parseAttributes(parent) {
        return parent ? zrUtil.map(getChildrenByTagName(parent, 'attribute'), function (attribDom) {
            return {
                id: getAttr(attribDom, 'id'),
                title: getAttr(attribDom, 'title'),
                type: getAttr(attribDom, 'type')
            };
        }) : [];
    }
 
    function parseNodes(parent, attributesMap) {
        return parent ? zrUtil.map(getChildrenByTagName(parent, 'node'), function (nodeDom) {
 
            var id = getAttr(nodeDom, 'id');
            var label = getAttr(nodeDom, 'label');
 
            var node = {
                id: id,
                name: label,
                itemStyle: {
                    normal: {}
                }
            };
 
            var vizSizeDom = getChildByTagName(nodeDom, 'viz:size');
            var vizPosDom = getChildByTagName(nodeDom, 'viz:position');
            var vizColorDom = getChildByTagName(nodeDom, 'viz:color');
            // var vizShapeDom = getChildByTagName(nodeDom, 'viz:shape');
 
            var attvaluesDom = getChildByTagName(nodeDom, 'attvalues');
 
            if (vizSizeDom) {
                node.symbolSize = parseFloat(getAttr(vizSizeDom, 'value'));
            }
            if (vizPosDom) {
                node.x = parseFloat(getAttr(vizPosDom, 'x'));
                node.y = parseFloat(getAttr(vizPosDom, 'y'));
                // z
            }
            if (vizColorDom) {
                node.itemStyle.normal.color = 'rgb(' +[
                    getAttr(vizColorDom, 'r') | 0,
                    getAttr(vizColorDom, 'g') | 0,
                    getAttr(vizColorDom, 'b') | 0
                ].join(',') + ')';
            }
            // if (vizShapeDom) {
                // node.shape = getAttr(vizShapeDom, 'shape');
            // }
            if (attvaluesDom) {
                var attvalueDomList = getChildrenByTagName(attvaluesDom, 'attvalue');
 
                node.attributes = {};
 
                for (var j = 0; j < attvalueDomList.length; j++) {
                    var attvalueDom = attvalueDomList[j];
                    var attId = getAttr(attvalueDom, 'for');
                    var attValue = getAttr(attvalueDom, 'value');
                    var attribute = attributesMap[attId];
 
                    if (attribute) {
                        switch (attribute.type) {
                            case 'integer':
                            case 'long':
                                attValue = parseInt(attValue, 10);
                                break;
                            case 'float':
                            case 'double':
                                attValue = parseFloat(attValue);
                                break;
                            case 'boolean':
                                attValue = attValue.toLowerCase() == 'true';
                                break;
                            default:
                        }
                        node.attributes[attId] = attValue;
                    }
                }
            }
 
            return node;
        }) : [];
    }
 
    function parseEdges(parent) {
        return parent ? zrUtil.map(getChildrenByTagName(parent, 'edge'), function (edgeDom) {
            var id = getAttr(edgeDom, 'id');
            var label = getAttr(edgeDom, 'label');
 
            var sourceId = getAttr(edgeDom, 'source');
            var targetId = getAttr(edgeDom, 'target');
 
            var edge = {
                id: id,
                name: label,
                source: sourceId,
                target: targetId,
                lineStyle: {
                    normal: {}
                }
            };
 
            var lineStyle = edge.lineStyle.normal;
 
            var vizThicknessDom = getChildByTagName(edgeDom, 'viz:thickness');
            var vizColorDom = getChildByTagName(edgeDom, 'viz:color');
            // var vizShapeDom = getChildByTagName(edgeDom, 'viz:shape');
 
            if (vizThicknessDom) {
                lineStyle.width = parseFloat(vizThicknessDom.getAttribute('value'));
            }
            if (vizColorDom) {
                lineStyle.color = 'rgb(' + [
                    getAttr(vizColorDom, 'r') | 0,
                    getAttr(vizColorDom, 'g') | 0,
                    getAttr(vizColorDom, 'b') | 0
                ].join(',') + ')';
            }
            // if (vizShapeDom) {
            //     edge.shape = vizShapeDom.getAttribute('shape');
            // }
 
            return edge;
        }) : [];
    }
 
    function getAttr(el, attrName) {
        return el.getAttribute(attrName);
    }
 
    function getChildByTagName (parent, tagName) {
        var node = parent.firstChild;
 
        while (node) {
            if (
                node.nodeType != 1 ||
                node.nodeName.toLowerCase() != tagName.toLowerCase()
            ) {
                node = node.nextSibling;
            } else {
                return node;
            }
        }
 
        return null;
    }
 
    function getChildrenByTagName (parent, tagName) {
        var node = parent.firstChild;
        var children = [];
        while (node) {
            if (node.nodeName.toLowerCase() == tagName.toLowerCase()) {
                children.push(node);
            }
            node = node.nextSibling;
        }
 
        return children;
    }
 
    return {
        parse: parse
    };
});
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/dataTool/prepareBoxplotData.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/dataTool/prepareBoxplotData.js

Statements: 3.85% (1 / 26)      Branches: 0% (0 / 16)      Functions: 0% (0 / 2)      Lines: 3.85% (1 / 26)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 642                                                                                                                              
define(function (require) {
 
    var quantile = require('./quantile');
    var numberUtil = require('echarts').number;
 
    /**
     * Helper method for preparing data.
     * @param {Array.<number>} rawData like
     *        [
     *            [12,232,443], (raw data set for the first box)
     *            [3843,5545,1232], (raw datat set for the second box)
     *            ...
     *        ]
     * @param {Object} [opt]
     *
     * @param {(number|string)} [opt.boundIQR=1.5] Data less than min bound is outlier.
     *                          default 1.5, means Q1 - 1.5 * (Q3 - Q1).
     *                          If pass 'none', min bound will not be used.
     * @param {(number|string)} [opt.layout='horizontal']
     *                          Box plot layout, can be 'horizontal' or 'vertical'
     */
    return function (rawData, opt) {
        opt = opt || [];
        var boxData = [];
        var outliers = [];
        var axisData = [];
        var boundIQR = opt.boundIQR;
 
        for (var i = 0; i < rawData.length; i++) {
            axisData.push(i + '');
            var ascList = numberUtil.asc(rawData[i].slice());
 
            var Q1 = quantile(ascList, 0.25);
            var Q2 = quantile(ascList, 0.5);
            var Q3 = quantile(ascList, 0.75);
            var IQR = Q3 - Q1;
 
            var low = boundIQR === 'none'
                ? ascList[0]
                : Q1 - (boundIQR == null ? 1.5 : boundIQR) * IQR;
            var high = boundIQR === 'none'
                ? ascList[ascList.length - 1]
                : Q3 + (boundIQR == null ? 1.5 : boundIQR) * IQR;
 
            boxData.push([low, Q1, Q2, Q3, high]);
 
            for (var j = 0; j < ascList.length; j++) {
                var dataItem = ascList[j];
                if (dataItem < low || dataItem > high) {
                    var outlier = [i, dataItem];
                    opt.layout === 'vertical' && outlier.reverse();
                    outliers.push(outlier);
                }
            }
        }
        return {
            boxData: boxData,
            outliers: outliers,
            axisData: axisData
        };
    };
 
});
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/dataTool/quantile.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/extension/dataTool/quantile.js

Statements: 25% (1 / 4)      Branches: 0% (0 / 2)      Functions: 0% (0 / 2)      Lines: 25% (1 / 4)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45                                                        2                                
/**
 * Copyright (c) 2010-2015, Michael Bostock
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * * Redistributions of source code must retain the above copyright notice, this
 *   list of conditions and the following disclaimer.
 *
 * * Redistributions in binary form must reproduce the above copyright notice,
 *   this list of conditions and the following disclaimer in the documentation
 *   and/or other materials provided with the distribution.
 *
 * * The name Michael Bostock may not be used to endorse or promote products
 *   derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
define(function (require) {
 
    /**
     * @see <https://github.com/mbostock/d3/blob/master/src/arrays/quantile.js>
     * @see <http://en.wikipedia.org/wiki/Quantile>
     * @param {Array.<number>} ascArr
     */
    return function(ascArr, p) {
        var H = (ascArr.length - 1) * p + 1,
            h = Math.floor(H),
            v = +ascArr[h - 1],
            e = H - h;
        return e ? v + e * (ascArr[h] - v) : v;
    };
 
});
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/

Statements: 26.58% (210 / 790)      Branches: 6.93% (26 / 375)      Functions: 10.95% (15 / 137)      Lines: 26.58% (210 / 790)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/
File Statements Branches Functions Lines
CoordinateSystem.js 44.44% (8 / 18) 0% (0 / 4) 12.5% (1 / 8) 44.44% (8 / 18)
ExtensionAPI.js 66.67% (4 / 6) 100% (0 / 0) 0% (0 / 2) 66.67% (4 / 6)
echarts.js 25.53% (191 / 748) 7.05% (26 / 369) 11.29% (14 / 124) 25.53% (191 / 748)
helper.js 38.89% (7 / 18) 0% (0 / 2) 0% (0 / 3) 38.89% (7 / 18)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/CoordinateSystem.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/CoordinateSystem.js

Statements: 44.44% (8 / 18)      Branches: 0% (0 / 4)      Functions: 12.5% (1 / 8)      Lines: 44.44% (8 / 18)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49      1   1   1         1                                                   1 8     1       1    
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    var coordinateSystemCreators = {};
 
    function CoordinateSystemManager() {
 
        this._coordinateSystems = [];
    }
 
    CoordinateSystemManager.prototype = {
 
        constructor: CoordinateSystemManager,
 
        create: function (ecModel, api) {
            var coordinateSystems = [];
            zrUtil.each(coordinateSystemCreators, function (creater, type) {
                var list = creater.create(ecModel, api);
                coordinateSystems = coordinateSystems.concat(list || []);
            });
 
            this._coordinateSystems = coordinateSystems;
        },
 
        update: function (ecModel, api) {
            zrUtil.each(this._coordinateSystems, function (coordSys) {
                // FIXME MUST have
                coordSys.update && coordSys.update(ecModel, api);
            });
        },
 
        getCoordinateSystems: function () {
            return this._coordinateSystems.slice();
        }
    };
 
    CoordinateSystemManager.register = function (type, coordinateSystemCreator) {
        coordinateSystemCreators[type] = coordinateSystemCreator;
    };
 
    CoordinateSystemManager.get = function (type) {
        return coordinateSystemCreators[type];
    };
 
    module.exports = CoordinateSystemManager;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/ExtensionAPI.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/ExtensionAPI.js

Statements: 66.67% (4 / 6)      Branches: 100% (0 / 0)      Functions: 0% (0 / 2)      Lines: 66.67% (4 / 6)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21      1   1             1           1    
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    var echartsAPIList = [
        'getDom', 'getZr', 'getWidth', 'getHeight', 'getDevicePixelRatio', 'dispatchAction', 'isDisposed',
        'on', 'off', 'getDataURL', 'getConnectedDataURL', 'getModel', 'getOption',
        'getViewOfComponentModel', 'getViewOfSeriesModel'
    ];
    // And `getCoordinateSystems` and `getComponentByElement` will be injected in echarts.js
 
    function ExtensionAPI(chartInstance) {
        zrUtil.each(echartsAPIList, function (name) {
            this[name] = zrUtil.bind(chartInstance[name], chartInstance);
        }, this);
    }
 
    module.exports = ExtensionAPI;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/echarts.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/echarts.js

Statements: 25.53% (191 / 748)      Branches: 7.05% (26 / 369)      Functions: 11.29% (14 / 124)      Lines: 25.53% (191 / 748)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984      1   1       1 1                                     1   1 1 1 1   1 1   1 1 1 1 1   1 1 1 1 1   1 1   1 1     1 1 1 1     1             1 1 1 1   1 6                   1     1 1 1 1         1                                                                                                                                                                                                     1                       1   1                                         1             1                                   1                                                                                                     1             1             1             1             1             1                 1                                               1                                                                         1                                                                                                                                                                   1                                       1   1                                                                               1                                                                                                       1                                                             1                 1         1                                                                                                                                                                                                                                                                                                                                                                   1                                               1                           1                                                             1                                               1                 1                                   1                                                                   1                                                                                                                                                       1               1               1 1 1           1                                                                     1                                                                                                                                             1                 1                                         1                                 1                               1                                                                             1             1                                                                             1             1             1                                                 1   1                                           1                                                                                   1                       1                                             1           1             1           1           1             1         1       1     1 1   1 1 1       1                   1           1                                                                                           1                                                                               1                                               1             1           1                               1               1             1 7             1 16             1 11 8 8   11 11       11                   1                                       1 39 36 36   39             39 39     39   39 38   39             1 2                     1 20 19 19   20 20       20                     1 26 21 21   26 26 2     24                 1 1             1           12             1           19             1             3             1             13                                     1       1 1 1     1         1                   1   1 1   1   1 1 1 1 1 1 1   1 1           17       1       1                           1    
// Enable DEV mode when using source code without build. which has no __DEV__ variable
// In build process 'typeof __DEV__' will be replace with 'boolean'
// So this code will be removed or disabled anyway after built.
Eif (typeof __DEV__ === 'undefined') {
    // In browser
    Iif (typeof window !== 'undefined') {
        window.__DEV__ = true;
    }
    // In node
    else Eif (typeof global !== 'undefined') {
        global.__DEV__ = true;
    }
}
 
/*!
 * ECharts, a javascript interactive chart library.
 *
 * Copyright (c) 2015, Baidu Inc.
 * All rights reserved.
 *
 * LICENSE
 * https://github.com/ecomfe/echarts/blob/master/LICENSE.txt
 */
 
/**
 * @module echarts
 */
 
 
    var env = require('zrender/lib/core/env');
 
    var GlobalModel = require('./model/Global');
    var ExtensionAPI = require('./ExtensionAPI');
    var CoordinateSystemManager = require('./CoordinateSystem');
    var OptionManager = require('./model/OptionManager');
 
    var ComponentModel = require('./model/Component');
    var SeriesModel = require('./model/Series');
 
    var ComponentView = require('./view/Component');
    var ChartView = require('./view/Chart');
    var graphic = require('./util/graphic');
    var modelUtil = require('./util/model');
    var throttle = require('./util/throttle');
 
    var zrender = require('zrender');
    var zrUtil = require('zrender/lib/core/util');
    var colorTool = require('zrender/lib/tool/color');
    var Eventful = require('zrender/lib/mixin/Eventful');
    var timsort = require('zrender/lib/core/timsort');
 
    var each = zrUtil.each;
    var parseClassType = ComponentModel.parseClassType;
 
    var PRIORITY_PROCESSOR_FILTER = 1000;
    var PRIORITY_PROCESSOR_STATISTIC = 5000;
 
 
    var PRIORITY_VISUAL_LAYOUT = 1000;
    var PRIORITY_VISUAL_GLOBAL = 2000;
    var PRIORITY_VISUAL_CHART = 3000;
    var PRIORITY_VISUAL_COMPONENT = 4000;
    // FIXME
    // necessary?
    var PRIORITY_VISUAL_BRUSH = 5000;
 
    // Main process have three entries: `setOption`, `dispatchAction` and `resize`,
    // where they must not be invoked nestedly, except the only case: invoke
    // dispatchAction with updateMethod "none" in main process.
    // This flag is used to carry out this rule.
    // All events will be triggered out side main process (i.e. when !this[IN_MAIN_PROCESS]).
    var IN_MAIN_PROCESS = '__flagInMainProcess';
    var HAS_GRADIENT_OR_PATTERN_BG = '__hasGradientOrPatternBg';
    var OPTION_UPDATED = '__optionUpdated';
    var ACTION_REG = /^[a-zA-Z0-9_]+$/;
 
    function createRegisterEventWithLowercaseName(method) {
        return function (eventName, handler, context) {
            // Event name is all lowercase
            eventName = eventName && eventName.toLowerCase();
            Eventful.prototype[method].call(this, eventName, handler, context);
        };
    }
 
    /**
     * @module echarts~MessageCenter
     */
    function MessageCenter() {
        Eventful.call(this);
    }
    MessageCenter.prototype.on = createRegisterEventWithLowercaseName('on');
    MessageCenter.prototype.off = createRegisterEventWithLowercaseName('off');
    MessageCenter.prototype.one = createRegisterEventWithLowercaseName('one');
    zrUtil.mixin(MessageCenter, Eventful);
 
    /**
     * @module echarts~ECharts
     */
    function ECharts(dom, theme, opts) {
        opts = opts || {};
 
        // Get theme by name
        if (typeof theme === 'string') {
            theme = themeStorage[theme];
        }
 
        /**
         * @type {string}
         */
        this.id;
        /**
         * Group id
         * @type {string}
         */
        this.group;
        /**
         * @type {HTMLDomElement}
         * @private
         */
        this._dom = dom;
        /**
         * @type {module:zrender/ZRender}
         * @private
         */
        var zr = this._zr = zrender.init(dom, {
            renderer: opts.renderer || 'canvas',
            devicePixelRatio: opts.devicePixelRatio,
            width: opts.width,
            height: opts.height
        });
 
        /**
         * Expect 60 pfs.
         * @type {Function}
         * @private
         */
        this._throttledZrFlush = throttle.throttle(zrUtil.bind(zr.flush, zr), 17);
 
        /**
         * @type {Object}
         * @private
         */
        this._theme = zrUtil.clone(theme);
 
        /**
         * @type {Array.<module:echarts/view/Chart>}
         * @private
         */
        this._chartsViews = [];
 
        /**
         * @type {Object.<string, module:echarts/view/Chart>}
         * @private
         */
        this._chartsMap = {};
 
        /**
         * @type {Array.<module:echarts/view/Component>}
         * @private
         */
        this._componentsViews = [];
 
        /**
         * @type {Object.<string, module:echarts/view/Component>}
         * @private
         */
        this._componentsMap = {};
 
        /**
         * @type {module:echarts/CoordinateSystem}
         * @private
         */
        this._coordSysMgr = new CoordinateSystemManager();
 
        /**
         * @type {module:echarts/ExtensionAPI}
         * @private
         */
        this._api = createExtensionAPI(this);
 
        Eventful.call(this);
 
        /**
         * @type {module:echarts~MessageCenter}
         * @private
         */
        this._messageCenter = new MessageCenter();
 
        // Init mouse events
        this._initEvents();
 
        // In case some people write `window.onresize = chart.resize`
        this.resize = zrUtil.bind(this.resize, this);
 
        // Can't dispatch action during rendering procedure
        this._pendingActions = [];
        // Sort on demand
        function prioritySortFunc(a, b) {
            return a.prio - b.prio;
        }
        timsort(visualFuncs, prioritySortFunc);
        timsort(dataProcessorFuncs, prioritySortFunc);
 
        zr.animation.on('frame', this._onframe, this);
 
        // ECharts instance can be used as value.
        zrUtil.setAsPrimitive(this);
    }
 
    var echartsProto = ECharts.prototype;
 
    echartsProto._onframe = function () {
        // Lazy update
        if (this[OPTION_UPDATED]) {
            var silent = this[OPTION_UPDATED].silent;
 
            this[IN_MAIN_PROCESS] = true;
 
            updateMethods.prepareAndUpdate.call(this);
 
            this[IN_MAIN_PROCESS] = false;
 
            this[OPTION_UPDATED] = false;
 
            flushPendingActions.call(this, silent);
 
            triggerUpdatedEvent.call(this, silent);
        }
    };
    /**
     * @return {HTMLDomElement}
     */
    echartsProto.getDom = function () {
        return this._dom;
    };
 
    /**
     * @return {module:zrender~ZRender}
     */
    echartsProto.getZr = function () {
        return this._zr;
    };
 
    /**
     * Usage:
     * chart.setOption(option, notMerge, lazyUpdate);
     * chart.setOption(option, {
     *     notMerge: ...,
     *     lazyUpdate: ...,
     *     silent: ...
     * });
     *
     * @param {Object} option
     * @param {Object|boolean} [opts] opts or notMerge.
     * @param {boolean} [opts.notMerge=false]
     * @param {boolean} [opts.lazyUpdate=false] Useful when setOption frequently.
     */
    echartsProto.setOption = function (option, notMerge, lazyUpdate) {
        if (__DEV__) {
            zrUtil.assert(!this[IN_MAIN_PROCESS], '`setOption` should not be called during main process.');
        }
 
        var silent;
        if (zrUtil.isObject(notMerge)) {
            lazyUpdate = notMerge.lazyUpdate;
            silent = notMerge.silent;
            notMerge = notMerge.notMerge;
        }
 
        this[IN_MAIN_PROCESS] = true;
 
        if (!this._model || notMerge) {
            var optionManager = new OptionManager(this._api);
            var theme = this._theme;
            var ecModel = this._model = new GlobalModel(null, null, theme, optionManager);
            ecModel.init(null, null, theme, optionManager);
        }
 
        // FIXME
        // ugly
        this.__lastOnlyGraphic = !!(option && option.graphic);
        zrUtil.each(option, function (o, mainType) {
            mainType !== 'graphic' && (this.__lastOnlyGraphic = false);
        }, this);
 
        this._model.setOption(option, optionPreprocessorFuncs, this.__lastOnlyGraphic);
 
        if (lazyUpdate) {
            this[OPTION_UPDATED] = {silent: silent};
            this[IN_MAIN_PROCESS] = false;
        }
        else {
            updateMethods.prepareAndUpdate.call(this);
            // Ensure zr refresh sychronously, and then pixel in canvas can be
            // fetched after `setOption`.
            this._zr.flush();
 
            this[OPTION_UPDATED] = false;
            this[IN_MAIN_PROCESS] = false;
 
            flushPendingActions.call(this, silent);
            triggerUpdatedEvent.call(this, silent);
        }
    };
 
    /**
     * @DEPRECATED
     */
    echartsProto.setTheme = function () {
        console.log('ECharts#setTheme() is DEPRECATED in ECharts 3.0');
    };
 
    /**
     * @return {module:echarts/model/Global}
     */
    echartsProto.getModel = function () {
        return this._model;
    };
 
    /**
     * @return {Object}
     */
    echartsProto.getOption = function () {
        return this._model && this._model.getOption();
    };
 
    /**
     * @return {number}
     */
    echartsProto.getWidth = function () {
        return this._zr.getWidth();
    };
 
    /**
     * @return {number}
     */
    echartsProto.getHeight = function () {
        return this._zr.getHeight();
    };
 
    /**
     * @return {number}
     */
    echartsProto.getDevicePixelRatio = function () {
        return this._zr.painter.dpr || window.devicePixelRatio || 1;
    };
 
    /**
     * Get canvas which has all thing rendered
     * @param {Object} opts
     * @param {string} [opts.backgroundColor]
     */
    echartsProto.getRenderedCanvas = function (opts) {
        if (!env.canvasSupported) {
            return;
        }
        opts = opts || {};
        opts.pixelRatio = opts.pixelRatio || 1;
        opts.backgroundColor = opts.backgroundColor
            || this._model.get('backgroundColor');
        var zr = this._zr;
        var list = zr.storage.getDisplayList();
        // Stop animations
        zrUtil.each(list, function (el) {
            el.stopAnimation(true);
        });
        return zr.painter.getRenderedCanvas(opts);
    };
    /**
     * @return {string}
     * @param {Object} opts
     * @param {string} [opts.type='png']
     * @param {string} [opts.pixelRatio=1]
     * @param {string} [opts.backgroundColor]
     * @param {string} [opts.excludeComponents]
     */
    echartsProto.getDataURL = function (opts) {
        opts = opts || {};
        var excludeComponents = opts.excludeComponents;
        var ecModel = this._model;
        var excludesComponentViews = [];
        var self = this;
 
        each(excludeComponents, function (componentType) {
            ecModel.eachComponent({
                mainType: componentType
            }, function (component) {
                var view = self._componentsMap[component.__viewId];
                if (!view.group.ignore) {
                    excludesComponentViews.push(view);
                    view.group.ignore = true;
                }
            });
        });
 
        var url = this.getRenderedCanvas(opts).toDataURL(
            'image/' + (opts && opts.type || 'png')
        );
 
        each(excludesComponentViews, function (view) {
            view.group.ignore = false;
        });
        return url;
    };
 
 
    /**
     * @return {string}
     * @param {Object} opts
     * @param {string} [opts.type='png']
     * @param {string} [opts.pixelRatio=1]
     * @param {string} [opts.backgroundColor]
     */
    echartsProto.getConnectedDataURL = function (opts) {
        if (!env.canvasSupported) {
            return;
        }
        var groupId = this.group;
        var mathMin = Math.min;
        var mathMax = Math.max;
        var MAX_NUMBER = Infinity;
        if (connectedGroups[groupId]) {
            var left = MAX_NUMBER;
            var top = MAX_NUMBER;
            var right = -MAX_NUMBER;
            var bottom = -MAX_NUMBER;
            var canvasList = [];
            var dpr = (opts && opts.pixelRatio) || 1;
 
            zrUtil.each(instances, function (chart, id) {
                if (chart.group === groupId) {
                    var canvas = chart.getRenderedCanvas(
                        zrUtil.clone(opts)
                    );
                    var boundingRect = chart.getDom().getBoundingClientRect();
                    left = mathMin(boundingRect.left, left);
                    top = mathMin(boundingRect.top, top);
                    right = mathMax(boundingRect.right, right);
                    bottom = mathMax(boundingRect.bottom, bottom);
                    canvasList.push({
                        dom: canvas,
                        left: boundingRect.left,
                        top: boundingRect.top
                    });
                }
            });
 
            left *= dpr;
            top *= dpr;
            right *= dpr;
            bottom *= dpr;
            var width = right - left;
            var height = bottom - top;
            var targetCanvas = zrUtil.createCanvas();
            targetCanvas.width = width;
            targetCanvas.height = height;
            var zr = zrender.init(targetCanvas);
 
            each(canvasList, function (item) {
                var img = new graphic.Image({
                    style: {
                        x: item.left * dpr - left,
                        y: item.top * dpr - top,
                        image: item.dom
                    }
                });
                zr.add(img);
            });
            zr.refreshImmediately();
 
            return targetCanvas.toDataURL('image/' + (opts && opts.type || 'png'));
        }
        else {
            return this.getDataURL(opts);
        }
    };
 
    /**
     * Convert from logical coordinate system to pixel coordinate system.
     * See CoordinateSystem#convertToPixel.
     * @param {string|Object} finder
     *        If string, e.g., 'geo', means {geoIndex: 0}.
     *        If Object, could contain some of these properties below:
     *        {
     *            seriesIndex / seriesId / seriesName,
     *            geoIndex / geoId, geoName,
     *            bmapIndex / bmapId / bmapName,
     *            xAxisIndex / xAxisId / xAxisName,
     *            yAxisIndex / yAxisId / yAxisName,
     *            gridIndex / gridId / gridName,
     *            ... (can be extended)
     *        }
     * @param {Array|number} value
     * @return {Array|number} result
     */
    echartsProto.convertToPixel = zrUtil.curry(doConvertPixel, 'convertToPixel');
 
    /**
     * Convert from pixel coordinate system to logical coordinate system.
     * See CoordinateSystem#convertFromPixel.
     * @param {string|Object} finder
     *        If string, e.g., 'geo', means {geoIndex: 0}.
     *        If Object, could contain some of these properties below:
     *        {
     *            seriesIndex / seriesId / seriesName,
     *            geoIndex / geoId / geoName,
     *            bmapIndex / bmapId / bmapName,
     *            xAxisIndex / xAxisId / xAxisName,
     *            yAxisIndex / yAxisId / yAxisName
     *            gridIndex / gridId / gridName,
     *            ... (can be extended)
     *        }
     * @param {Array|number} value
     * @return {Array|number} result
     */
    echartsProto.convertFromPixel = zrUtil.curry(doConvertPixel, 'convertFromPixel');
 
    function doConvertPixel(methodName, finder, value) {
        var ecModel = this._model;
        var coordSysList = this._coordSysMgr.getCoordinateSystems();
        var result;
 
        finder = modelUtil.parseFinder(ecModel, finder);
 
        for (var i = 0; i < coordSysList.length; i++) {
            var coordSys = coordSysList[i];
            if (coordSys[methodName]
                && (result = coordSys[methodName](ecModel, finder, value)) != null
            ) {
                return result;
            }
        }
 
        if (__DEV__) {
            console.warn(
                'No coordinate system that supports ' + methodName + ' found by the given finder.'
            );
        }
    }
 
    /**
     * Is the specified coordinate systems or components contain the given pixel point.
     * @param {string|Object} finder
     *        If string, e.g., 'geo', means {geoIndex: 0}.
     *        If Object, could contain some of these properties below:
     *        {
     *            seriesIndex / seriesId / seriesName,
     *            geoIndex / geoId / geoName,
     *            bmapIndex / bmapId / bmapName,
     *            xAxisIndex / xAxisId / xAxisName,
     *            yAxisIndex / yAxisId / yAxisName,
     *            gridIndex / gridId / gridName,
     *            ... (can be extended)
     *        }
     * @param {Array|number} value
     * @return {boolean} result
     */
    echartsProto.containPixel = function (finder, value) {
        var ecModel = this._model;
        var result;
 
        finder = modelUtil.parseFinder(ecModel, finder);
 
        zrUtil.each(finder, function (models, key) {
            key.indexOf('Models') >= 0 && zrUtil.each(models, function (model) {
                var coordSys = model.coordinateSystem;
                if (coordSys && coordSys.containPoint) {
                    result |= !!coordSys.containPoint(value);
                }
                else if (key === 'seriesModels') {
                    var view = this._chartsMap[model.__viewId];
                    if (view && view.containPoint) {
                        result |= view.containPoint(value, model);
                    }
                    else {
                        if (__DEV__) {
                            console.warn(key + ': ' + (view
                                ? 'The found component do not support containPoint.'
                                : 'No view mapping to the found component.'
                            ));
                        }
                    }
                }
                else {
                    if (__DEV__) {
                        console.warn(key + ': containPoint is not supported');
                    }
                }
            }, this);
        }, this);
 
        return !!result;
    };
 
    /**
     * Get visual from series or data.
     * @param {string|Object} finder
     *        If string, e.g., 'series', means {seriesIndex: 0}.
     *        If Object, could contain some of these properties below:
     *        {
     *            seriesIndex / seriesId / seriesName,
     *            dataIndex / dataIndexInside
     *        }
     *        If dataIndex is not specified, series visual will be fetched,
     *        but not data item visual.
     *        If all of seriesIndex, seriesId, seriesName are not specified,
     *        visual will be fetched from first series.
     * @param {string} visualType 'color', 'symbol', 'symbolSize'
     */
    echartsProto.getVisual = function (finder, visualType) {
        var ecModel = this._model;
 
        finder = modelUtil.parseFinder(ecModel, finder, {defaultMainType: 'series'});
 
        var seriesModel = finder.seriesModel;
 
        if (__DEV__) {
            if (!seriesModel) {
                console.warn('There is no specified seires model');
            }
        }
 
        var data = seriesModel.getData();
 
        var dataIndexInside = finder.hasOwnProperty('dataIndexInside')
            ? finder.dataIndexInside
            : finder.hasOwnProperty('dataIndex')
            ? data.indexOfRawIndex(finder.dataIndex)
            : null;
 
        return dataIndexInside != null
            ? data.getItemVisual(dataIndexInside, visualType)
            : data.getVisual(visualType);
    };
 
    /**
     * Get view of corresponding component model
     * @param  {module:echarts/model/Component} componentModel
     * @return {module:echarts/view/Component}
     */
    echartsProto.getViewOfComponentModel = function (componentModel) {
        return this._componentsMap[componentModel.__viewId];
    };
 
    /**
     * Get view of corresponding series model
     * @param  {module:echarts/model/Series} seriesModel
     * @return {module:echarts/view/Chart}
     */
    echartsProto.getViewOfSeriesModel = function (seriesModel) {
        return this._chartsMap[seriesModel.__viewId];
    };
 
 
    var updateMethods = {
 
        /**
         * @param {Object} payload
         * @private
         */
        update: function (payload) {
            // console.profile && console.profile('update');
 
            var ecModel = this._model;
            var api = this._api;
            var coordSysMgr = this._coordSysMgr;
            var zr = this._zr;
            // update before setOption
            if (!ecModel) {
                return;
            }
 
            // Fixme First time update ?
            ecModel.restoreData();
 
            // TODO
            // Save total ecModel here for undo/redo (after restoring data and before processing data).
            // Undo (restoration of total ecModel) can be carried out in 'action' or outside API call.
 
            // Create new coordinate system each update
            // In LineView may save the old coordinate system and use it to get the orignal point
            coordSysMgr.create(this._model, this._api);
 
            processData.call(this, ecModel, api);
 
            stackSeriesData.call(this, ecModel);
 
            coordSysMgr.update(ecModel, api);
 
            doVisualEncoding.call(this, ecModel, payload);
 
            doRender.call(this, ecModel, payload);
 
            // Set background
            var backgroundColor = ecModel.get('backgroundColor') || 'transparent';
 
            var painter = zr.painter;
            // TODO all use clearColor ?
            if (painter.isSingleCanvas && painter.isSingleCanvas()) {
                zr.configLayer(0, {
                    clearColor: backgroundColor
                });
            }
            else {
                // In IE8
                if (!env.canvasSupported) {
                    var colorArr = colorTool.parse(backgroundColor);
                    backgroundColor = colorTool.stringify(colorArr, 'rgb');
                    if (colorArr[3] === 0) {
                        backgroundColor = 'transparent';
                    }
                }
                if (backgroundColor.colorStops || backgroundColor.image) {
                    // Gradient background
                    // FIXME Fixed layer?
                    zr.configLayer(0, {
                        clearColor: backgroundColor
                    });
                    this[HAS_GRADIENT_OR_PATTERN_BG] = true;
 
                    this._dom.style.background = 'transparent';
                }
                else {
                    if (this[HAS_GRADIENT_OR_PATTERN_BG]) {
                        zr.configLayer(0, {
                            clearColor: null
                        });
                    }
                    this[HAS_GRADIENT_OR_PATTERN_BG] = false;
 
                    this._dom.style.background = backgroundColor;
                }
            }
 
            each(postUpdateFuncs, function (func) {
                func(ecModel, api);
            });
 
            // console.profile && console.profileEnd('update');
        },
 
        /**
         * @param {Object} payload
         * @private
         */
        updateView: function (payload) {
            var ecModel = this._model;
 
            // update before setOption
            if (!ecModel) {
                return;
            }
 
            ecModel.eachSeries(function (seriesModel) {
                seriesModel.getData().clearAllVisual();
            });
 
            doVisualEncoding.call(this, ecModel, payload);
 
            invokeUpdateMethod.call(this, 'updateView', ecModel, payload);
        },
 
        /**
         * @param {Object} payload
         * @private
         */
        updateVisual: function (payload) {
            var ecModel = this._model;
 
            // update before setOption
            if (!ecModel) {
                return;
            }
 
            ecModel.eachSeries(function (seriesModel) {
                seriesModel.getData().clearAllVisual();
            });
 
            doVisualEncoding.call(this, ecModel, payload, true);
 
            invokeUpdateMethod.call(this, 'updateVisual', ecModel, payload);
        },
 
        /**
         * @param {Object} payload
         * @private
         */
        updateLayout: function (payload) {
            var ecModel = this._model;
 
            // update before setOption
            if (!ecModel) {
                return;
            }
 
            doLayout.call(this, ecModel, payload);
 
            invokeUpdateMethod.call(this, 'updateLayout', ecModel, payload);
        },
 
        /**
         * @param {Object} payload
         * @private
         */
        prepareAndUpdate: function (payload) {
            var ecModel = this._model;
 
            prepareView.call(this, 'component', ecModel);
 
            prepareView.call(this, 'chart', ecModel);
 
            // FIXME
            // ugly
            if (this.__lastOnlyGraphic) {
                each(this._componentsViews, function (componentView) {
                    var componentModel = componentView.__model;
                    if (componentModel && componentModel.mainType === 'graphic') {
                        componentView.render(componentModel, ecModel, this._api, payload);
                        updateZ(componentModel, componentView);
                    }
                }, this);
                this.__lastOnlyGraphic = false;
            }
            else {
                updateMethods.update.call(this, payload);
            }
        }
    };
 
    /**
     * @private
     */
    function updateDirectly(ecIns, method, payload, mainType, subType) {
        var ecModel = ecIns._model;
 
        // broadcast
        if (!mainType) {
            each(ecIns._componentsViews.concat(ecIns._chartsViews), callView);
            return;
        }
 
        var query = {};
        query[mainType + 'Id'] = payload[mainType + 'Id'];
        query[mainType + 'Index'] = payload[mainType + 'Index'];
        query[mainType + 'Name'] = payload[mainType + 'Name'];
 
        var condition = {mainType: mainType, query: query};
        subType && (condition.subType = subType); // subType may be '' by parseClassType;
 
        // If dispatchAction before setOption, do nothing.
        ecModel && ecModel.eachComponent(condition, function (model, index) {
            callView(ecIns[
                mainType === 'series' ? '_chartsMap' : '_componentsMap'
            ][model.__viewId]);
        }, ecIns);
 
        function callView(view) {
            view && view.__alive && view[method] && view[method](
                view.__model, ecModel, ecIns._api, payload
            );
        }
    }
 
    /**
     * Resize the chart
     * @param {Object} opts
     * @param {number} [opts.width] Can be 'auto' (the same as null/undefined)
     * @param {number} [opts.height] Can be 'auto' (the same as null/undefined)
     * @param {boolean} [opts.silent=false]
     */
    echartsProto.resize = function (opts) {
        if (__DEV__) {
            zrUtil.assert(!this[IN_MAIN_PROCESS], '`resize` should not be called during main process.');
        }
 
        this[IN_MAIN_PROCESS] = true;
 
        this._zr.resize(opts);
 
        var optionChanged = this._model && this._model.resetOption('media');
        var updateMethod = optionChanged ? 'prepareAndUpdate' : 'update';
 
        updateMethods[updateMethod].call(this);
 
        // Resize loading effect
        this._loadingFX && this._loadingFX.resize();
 
        this[IN_MAIN_PROCESS] = false;
 
        var silent = opts && opts.silent;
 
        flushPendingActions.call(this, silent);
 
        triggerUpdatedEvent.call(this, silent);
    };
 
    /**
     * Show loading effect
     * @param  {string} [name='default']
     * @param  {Object} [cfg]
     */
    echartsProto.showLoading = function (name, cfg) {
        if (zrUtil.isObject(name)) {
            cfg = name;
            name = '';
        }
        name = name || 'default';
 
        this.hideLoading();
        if (!loadingEffects[name]) {
            if (__DEV__) {
                console.warn('Loading effects ' + name + ' not exists.');
            }
            return;
        }
        var el = loadingEffects[name](this._api, cfg);
        var zr = this._zr;
        this._loadingFX = el;
 
        zr.add(el);
    };
 
    /**
     * Hide loading effect
     */
    echartsProto.hideLoading = function () {
        this._loadingFX && this._zr.remove(this._loadingFX);
        this._loadingFX = null;
    };
 
    /**
     * @param {Object} eventObj
     * @return {Object}
     */
    echartsProto.makeActionFromEvent = function (eventObj) {
        var payload = zrUtil.extend({}, eventObj);
        payload.type = eventActionMap[eventObj.type];
        return payload;
    };
 
    /**
     * @pubilc
     * @param {Object} payload
     * @param {string} [payload.type] Action type
     * @param {Object|boolean} [opt] If pass boolean, means opt.silent
     * @param {boolean} [opt.silent=false] Whether trigger events.
     * @param {boolean} [opt.flush=undefined]
     *                  true: Flush immediately, and then pixel in canvas can be fetched
     *                      immediately. Caution: it might affect performance.
     *                  false: Not not flush.
     *                  undefined: Auto decide whether perform flush.
     */
    echartsProto.dispatchAction = function (payload, opt) {
        if (!zrUtil.isObject(opt)) {
            opt = {silent: !!opt};
        }
 
        if (!actions[payload.type]) {
            return;
        }
 
        // May dispatchAction in rendering procedure
        if (this[IN_MAIN_PROCESS]) {
            this._pendingActions.push(payload);
            return;
        }
 
        doDispatchAction.call(this, payload, opt.silent);
 
        if (opt.flush) {
            this._zr.flush(true);
        }
        else if (opt.flush !== false && env.browser.weChat) {
            // In WeChat embeded browser, `requestAnimationFrame` and `setInterval`
            // hang when sliding page (on touch event), which cause that zr does not
            // refresh util user interaction finished, which is not expected.
            // But `dispatchAction` may be called too frequently when pan on touch
            // screen, which impacts performance if do not throttle them.
            this._throttledZrFlush();
        }
 
        flushPendingActions.call(this, opt.silent);
 
        triggerUpdatedEvent.call(this, opt.silent);
    };
 
    function doDispatchAction(payload, silent) {
        var payloadType = payload.type;
        var escapeConnect = payload.escapeConnect;
        var actionWrap = actions[payloadType];
        var actionInfo = actionWrap.actionInfo;
 
        var cptType = (actionInfo.update || 'update').split(':');
        var updateMethod = cptType.pop();
        cptType = cptType[0] != null && parseClassType(cptType[0]);
 
        this[IN_MAIN_PROCESS] = true;
 
        var payloads = [payload];
        var batched = false;
        // Batch action
        if (payload.batch) {
            batched = true;
            payloads = zrUtil.map(payload.batch, function (item) {
                item = zrUtil.defaults(zrUtil.extend({}, item), payload);
                item.batch = null;
                return item;
            });
        }
 
        var eventObjBatch = [];
        var eventObj;
        var isHighDown = payloadType === 'highlight' || payloadType === 'downplay';
 
        each(payloads, function (batchItem) {
            // Action can specify the event by return it.
            eventObj = actionWrap.action(batchItem, this._model, this._api);
            // Emit event outside
            eventObj = eventObj || zrUtil.extend({}, batchItem);
            // Convert type to eventType
            eventObj.type = actionInfo.event || eventObj.type;
            eventObjBatch.push(eventObj);
 
            // light update does not perform data process, layout and visual.
            if (isHighDown) {
                // method, payload, mainType, subType
                updateDirectly(this, updateMethod, batchItem, 'series');
            }
            else if (cptType) {
                updateDirectly(this, updateMethod, batchItem, cptType.main, cptType.sub);
            }
        }, this);
 
        if (updateMethod !== 'none' && !isHighDown && !cptType) {
            // Still dirty
            if (this[OPTION_UPDATED]) {
                // FIXME Pass payload ?
                updateMethods.prepareAndUpdate.call(this, payload);
                this[OPTION_UPDATED] = false;
            }
            else {
                updateMethods[updateMethod].call(this, payload);
            }
        }
 
        // Follow the rule of action batch
        if (batched) {
            eventObj = {
                type: actionInfo.event || payloadType,
                escapeConnect: escapeConnect,
                batch: eventObjBatch
            };
        }
        else {
            eventObj = eventObjBatch[0];
        }
 
        this[IN_MAIN_PROCESS] = false;
 
        !silent && this._messageCenter.trigger(eventObj.type, eventObj);
    }
 
    function flushPendingActions(silent) {
        var pendingActions = this._pendingActions;
        while (pendingActions.length) {
            var payload = pendingActions.shift();
            doDispatchAction.call(this, payload, silent);
        }
    }
 
    function triggerUpdatedEvent(silent) {
        !silent && this.trigger('updated');
    }
 
    /**
     * Register event
     * @method
     */
    echartsProto.on = createRegisterEventWithLowercaseName('on');
    echartsProto.off = createRegisterEventWithLowercaseName('off');
    echartsProto.one = createRegisterEventWithLowercaseName('one');
 
    /**
     * @param {string} methodName
     * @private
     */
    function invokeUpdateMethod(methodName, ecModel, payload) {
        var api = this._api;
 
        // Update all components
        each(this._componentsViews, function (component) {
            var componentModel = component.__model;
            component[methodName](componentModel, ecModel, api, payload);
 
            updateZ(componentModel, component);
        }, this);
 
        // Upate all charts
        ecModel.eachSeries(function (seriesModel, idx) {
            var chart = this._chartsMap[seriesModel.__viewId];
            chart[methodName](seriesModel, ecModel, api, payload);
 
            updateZ(seriesModel, chart);
 
            updateProgressiveAndBlend(seriesModel, chart);
        }, this);
 
        // If use hover layer
        updateHoverLayerStatus(this._zr, ecModel);
 
        // Post render
        each(postUpdateFuncs, function (func) {
            func(ecModel, api);
        });
    }
 
    /**
     * Prepare view instances of charts and components
     * @param  {module:echarts/model/Global} ecModel
     * @private
     */
    function prepareView(type, ecModel) {
        var isComponent = type === 'component';
        var viewList = isComponent ? this._componentsViews : this._chartsViews;
        var viewMap = isComponent ? this._componentsMap : this._chartsMap;
        var zr = this._zr;
 
        for (var i = 0; i < viewList.length; i++) {
            viewList[i].__alive = false;
        }
 
        ecModel[isComponent ? 'eachComponent' : 'eachSeries'](function (componentType, model) {
            if (isComponent) {
                if (componentType === 'series') {
                    return;
                }
            }
            else {
                model = componentType;
            }
 
            // Consider: id same and type changed.
            var viewId = model.id + '_' + model.type;
            var view = viewMap[viewId];
            if (!view) {
                var classType = parseClassType(model.type);
                var Clazz = isComponent
                    ? ComponentView.getClass(classType.main, classType.sub)
                    : ChartView.getClass(classType.sub);
                if (Clazz) {
                    view = new Clazz();
                    view.init(ecModel, this._api);
                    viewMap[viewId] = view;
                    viewList.push(view);
                    zr.add(view.group);
                }
                else {
                    // Error
                    return;
                }
            }
 
            model.__viewId = view.__id = viewId;
            view.__alive = true;
            view.__model = model;
            view.group.__ecComponentInfo = {
                mainType: model.mainType,
                index: model.componentIndex
            };
        }, this);
 
        for (var i = 0; i < viewList.length;) {
            var view = viewList[i];
            if (!view.__alive) {
                zr.remove(view.group);
                view.dispose(ecModel, this._api);
                viewList.splice(i, 1);
                delete viewMap[view.__id];
                view.__id = view.group.__ecComponentInfo = null;
            }
            else {
                i++;
            }
        }
    }
 
    /**
     * Processor data in each series
     *
     * @param {module:echarts/model/Global} ecModel
     * @private
     */
    function processData(ecModel, api) {
        each(dataProcessorFuncs, function (process) {
            process.func(ecModel, api);
        });
    }
 
    /**
     * @private
     */
    function stackSeriesData(ecModel) {
        var stackedDataMap = {};
        ecModel.eachSeries(function (series) {
            var stack = series.get('stack');
            var data = series.getData();
            if (stack && data.type === 'list') {
                var previousStack = stackedDataMap[stack];
                if (previousStack) {
                    data.stackedOn = previousStack;
                }
                stackedDataMap[stack] = data;
            }
        });
    }
 
    /**
     * Layout before each chart render there series, special visual encoding stage
     *
     * @param {module:echarts/model/Global} ecModel
     * @private
     */
    function doLayout(ecModel, payload) {
        var api = this._api;
        each(visualFuncs, function (visual) {
            if (visual.isLayout) {
                visual.func(ecModel, api, payload);
            }
        });
    }
 
    /**
     * Encode visual infomation from data after data processing
     *
     * @param {module:echarts/model/Global} ecModel
     * @param {object} layout
     * @param {boolean} [excludesLayout]
     * @private
     */
    function doVisualEncoding(ecModel, payload, excludesLayout) {
        var api = this._api;
        ecModel.clearColorPalette();
        ecModel.eachSeries(function (seriesModel) {
            seriesModel.clearColorPalette();
        });
        each(visualFuncs, function (visual) {
            (!excludesLayout || !visual.isLayout)
                && visual.func(ecModel, api, payload);
        });
    }
 
    /**
     * Render each chart and component
     * @private
     */
    function doRender(ecModel, payload) {
        var api = this._api;
        // Render all components
        each(this._componentsViews, function (componentView) {
            var componentModel = componentView.__model;
            componentView.render(componentModel, ecModel, api, payload);
 
            updateZ(componentModel, componentView);
        }, this);
 
        each(this._chartsViews, function (chart) {
            chart.__alive = false;
        }, this);
 
        // Render all charts
        ecModel.eachSeries(function (seriesModel, idx) {
            var chartView = this._chartsMap[seriesModel.__viewId];
            chartView.__alive = true;
            chartView.render(seriesModel, ecModel, api, payload);
 
            chartView.group.silent = !!seriesModel.get('silent');
 
            updateZ(seriesModel, chartView);
 
            updateProgressiveAndBlend(seriesModel, chartView);
 
        }, this);
 
        // If use hover layer
        updateHoverLayerStatus(this._zr, ecModel);
 
        // Remove groups of unrendered charts
        each(this._chartsViews, function (chart) {
            if (!chart.__alive) {
                chart.remove(ecModel, api);
            }
        }, this);
    }
 
    var MOUSE_EVENT_NAMES = [
        'click', 'dblclick', 'mouseover', 'mouseout', 'mousemove',
        'mousedown', 'mouseup', 'globalout', 'contextmenu'
    ];
    /**
     * @private
     */
    echartsProto._initEvents = function () {
        each(MOUSE_EVENT_NAMES, function (eveName) {
            this._zr.on(eveName, function (e) {
                var ecModel = this.getModel();
                var el = e.target;
                var params;
 
                // no e.target when 'globalout'.
                if (eveName === 'globalout') {
                    params = {};
                }
                else if (el && el.dataIndex != null) {
                    var dataModel = el.dataModel || ecModel.getSeriesByIndex(el.seriesIndex);
                    params = dataModel && dataModel.getDataParams(el.dataIndex, el.dataType) || {};
                }
                // If element has custom eventData of components
                else if (el && el.eventData) {
                    params = zrUtil.extend({}, el.eventData);
                }
 
                if (params) {
                    params.event = e;
                    params.type = eveName;
                    this.trigger(eveName, params);
                }
 
            }, this);
        }, this);
 
        each(eventActionMap, function (actionType, eventType) {
            this._messageCenter.on(eventType, function (event) {
                this.trigger(eventType, event);
            }, this);
        }, this);
    };
 
    /**
     * @return {boolean}
     */
    echartsProto.isDisposed = function () {
        return this._disposed;
    };
 
    /**
     * Clear
     */
    echartsProto.clear = function () {
        this.setOption({ series: [] }, true);
    };
 
    /**
     * Dispose instance
     */
    echartsProto.dispose = function () {
        if (this._disposed) {
            if (__DEV__) {
                console.warn('Instance ' + this.id + ' has been disposed');
            }
            return;
        }
        this._disposed = true;
 
        var api = this._api;
        var ecModel = this._model;
 
        each(this._componentsViews, function (component) {
            component.dispose(ecModel, api);
        });
        each(this._chartsViews, function (chart) {
            chart.dispose(ecModel, api);
        });
 
        // Dispose after all views disposed
        this._zr.dispose();
 
        delete instances[this.id];
    };
 
    zrUtil.mixin(ECharts, Eventful);
 
    function updateHoverLayerStatus(zr, ecModel) {
        var storage = zr.storage;
        var elCount = 0;
        storage.traverse(function (el) {
            if (!el.isGroup) {
                elCount++;
            }
        });
        if (elCount > ecModel.get('hoverLayerThreshold') && !env.node) {
            storage.traverse(function (el) {
                if (!el.isGroup) {
                    el.useHoverLayer = true;
                }
            });
        }
    }
 
    /**
     * Update chart progressive and blend.
     * @param {module:echarts/model/Series|module:echarts/model/Component} model
     * @param {module:echarts/view/Component|module:echarts/view/Chart} view
     */
    function updateProgressiveAndBlend(seriesModel, chartView) {
        // Progressive configuration
        var elCount = 0;
        chartView.group.traverse(function (el) {
            if (el.type !== 'group' && !el.ignore) {
                elCount++;
            }
        });
        var frameDrawNum = +seriesModel.get('progressive');
        var needProgressive = elCount > seriesModel.get('progressiveThreshold') && frameDrawNum && !env.node;
        if (needProgressive) {
            chartView.group.traverse(function (el) {
                // FIXME marker and other components
                if (!el.isGroup) {
                    el.progressive = needProgressive ?
                        Math.floor(elCount++ / frameDrawNum) : -1;
                    if (needProgressive) {
                        el.stopAnimation(true);
                    }
                }
            });
        }
 
        // Blend configration
        var blendMode = seriesModel.get('blendMode') || null;
        if (__DEV__) {
            if (!env.canvasSupported && blendMode && blendMode !== 'source-over') {
                console.warn('Only canvas support blendMode');
            }
        }
        chartView.group.traverse(function (el) {
            // FIXME marker and other components
            if (!el.isGroup) {
                el.setStyle('blend', blendMode);
            }
        });
    }
 
    /**
     * @param {module:echarts/model/Series|module:echarts/model/Component} model
     * @param {module:echarts/view/Component|module:echarts/view/Chart} view
     */
    function updateZ(model, view) {
        var z = model.get('z');
        var zlevel = model.get('zlevel');
        // Set z and zlevel
        view.group.traverse(function (el) {
            if (el.type !== 'group') {
                z != null && (el.z = z);
                zlevel != null && (el.zlevel = zlevel);
            }
        });
    }
 
    function createExtensionAPI(ecInstance) {
        var coordSysMgr = ecInstance._coordSysMgr;
        return zrUtil.extend(new ExtensionAPI(ecInstance), {
            // Inject methods
            getCoordinateSystems: zrUtil.bind(
                coordSysMgr.getCoordinateSystems, coordSysMgr
            ),
            getComponentByElement: function (el) {
                while (el) {
                    var modelInfo = el.__ecComponentInfo;
                    if (modelInfo != null) {
                        return ecInstance._model.getComponent(modelInfo.mainType, modelInfo.index);
                    }
                    el = el.parent;
                }
            }
        });
    }
 
    /**
     * @type {Object} key: actionType.
     * @inner
     */
    var actions = {};
 
    /**
     * Map eventType to actionType
     * @type {Object}
     */
    var eventActionMap = {};
 
    /**
     * Data processor functions of each stage
     * @type {Array.<Object.<string, Function>>}
     * @inner
     */
    var dataProcessorFuncs = [];
 
    /**
     * @type {Array.<Function>}
     * @inner
     */
    var optionPreprocessorFuncs = [];
 
    /**
     * @type {Array.<Function>}
     * @inner
     */
    var postUpdateFuncs = [];
 
    /**
     * Visual encoding functions of each stage
     * @type {Array.<Object.<string, Function>>}
     * @inner
     */
    var visualFuncs = [];
    /**
     * Theme storage
     * @type {Object.<key, Object>}
     */
    var themeStorage = {};
    /**
     * Loading effects
     */
    var loadingEffects = {};
 
 
    var instances = {};
    var connectedGroups = {};
 
    var idBase = new Date() - 0;
    var groupIdBase = new Date() - 0;
    var DOM_ATTRIBUTE_KEY = '_echarts_instance_';
    /**
     * @alias module:echarts
     */
    var echarts = {
        /**
         * @type {number}
         */
        version: '3.5.3',
        dependencies: {
            zrender: '3.4.3'
        }
    };
 
    function enableConnect(chart) {
        var STATUS_PENDING = 0;
        var STATUS_UPDATING = 1;
        var STATUS_UPDATED = 2;
        var STATUS_KEY = '__connectUpdateStatus';
 
        function updateConnectedChartsStatus(charts, status) {
            for (var i = 0; i < charts.length; i++) {
                var otherChart = charts[i];
                otherChart[STATUS_KEY] = status;
            }
        }
 
        zrUtil.each(eventActionMap, function (actionType, eventType) {
            chart._messageCenter.on(eventType, function (event) {
                if (connectedGroups[chart.group] && chart[STATUS_KEY] !== STATUS_PENDING) {
                    if (event && event.escapeConnect) {
                        return;
                    }
 
                    var action = chart.makeActionFromEvent(event);
                    var otherCharts = [];
 
                    zrUtil.each(instances, function (otherChart) {
                        if (otherChart !== chart && otherChart.group === chart.group) {
                            otherCharts.push(otherChart);
                        }
                    });
 
                    updateConnectedChartsStatus(otherCharts, STATUS_PENDING);
                    each(otherCharts, function (otherChart) {
                        if (otherChart[STATUS_KEY] !== STATUS_UPDATING) {
                            otherChart.dispatchAction(action);
                        }
                    });
                    updateConnectedChartsStatus(otherCharts, STATUS_UPDATED);
                }
            });
        });
    }
 
    /**
     * @param {HTMLDomElement} dom
     * @param {Object} [theme]
     * @param {Object} opts
     * @param {number} [opts.devicePixelRatio] Use window.devicePixelRatio by default
     * @param {string} [opts.renderer] Currently only 'canvas' is supported.
     * @param {number} [opts.width] Use clientWidth of the input `dom` by default.
     *                              Can be 'auto' (the same as null/undefined)
     * @param {number} [opts.height] Use clientHeight of the input `dom` by default.
     *                               Can be 'auto' (the same as null/undefined)
     */
    echarts.init = function (dom, theme, opts) {
        if (__DEV__) {
            // Check version
            if ((zrender.version.replace('.', '') - 0) < (echarts.dependencies.zrender.replace('.', '') - 0)) {
                throw new Error(
                    'ZRender ' + zrender.version
                    + ' is too old for ECharts ' + echarts.version
                    + '. Current version need ZRender '
                    + echarts.dependencies.zrender + '+'
                );
            }
            if (!dom) {
                throw new Error('Initialize failed: invalid dom.');
            }
            if (zrUtil.isDom(dom)
                && dom.nodeName.toUpperCase() !== 'CANVAS'
                && (
                    (!dom.clientWidth && (!opts || opts.width == null))
                    || (!dom.clientHeight && (!opts || opts.height == null))
                )
            ) {
                console.warn('Can\'t get dom width or height');
            }
        }
 
        var chart = new ECharts(dom, theme, opts);
        chart.id = 'ec_' + idBase++;
        instances[chart.id] = chart;
 
        dom.setAttribute &&
            dom.setAttribute(DOM_ATTRIBUTE_KEY, chart.id);
 
        enableConnect(chart);
 
        return chart;
    };
 
    /**
     * @return {string|Array.<module:echarts~ECharts>} groupId
     */
    echarts.connect = function (groupId) {
        // Is array of charts
        if (zrUtil.isArray(groupId)) {
            var charts = groupId;
            groupId = null;
            // If any chart has group
            zrUtil.each(charts, function (chart) {
                if (chart.group != null) {
                    groupId = chart.group;
                }
            });
            groupId = groupId || ('g_' + groupIdBase++);
            zrUtil.each(charts, function (chart) {
                chart.group = groupId;
            });
        }
        connectedGroups[groupId] = true;
        return groupId;
    };
 
    /**
     * @DEPRECATED
     * @return {string} groupId
     */
    echarts.disConnect = function (groupId) {
        connectedGroups[groupId] = false;
    };
 
    /**
     * @return {string} groupId
     */
    echarts.disconnect = echarts.disConnect;
 
    /**
     * Dispose a chart instance
     * @param  {module:echarts~ECharts|HTMLDomElement|string} chart
     */
    echarts.dispose = function (chart) {
        if (zrUtil.isDom(chart)) {
            chart = echarts.getInstanceByDom(chart);
        }
        else if (typeof chart === 'string') {
            chart = instances[chart];
        }
        if ((chart instanceof ECharts) && !chart.isDisposed()) {
            chart.dispose();
        }
    };
 
    /**
     * @param  {HTMLDomElement} dom
     * @return {echarts~ECharts}
     */
    echarts.getInstanceByDom = function (dom) {
        var key = dom.getAttribute(DOM_ATTRIBUTE_KEY);
        return instances[key];
    };
    /**
     * @param {string} key
     * @return {echarts~ECharts}
     */
    echarts.getInstanceById = function (key) {
        return instances[key];
    };
 
    /**
     * Register theme
     */
    echarts.registerTheme = function (name, theme) {
        themeStorage[name] = theme;
    };
 
    /**
     * Register option preprocessor
     * @param {Function} preprocessorFunc
     */
    echarts.registerPreprocessor = function (preprocessorFunc) {
        optionPreprocessorFuncs.push(preprocessorFunc);
    };
 
    /**
     * @param {number} [priority=1000]
     * @param {Function} processorFunc
     */
    echarts.registerProcessor = function (priority, processorFunc) {
        if (typeof priority === 'function') {
            processorFunc = priority;
            priority = PRIORITY_PROCESSOR_FILTER;
        }
        Eif (__DEV__) {
            Iif (isNaN(priority)) {
                throw new Error('Unkown processor priority');
            }
        }
        dataProcessorFuncs.push({
            prio: priority,
            func: processorFunc
        });
    };
 
    /**
     * Register postUpdater
     * @param {Function} postUpdateFunc
     */
    echarts.registerPostUpdate = function (postUpdateFunc) {
        postUpdateFuncs.push(postUpdateFunc);
    };
 
    /**
     * Usage:
     * registerAction('someAction', 'someEvent', function () { ... });
     * registerAction('someAction', function () { ... });
     * registerAction(
     *     {type: 'someAction', event: 'someEvent', update: 'updateView'},
     *     function () { ... }
     * );
     *
     * @param {(string|Object)} actionInfo
     * @param {string} actionInfo.type
     * @param {string} [actionInfo.event]
     * @param {string} [actionInfo.update]
     * @param {string} [eventName]
     * @param {Function} action
     */
    echarts.registerAction = function (actionInfo, eventName, action) {
        if (typeof eventName === 'function') {
            action = eventName;
            eventName = '';
        }
        var actionType = zrUtil.isObject(actionInfo)
            ? actionInfo.type
            : ([actionInfo, actionInfo = {
                event: eventName
            }][0]);
 
        // Event name is all lowercase
        actionInfo.event = (actionInfo.event || actionType).toLowerCase();
        eventName = actionInfo.event;
 
        // Validate action type and event name.
        zrUtil.assert(ACTION_REG.test(actionType) && ACTION_REG.test(eventName));
 
        if (!actions[actionType]) {
            actions[actionType] = {action: action, actionInfo: actionInfo};
        }
        eventActionMap[eventName] = actionType;
    };
 
    /**
     * @param {string} type
     * @param {*} CoordinateSystem
     */
    echarts.registerCoordinateSystem = function (type, CoordinateSystem) {
        CoordinateSystemManager.register(type, CoordinateSystem);
    };
 
    /**
     * Layout is a special stage of visual encoding
     * Most visual encoding like color are common for different chart
     * But each chart has it's own layout algorithm
     *
     * @param {number} [priority=1000]
     * @param {Function} layoutFunc
     */
    echarts.registerLayout = function (priority, layoutFunc) {
        if (typeof priority === 'function') {
            layoutFunc = priority;
            priority = PRIORITY_VISUAL_LAYOUT;
        }
        Eif (__DEV__) {
            Iif (isNaN(priority)) {
                throw new Error('Unkown layout priority');
            }
        }
        visualFuncs.push({
            prio: priority,
            func: layoutFunc,
            isLayout: true
        });
    };
 
    /**
     * @param {number} [priority=3000]
     * @param {Function} visualFunc
     */
    echarts.registerVisual = function (priority, visualFunc) {
        if (typeof priority === 'function') {
            visualFunc = priority;
            priority = PRIORITY_VISUAL_CHART;
        }
        Eif (__DEV__) {
            if (isNaN(priority)) {
                throw new Error('Unkown visual priority');
            }
        }
        visualFuncs.push({
            prio: priority,
            func: visualFunc
        });
    };
 
    /**
     * @param {string} name
     */
    echarts.registerLoading = function (name, loadingFx) {
        loadingEffects[name] = loadingFx;
    };
 
    /**
     * @param {Object} opts
     * @param {string} [superClass]
     */
    echarts.extendComponentModel = function (opts/*, superClass*/) {
        // var Clazz = ComponentModel;
        // if (superClass) {
        //     var classType = parseClassType(superClass);
        //     Clazz = ComponentModel.getClass(classType.main, classType.sub, true);
        // }
        return ComponentModel.extend(opts);
    };
 
    /**
     * @param {Object} opts
     * @param {string} [superClass]
     */
    echarts.extendComponentView = function (opts/*, superClass*/) {
        // var Clazz = ComponentView;
        // if (superClass) {
        //     var classType = parseClassType(superClass);
        //     Clazz = ComponentView.getClass(classType.main, classType.sub, true);
        // }
        return ComponentView.extend(opts);
    };
 
    /**
     * @param {Object} opts
     * @param {string} [superClass]
     */
    echarts.extendSeriesModel = function (opts/*, superClass*/) {
        // var Clazz = SeriesModel;
        // if (superClass) {
        //     superClass = 'series.' + superClass.replace('series.', '');
        //     var classType = parseClassType(superClass);
        //     Clazz = ComponentModel.getClass(classType.main, classType.sub, true);
        // }
        return SeriesModel.extend(opts);
    };
 
    /**
     * @param {Object} opts
     * @param {string} [superClass]
     */
    echarts.extendChartView = function (opts/*, superClass*/) {
        // var Clazz = ChartView;
        // if (superClass) {
        //     superClass = superClass.replace('series.', '');
        //     var classType = parseClassType(superClass);
        //     Clazz = ChartView.getClass(classType.main, true);
        // }
        return ChartView.extend(opts);
    };
 
    /**
     * ZRender need a canvas context to do measureText.
     * But in node environment canvas may be created by node-canvas.
     * So we need to specify how to create a canvas instead of using document.createElement('canvas')
     *
     * Be careful of using it in the browser.
     *
     * @param {Function} creator
     * @example
     *     var Canvas = require('canvas');
     *     var echarts = require('echarts');
     *     echarts.setCanvasCreator(function () {
     *         // Small size is enough.
     *         return new Canvas(32, 32);
     *     });
     */
    echarts.setCanvasCreator = function (creator) {
        zrUtil.createCanvas = creator;
    };
 
    echarts.registerVisual(PRIORITY_VISUAL_GLOBAL, require('./visual/seriesColor'));
    echarts.registerPreprocessor(require('./preprocessor/backwardCompat'));
    echarts.registerLoading('default', require('./loading/default'));
 
    // Default action
    echarts.registerAction({
        type: 'highlight',
        event: 'highlight',
        update: 'highlight'
    }, zrUtil.noop);
    echarts.registerAction({
        type: 'downplay',
        event: 'downplay',
        update: 'downplay'
    }, zrUtil.noop);
 
 
    // --------
    // Exports
    // --------
    echarts.zrender = zrender;
 
    echarts.List = require('./data/List');
    echarts.Model = require('./model/Model');
 
    echarts.Axis = require('./coord/Axis');
 
    echarts.graphic = require('./util/graphic');
    echarts.number = require('./util/number');
    echarts.format = require('./util/format');
    echarts.throttle = throttle.throttle;
    echarts.matrix = require('zrender/lib/core/matrix');
    echarts.vector = require('zrender/lib/core/vector');
    echarts.color = require('zrender/lib/tool/color');
 
    echarts.util = {};
    each([
            'map', 'each', 'filter', 'indexOf', 'inherits', 'reduce', 'filter',
            'bind', 'curry', 'isArray', 'isString', 'isObject', 'isFunction',
            'extend', 'defaults', 'clone', 'merge'
        ],
        function (name) {
            echarts.util[name] = zrUtil[name];
        }
    );
 
    echarts.helper = require('./helper');
 
 
    // PRIORITY
    echarts.PRIORITY = {
        PROCESSOR: {
            FILTER: PRIORITY_PROCESSOR_FILTER,
            STATISTIC: PRIORITY_PROCESSOR_STATISTIC
        },
        VISUAL: {
            LAYOUT: PRIORITY_VISUAL_LAYOUT,
            GLOBAL: PRIORITY_VISUAL_GLOBAL,
            CHART: PRIORITY_VISUAL_CHART,
            COMPONENT: PRIORITY_VISUAL_COMPONENT,
            BRUSH: PRIORITY_VISUAL_BRUSH
        }
    };
 
    module.exports = echarts;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/helper.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/helper.js

Statements: 38.89% (7 / 18)      Branches: 0% (0 / 2)      Functions: 0% (0 / 3)      Lines: 38.89% (7 / 18)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81    1 1 1 1 1 1   1                                                                                                                                              
 
 
    var createListFromArray = require('./chart/helper/createListFromArray');
    var symbolUtil = require('./util/symbol');
    var axisHelper = require('./coord/axisHelper');
    var axisModelCommonMixin = require('./coord/axisModelCommonMixin');
    var Model = require('./model/Model');
    var util = require('zrender/lib/core/util');
 
    module.exports = {
        /**
         * Create a muti dimension List structure from seriesModel.
         * @param  {module:echarts/model/Model} seriesModel
         * @return {module:echarts/data/List} list
         */
        createList: function (seriesModel) {
            var data = seriesModel.get('data');
            return createListFromArray(data, seriesModel, seriesModel.ecModel);
        },
 
        /**
         * Complete the dimensions array guessed from the data structure.
         * @param  {Array.<string>} dimensions Necessary dimensions, like ['x', 'y']
         * @param  {Array} data Data list. [[1, 2, 3], [2, 3, 4]]
         * @param  {Object} [opt]
         * @param  {Array.<string>} [opt.defaultNames] Default names to fill not necessary dimensions, like ['value']
         * @param  {string} [opt.extraPrefix] Prefix of name when filling the left dimensions.
         * @param  {number} [opt.dimCount] If not specified, guess by the first data item.
         * @return {Array.<string>}
         */
        completeDimensions: require('./data/helper/completeDimensions'),
 
        /**
         * Create a symbol element with given symbol configuration: shape, x, y, width, height, color
         * @see http://echarts.baidu.com/option.html#series-scatter.symbol
         * @param {string} symbolDesc
         * @param {number} x
         * @param {number} y
         * @param {number} w
         * @param {number} h
         * @param {string} color
         */
        createSymbol: symbolUtil.createSymbol,
 
        /**
         * Create scale
         * @param {Array.<number>} dataExtent
         * @param {Object|module:echarts/Model} option
         */
        createScale: function (dataExtent, option) {
            var axisModel = option;
            if (!(option instanceof Model)) {
                axisModel = new Model(option);
                util.mixin(axisModel, axisModelCommonMixin);
            }
 
            var scale = axisHelper.createScaleByModel(axisModel);
            scale.setExtent(dataExtent[0], dataExtent[1]);
 
            axisHelper.niceScaleExtent(scale, axisModel);
            return scale;
        },
 
        /**
         * Mixin common methods to axis model,
         *
         * Inlcude methods
         * `getFormattedLabels() => Array.<string>`
         * `getCategories() => Array.<string>`
         * `getMin(origin: boolean) => number`
         * `getMax(origin: boolean) => number`
         * `getNeedCrossZero() => boolean`
         * `setRange(start: number, end: number)`
         * `resetRange()`
         */
        mixinAxisModelCommonMethods: function (Model) {
            util.mixin(Model, axisModelCommonMixin);
        }
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/action/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/action/

Statements: 21.67% (13 / 60)      Branches: 0% (0 / 26)      Functions: 22.22% (2 / 9)      Lines: 21.67% (13 / 60)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/action/
File Statements Branches Functions Lines
createDataSelectAction.js 40% (6 / 15) 0% (0 / 4) 40% (2 / 5) 40% (6 / 15)
geoRoam.js 25% (4 / 16) 0% (0 / 10) 0% (0 / 3) 25% (4 / 16)
roamHelper.js 10.34% (3 / 29) 0% (0 / 12) 0% (0 / 1) 10.34% (3 / 29)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/action/createDataSelectAction.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/action/createDataSelectAction.js

Statements: 40% (6 / 15)      Branches: 0% (0 / 4)      Functions: 40% (2 / 5)      Lines: 40% (6 / 15)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36  1 1 1 2 6           6                                                
 
    var echarts = require('../echarts');
    var zrUtil = require('zrender/lib/core/util');
    module.exports = function (seriesType, actionInfos) {
        zrUtil.each(actionInfos, function (actionInfo) {
            actionInfo.update = 'updateView';
            /**
             * @payload
             * @property {string} seriesName
             * @property {string} name
             */
            echarts.registerAction(actionInfo, function (payload, ecModel) {
                var selected = {};
                ecModel.eachComponent(
                    {mainType: 'series', subType: seriesType, query: payload},
                    function (seriesModel) {
                        if (seriesModel[actionInfo.method]) {
                            seriesModel[actionInfo.method](payload.name);
                        }
                        var data = seriesModel.getData();
                        // Create selected map
                        data.each(function (idx) {
                            var name = data.getName(idx);
                            selected[name] = seriesModel.isSelected(name) || false;
                        });
                    }
                );
                return {
                    name: payload.name,
                    selected: selected
                };
            });
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/action/geoRoam.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/action/geoRoam.js

Statements: 25% (4 / 16)      Branches: 0% (0 / 10)      Functions: 0% (0 / 3)      Lines: 25% (4 / 16)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54    1 1   1                     1                                                                          
 
 
    var zrUtil = require('zrender/lib/core/util');
    var roamHelper = require('./roamHelper');
 
    var echarts = require('../echarts');
 
    /**
     * @payload
     * @property {string} [componentType=series]
     * @property {number} [dx]
     * @property {number} [dy]
     * @property {number} [zoom]
     * @property {number} [originX]
     * @property {number} [originY]
     */
    echarts.registerAction({
        type: 'geoRoam',
        event: 'geoRoam',
        update: 'updateLayout'
    }, function (payload, ecModel) {
        var componentType = payload.componentType || 'series';
 
        ecModel.eachComponent(
            { mainType: componentType, query: payload },
            function (componentModel) {
                var geo = componentModel.coordinateSystem;
                if (geo.type !== 'geo') {
                    return;
                }
 
                var res = roamHelper.updateCenterAndZoom(
                    geo, payload, componentModel.get('scaleLimit')
                );
 
                componentModel.setCenter
                    && componentModel.setCenter(res.center);
 
                componentModel.setZoom
                    && componentModel.setZoom(res.zoom);
 
                // All map series with same `map` use the same geo coordinate system
                // So the center and zoom must be in sync. Include the series not selected by legend
                if (componentType === 'series') {
                    zrUtil.each(componentModel.seriesGroup, function (seriesModel) {
                        seriesModel.setCenter(res.center);
                        seriesModel.setZoom(res.zoom);
                    });
                }
            }
        );
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/action/roamHelper.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/action/roamHelper.js

Statements: 10.34% (3 / 29)      Branches: 0% (0 / 12)      Functions: 0% (0 / 1)      Lines: 10.34% (3 / 29)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61    1             1                                                                                                 1    
 
 
    var roamHelper = {};
 
    /**
     * @param {module:echarts/coord/View} view
     * @param {Object} payload
     * @param {Object} [zoomLimit]
     */
    roamHelper.updateCenterAndZoom = function (
        view, payload, zoomLimit
    ) {
        var previousZoom = view.getZoom();
        var center = view.getCenter();
        var zoom = payload.zoom;
 
        var point = view.dataToPoint(center);
 
        if (payload.dx != null && payload.dy != null) {
            point[0] -= payload.dx;
            point[1] -= payload.dy;
 
            var center = view.pointToData(point);
            view.setCenter(center);
        }
        if (zoom != null) {
            if (zoomLimit) {
                var zoomMin = zoomLimit.min || 0;
                var zoomMax = zoomLimit.max || Infinity;
                zoom = Math.max(
                    Math.min(previousZoom * zoom, zoomMax),
                    zoomMin
                ) / previousZoom;
            }
 
            // Zoom on given point(originX, originY)
            view.scale[0] *= zoom;
            view.scale[1] *= zoom;
            var position = view.position;
            var fixX = (payload.originX - position[0]) * (zoom - 1);
            var fixY = (payload.originY - position[1]) * (zoom - 1);
 
            position[0] -= fixX;
            position[1] -= fixY;
 
            view.updateTransform();
            // Get the new center
            var center = view.pointToData(point);
            view.setCenter(center);
            view.setZoom(zoom * previousZoom);
        }
 
        return {
            center: view.getCenter(),
            zoom: view.getZoom()
        };
    };
 
    module.exports = roamHelper;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/

Statements: 97.9% (140 / 143)      Branches: 100% (0 / 0)      Functions: 0% (0 / 2)      Lines: 97.9% (140 / 143)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/chart/
File Statements Branches Functions Lines
bar.js 75% (9 / 12) 100% (0 / 0) 0% (0 / 2) 75% (9 / 12)
boxplot.js 100% (5 / 5) 100% (0 / 0) 100% (0 / 0) 100% (5 / 5)
candlestick.js 100% (6 / 6) 100% (0 / 0) 100% (0 / 0) 100% (6 / 6)
chord.js 100% (7 / 7) 100% (0 / 0) 100% (0 / 0) 100% (7 / 7)
effectScatter.js 100% (6 / 6) 100% (0 / 0) 100% (0 / 0) 100% (6 / 6)
funnel.js 100% (7 / 7) 100% (0 / 0) 100% (0 / 0) 100% (7 / 7)
gauge.js 100% (2 / 2) 100% (0 / 0) 100% (0 / 0) 100% (2 / 2)
graph.js 100% (13 / 13) 100% (0 / 0) 100% (0 / 0) 100% (13 / 13)
heatmap.js 100% (2 / 2) 100% (0 / 0) 100% (0 / 0) 100% (2 / 2)
line.js 100% (9 / 9) 100% (0 / 0) 100% (0 / 0) 100% (9 / 9)
lines.js 100% (5 / 5) 100% (0 / 0) 100% (0 / 0) 100% (5 / 5)
map.js 100% (11 / 11) 100% (0 / 0) 100% (0 / 0) 100% (11 / 11)
parallel.js 100% (5 / 5) 100% (0 / 0) 100% (0 / 0) 100% (5 / 5)
pictorialBar.js 100% (9 / 9) 100% (0 / 0) 100% (0 / 0) 100% (9 / 9)
pie.js 100% (8 / 8) 100% (0 / 0) 100% (0 / 0) 100% (8 / 8)
radar.js 100% (10 / 10) 100% (0 / 0) 100% (0 / 0) 100% (10 / 10)
sankey.js 100% (5 / 5) 100% (0 / 0) 100% (0 / 0) 100% (5 / 5)
scatter.js 100% (7 / 7) 100% (0 / 0) 100% (0 / 0) 100% (7 / 7)
themeRiver.js 100% (8 / 8) 100% (0 / 0) 100% (0 / 0) 100% (8 / 8)
treemap.js 100% (6 / 6) 100% (0 / 0) 100% (0 / 0) 100% (6 / 6)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/bar.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/bar.js

Statements: 75% (9 / 12)      Branches: 100% (0 / 0)      Functions: 0% (0 / 2)      Lines: 75% (9 / 12)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25    1   1   1 1   1 1   1   1               1    
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    require('../coord/cartesian/Grid');
 
    require('./bar/BarSeries');
    require('./bar/BarView');
 
    var barLayoutGrid = require('../layout/barGrid');
    var echarts = require('../echarts');
 
    echarts.registerLayout(zrUtil.curry(barLayoutGrid, 'bar'));
    // Visual coding for legend
    echarts.registerVisual(function (ecModel) {
        ecModel.eachSeriesByType('bar', function (seriesModel) {
            var data = seriesModel.getData();
            data.setVisual('legendSymbol', 'roundRect');
        });
    });
 
    // In case developer forget to include grid component
    require('../component/gridSimple');
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/boxplot.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/boxplot.js

Statements: 100% (5 / 5)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (5 / 5)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12    1   1 1   1 1      
 
 
    var echarts = require('../echarts');
 
    require('./boxplot/BoxplotSeries');
    require('./boxplot/BoxplotView');
 
    echarts.registerVisual(require('./boxplot/boxplotVisual'));
    echarts.registerLayout(require('./boxplot/boxplotLayout'));
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/candlestick.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/candlestick.js

Statements: 100% (6 / 6)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (6 / 6)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16    1   1 1   1       1 1      
 
 
    var echarts = require('../echarts');
 
    require('./candlestick/CandlestickSeries');
    require('./candlestick/CandlestickView');
 
    echarts.registerPreprocessor(
        require('./candlestick/preprocessor')
    );
 
    echarts.registerVisual(require('./candlestick/candlestickVisual'));
    echarts.registerLayout(require('./candlestick/candlestickLayout'));
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/chord.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/chord.js

Statements: 100% (7 / 7)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (7 / 7)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14    1 1   1 1 1   1   1    
 
 
    require('./chord/ChordSeries');
    require('./chord/ChordView');
 
    var echarts = require('../echarts');
    var zrUtil = require('zrender/lib/core/util');
    echarts.registerLayout(require('./chord/chordCircularLayout'));
 
    echarts.registerVisual(zrUtil.curry(require('../visual/dataColor'), 'chord'));
 
    echarts.registerProcessor(zrUtil.curry(require('../processor/dataFilter'), 'pie'));
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/effectScatter.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/effectScatter.js

Statements: 100% (6 / 6)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (6 / 6)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16    1 1   1 1   1     1        
 
 
    var zrUtil = require('zrender/lib/core/util');
    var echarts = require('../echarts');
 
    require('./effectScatter/EffectScatterSeries');
    require('./effectScatter/EffectScatterView');
 
    echarts.registerVisual(zrUtil.curry(
        require('../visual/symbol'), 'effectScatter', 'circle', null
    ));
    echarts.registerLayout(zrUtil.curry(
        require('../layout/points'), 'effectScatter'
    ));
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/funnel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/funnel.js

Statements: 100% (7 / 7)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (7 / 7)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14    1 1   1 1   1 1   1    
 
 
    var zrUtil = require('zrender/lib/core/util');
    var echarts = require('../echarts');
 
    require('./funnel/FunnelSeries');
    require('./funnel/FunnelView');
 
    echarts.registerVisual(zrUtil.curry(require('../visual/dataColor'), 'funnel'));
    echarts.registerLayout(require('./funnel/funnelLayout'));
 
    echarts.registerProcessor(zrUtil.curry(require('../processor/dataFilter'), 'funnel'));
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/gauge.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/gauge.js

Statements: 100% (2 / 2)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (2 / 2)      Ignored: none     

1 2 3 4 5  1 1    
 
    require('./gauge/GaugeSeries');
    require('./gauge/GaugeView');
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph.js

Statements: 100% (13 / 13)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (13 / 13)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28    1 1   1 1   1   1   1     1 1   1 1 1     1        
 
 
    var echarts = require('../echarts');
    var zrUtil = require('zrender/lib/core/util');
 
    require('./graph/GraphSeries');
    require('./graph/GraphView');
 
    require('./graph/graphAction');
 
    echarts.registerProcessor(require('./graph/categoryFilter'));
 
    echarts.registerVisual(zrUtil.curry(
        require('../visual/symbol'), 'graph', 'circle', null
    ));
    echarts.registerVisual(require('./graph/categoryVisual'));
    echarts.registerVisual(require('./graph/edgeVisual'));
 
    echarts.registerLayout(require('./graph/simpleLayout'));
    echarts.registerLayout(require('./graph/circularLayout'));
    echarts.registerLayout(require('./graph/forceLayout'));
 
    // Graph view coordinate system
    echarts.registerCoordinateSystem('graphView', {
        create: require('./graph/createView')
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/heatmap.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/heatmap.js

Statements: 100% (2 / 2)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (2 / 2)      Ignored: none     

1 2 3 4 5 6    1 1    
 
 
    require('./heatmap/HeatmapSeries');
    require('./heatmap/HeatmapView');
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/line.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/line.js

Statements: 100% (9 / 9)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (9 / 9)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25    1 1 1   1 1   1     1         1         1    
 
 
    var zrUtil = require('zrender/lib/core/util');
    var echarts = require('../echarts');
    var PRIORITY = echarts.PRIORITY;
 
    require('./line/LineSeries');
    require('./line/LineView');
 
    echarts.registerVisual(zrUtil.curry(
        require('../visual/symbol'), 'line', 'circle', 'line'
    ));
    echarts.registerLayout(zrUtil.curry(
        require('../layout/points'), 'line'
    ));
 
    // Down sample after filter
    echarts.registerProcessor(PRIORITY.PROCESSOR.STATISTIC, zrUtil.curry(
        require('../processor/dataSample'), 'line'
    ));
 
    // In case developer forget to include grid component
    require('../component/gridSimple');
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/lines.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/lines.js

Statements: 100% (5 / 5)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (5 / 5)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14    1 1   1 1     1        
 
 
    require('./lines/LinesSeries');
    require('./lines/LinesView');
 
    var echarts = require('../echarts');
    echarts.registerLayout(
        require('./lines/linesLayout')
    );
    echarts.registerVisual(
        require('./lines/linesVisual')
    );
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/map.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/map.js

Statements: 100% (11 / 11)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (11 / 11)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36    1 1   1   1   1   1   1   1   1   1   1                            
 
 
    var echarts = require('../echarts');
    var PRIORITY = echarts.PRIORITY;
 
    require('./map/MapSeries');
 
    require('./map/MapView');
 
    require('../action/geoRoam');
 
    require('../coord/geo/geoCreator');
 
    echarts.registerLayout(require('./map/mapSymbolLayout'));
 
    echarts.registerVisual(require('./map/mapVisual'));
 
    echarts.registerProcessor(PRIORITY.PROCESSOR.STATISTIC, require('./map/mapDataStatistic'));
 
    echarts.registerPreprocessor(require('./map/backwardCompat'));
 
    require('../action/createDataSelectAction')('map', [{
        type: 'mapToggleSelect',
        event: 'mapselectchanged',
        method: 'toggleSelected'
    }, {
        type: 'mapSelect',
        event: 'mapselected',
        method: 'select'
    }, {
        type: 'mapUnSelect',
        event: 'mapunselected',
        method: 'unSelect'
    }]);
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/parallel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/parallel.js

Statements: 100% (5 / 5)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (5 / 5)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13    1   1   1 1   1      
 
 
    var echarts = require('../echarts');
 
    require('../component/parallel');
 
    require('./parallel/ParallelSeries');
    require('./parallel/ParallelView');
 
    echarts.registerVisual(require('./parallel/parallelVisual'));
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/pictorialBar.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/pictorialBar.js

Statements: 100% (9 / 9)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (9 / 9)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22    1   1   1 1   1 1   1   1         1    
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    require('../coord/cartesian/Grid');
 
    require('./bar/PictorialBarSeries');
    require('./bar/PictorialBarView');
 
    var barLayoutGrid = require('../layout/barGrid');
    var echarts = require('../echarts');
 
    echarts.registerLayout(zrUtil.curry(barLayoutGrid, 'pictorialBar'));
 
    echarts.registerVisual(zrUtil.curry(
        require('../visual/symbol'), 'pictorialBar', 'roundRect', null
    ));
 
    // In case developer forget to include grid component
    require('../component/gridSimple');
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/pie.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/pie.js

Statements: 100% (8 / 8)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (8 / 8)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31    1 1   1 1   1                           1   1       1    
 
 
    var zrUtil = require('zrender/lib/core/util');
    var echarts = require('../echarts');
 
    require('./pie/PieSeries');
    require('./pie/PieView');
 
    require('../action/createDataSelectAction')('pie', [{
        type: 'pieToggleSelect',
        event: 'pieselectchanged',
        method: 'toggleSelected'
    }, {
        type: 'pieSelect',
        event: 'pieselected',
        method: 'select'
    }, {
        type: 'pieUnSelect',
        event: 'pieunselected',
        method: 'unSelect'
    }]);
 
    echarts.registerVisual(zrUtil.curry(require('../visual/dataColor'), 'pie'));
 
    echarts.registerLayout(zrUtil.curry(
        require('./pie/pieLayout'), 'pie'
    ));
 
    echarts.registerProcessor(zrUtil.curry(require('../processor/dataFilter'), 'pie'));
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/radar.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/radar.js

Statements: 100% (10 / 10)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (10 / 10)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24    1 1     1   1 1   1 1     1   1       1    
 
 
    var zrUtil = require('zrender/lib/core/util');
    var echarts = require('../echarts');
 
    // Must use radar component
    require('../component/radar');
 
    require('./radar/RadarSeries');
    require('./radar/RadarView');
 
    echarts.registerVisual(zrUtil.curry(require('../visual/dataColor'), 'radar'));
    echarts.registerVisual(zrUtil.curry(
        require('../visual/symbol'), 'radar', 'circle', null
    ));
    echarts.registerLayout(require('./radar/radarLayout'));
 
    echarts.registerProcessor(
        zrUtil.curry(require('../processor/dataFilter'), 'radar')
    );
 
    echarts.registerPreprocessor(require('./radar/backwardCompat'));
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/sankey.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/sankey.js

Statements: 100% (5 / 5)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (5 / 5)      Ignored: none     

1 2 3 4 5 6 7 8 9 10    1   1 1 1 1    
 
 
    var echarts = require('../echarts');
 
    require('./sankey/SankeySeries');
    require('./sankey/SankeyView');
    echarts.registerLayout(require('./sankey/sankeyLayout'));
    echarts.registerVisual(require('./sankey/sankeyVisual'));
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/scatter.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/scatter.js

Statements: 100% (7 / 7)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (7 / 7)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19    1 1   1 1   1     1         1    
 
 
    var zrUtil = require('zrender/lib/core/util');
    var echarts = require('../echarts');
 
    require('./scatter/ScatterSeries');
    require('./scatter/ScatterView');
 
    echarts.registerVisual(zrUtil.curry(
        require('../visual/symbol'), 'scatter', 'circle', null
    ));
    echarts.registerLayout(zrUtil.curry(
        require('../layout/points'), 'scatter'
    ));
 
    // In case developer forget to include grid component
    require('../component/gridSimple');
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/themeRiver.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/themeRiver.js

Statements: 100% (8 / 8)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (8 / 8)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20    1 1   1   1   1   1   1   1        
 
 
    var echarts = require('../echarts');
    var zrUtil = require('zrender/lib/core/util');
 
    require('../component/singleAxis');
 
    require('./themeRiver/ThemeRiverSeries');
 
    require('./themeRiver/ThemeRiverView');
 
    echarts.registerLayout(require('./themeRiver/themeRiverLayout'));
 
    echarts.registerVisual(require('./themeRiver/themeRiverVisual'));
 
    echarts.registerProcessor(
        zrUtil.curry(require('../processor/dataFilter'), 'themeRiver')
    );
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/treemap.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/treemap.js

Statements: 100% (6 / 6)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (6 / 6)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13    1   1 1 1   1   1    
 
 
    var echarts = require('../echarts');
 
    require('./treemap/TreemapSeries');
    require('./treemap/TreemapView');
    require('./treemap/treemapAction');
 
    echarts.registerVisual(require('./treemap/treemapVisual'));
 
    echarts.registerLayout(require('./treemap/treemapLayout'));
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/bar/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/bar/

Statements: 14.32% (64 / 447)      Branches: 0% (0 / 190)      Functions: 0% (0 / 63)      Lines: 14.32% (64 / 447)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/chart/bar/
File Statements Branches Functions Lines
BarSeries.js 100% (1 / 1) 100% (0 / 0) 100% (0 / 0) 100% (1 / 1)
BarView.js 14.63% (12 / 82) 0% (0 / 38) 0% (0 / 13) 14.63% (12 / 82)
BaseBarSeries.js 16.67% (3 / 18) 0% (0 / 8) 0% (0 / 2) 16.67% (3 / 18)
PictorialBarSeries.js 50% (2 / 4) 100% (0 / 0) 0% (0 / 1) 50% (2 / 4)
PictorialBarView.js 11.99% (38 / 317) 0% (0 / 134) 0% (0 / 44) 11.99% (38 / 317)
barItemStyle.js 28.57% (2 / 7) 0% (0 / 4) 0% (0 / 1) 28.57% (2 / 7)
helper.js 33.33% (6 / 18) 0% (0 / 6) 0% (0 / 2) 33.33% (6 / 18)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/bar/BarSeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/bar/BarSeries.js

Statements: 100% (1 / 1)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (1 / 1)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12    1                  
 
 
    module.exports = require('./BaseBarSeries').extend({
 
        type: 'series.bar',
 
        dependencies: ['grid', 'polar'],
 
        brushSelector: 'rect'
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/bar/BarView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/bar/BarView.js

Statements: 14.63% (12 / 82)      Branches: 0% (0 / 38)      Functions: 0% (0 / 13)      Lines: 14.63% (12 / 82)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184      1 1 1   1       1   1                                                                                                                                                                                 1                                   1                       1                             1                                                         1         1    
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
    var graphic = require('../../util/graphic');
    var helper = require('./helper');
 
    var BAR_BORDER_WIDTH_QUERY = ['itemStyle', 'normal', 'barBorderWidth'];
 
    // FIXME
    // Just for compatible with ec2.
    zrUtil.extend(require('../../model/Model').prototype, require('./barItemStyle'));
 
    var BarView = require('../../echarts').extendChartView({
 
        type: 'bar',
 
        render: function (seriesModel, ecModel, api) {
            var coordinateSystemType = seriesModel.get('coordinateSystem');
 
            if (coordinateSystemType === 'cartesian2d') {
                this._renderOnCartesian(seriesModel, ecModel, api);
            }
 
            return this.group;
        },
 
        dispose: zrUtil.noop,
 
        _renderOnCartesian: function (seriesModel, ecModel, api) {
            var group = this.group;
            var data = seriesModel.getData();
            var oldData = this._data;
 
            var cartesian = seriesModel.coordinateSystem;
            var baseAxis = cartesian.getBaseAxis();
            var isHorizontal = baseAxis.isHorizontal();
            var animationModel = seriesModel.isAnimationEnabled() ? seriesModel : null;
 
            data.diff(oldData)
                .add(function (dataIndex) {
                    if (!data.hasValue(dataIndex)) {
                        return;
                    }
 
                    var itemModel = data.getItemModel(dataIndex);
                    var layout = getRectItemLayout(data, dataIndex, itemModel);
                    var el = createRect(data, dataIndex, itemModel, layout, isHorizontal, animationModel);
                    data.setItemGraphicEl(dataIndex, el);
                    group.add(el);
 
                    updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontal);
                })
                .update(function (newIndex, oldIndex) {
                    var el = oldData.getItemGraphicEl(oldIndex);
 
                    if (!data.hasValue(newIndex)) {
                        group.remove(el);
                        return;
                    }
 
                    var itemModel = data.getItemModel(newIndex);
                    var layout = getRectItemLayout(data, newIndex, itemModel);
 
                    if (el) {
                        graphic.updateProps(el, {shape: layout}, animationModel, newIndex);
                    }
                    else {
                        el = createRect(data, newIndex, itemModel, layout, isHorizontal, animationModel, true);
                    }
 
                    data.setItemGraphicEl(newIndex, el);
                    // Add back
                    group.add(el);
 
                    updateStyle(el, data, newIndex, itemModel, layout, seriesModel, isHorizontal);
                })
                .remove(function (dataIndex) {
                    var el = oldData.getItemGraphicEl(dataIndex);
                    el && removeRect(dataIndex, animationModel, el);
                })
                .execute();
 
            this._data = data;
        },
 
        remove: function (ecModel, api) {
            var group = this.group;
            var data = this._data;
            if (ecModel.get('animation')) {
                if (data) {
                    data.eachItemGraphicEl(function (el) {
                        removeRect(el.dataIndex, ecModel, el);
                    });
                }
            }
            else {
                group.removeAll();
            }
        }
    });
 
    function createRect(data, dataIndex, itemModel, layout, isHorizontal, animationModel, isUpdate) {
        var rect = new graphic.Rect({shape: zrUtil.extend({}, layout)});
 
        // Animation
        if (animationModel) {
            var rectShape = rect.shape;
            var animateProperty = isHorizontal ? 'height' : 'width';
            var animateTarget = {};
            rectShape[animateProperty] = 0;
            animateTarget[animateProperty] = layout[animateProperty];
            graphic[isUpdate ? 'updateProps' : 'initProps'](rect, {
                shape: animateTarget
            }, animationModel, dataIndex);
        }
 
        return rect;
    }
 
    function removeRect(dataIndex, animationModel, el) {
        // Not show text when animating
        el.style.text = '';
        graphic.updateProps(el, {
            shape: {
                width: 0
            }
        }, animationModel, dataIndex, function () {
            el.parent && el.parent.remove(el);
        });
    }
 
    function getRectItemLayout(data, dataIndex, itemModel) {
        var layout = data.getItemLayout(dataIndex);
        var fixedLineWidth = getLineWidth(itemModel, layout);
 
        // fix layout with lineWidth
        var signX = layout.width > 0 ? 1 : -1;
        var signY = layout.height > 0 ? 1 : -1;
        return {
            x: layout.x + signX * fixedLineWidth / 2,
            y: layout.y + signY * fixedLineWidth / 2,
            width: layout.width - signX * fixedLineWidth,
            height: layout.height - signY * fixedLineWidth
        };
    }
 
    function updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontal) {
        var color = data.getItemVisual(dataIndex, 'color');
        var opacity = data.getItemVisual(dataIndex, 'opacity');
        var itemStyleModel = itemModel.getModel('itemStyle.normal');
        var hoverStyle = itemModel.getModel('itemStyle.emphasis').getBarItemStyle();
 
        el.setShape('r', itemStyleModel.get('barBorderRadius') || 0);
 
        el.useStyle(zrUtil.defaults(
            {
                fill: color,
                opacity: opacity
            },
            itemStyleModel.getBarItemStyle()
        ));
 
        var labelPositionOutside = isHorizontal
            ? (layout.height > 0 ? 'bottom' : 'top')
            : (layout.width > 0 ? 'left' : 'right');
 
        helper.setLabel(
            el.style, hoverStyle, itemModel, color,
            seriesModel, dataIndex, labelPositionOutside
        );
 
        graphic.setHoverStyle(el, hoverStyle);
    }
 
    // In case width or height are too small.
    function getLineWidth(itemModel, rawLayout) {
        var lineWidth = itemModel.get(BAR_BORDER_WIDTH_QUERY) || 0;
        return Math.min(lineWidth, Math.abs(rawLayout.width), Math.abs(rawLayout.height));
    }
 
    module.exports = BarView;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/bar/BaseBarSeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/bar/BaseBarSeries.js

Statements: 16.67% (3 / 18)      Branches: 0% (0 / 8)      Functions: 0% (0 / 2)      Lines: 16.67% (3 / 18)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71      1 1   1                                                                                                                                
'use strict';
 
 
    var SeriesModel = require('../../model/Series');
    var createListFromArray = require('../helper/createListFromArray');
 
    module.exports = SeriesModel.extend({
 
        type: 'series.__base_bar__',
 
        getInitialData: function (option, ecModel) {
            if (__DEV__) {
                var coordSys = option.coordinateSystem;
                if (coordSys !== 'cartesian2d') {
                    throw new Error('Bar only support cartesian2d coordinateSystem');
                }
            }
            return createListFromArray(option.data, this, ecModel);
        },
 
        getMarkerPosition: function (value) {
            var coordSys = this.coordinateSystem;
            if (coordSys) {
                // PENDING if clamp ?
                var pt = coordSys.dataToPoint(value, true);
                var data = this.getData();
                var offset = data.getLayout('offset');
                var size = data.getLayout('size');
                var offsetIndex = coordSys.getBaseAxis().isHorizontal() ? 0 : 1;
                pt[offsetIndex] += offset + size / 2;
                return pt;
            }
            return [NaN, NaN];
        },
 
        defaultOption: {
            zlevel: 0,                  // 一级层叠
            z: 2,                       // 二级层叠
            coordinateSystem: 'cartesian2d',
            legendHoverLink: true,
            // stack: null
 
            // Cartesian coordinate system
            // xAxisIndex: 0,
            // yAxisIndex: 0,
 
            // 最小高度改为0
            barMinHeight: 0,
 
            // barMaxWidth: null,
            // 默认自适应
            // barWidth: null,
            // 柱间距离,默认为柱形宽度的30%,可设固定值
            // barGap: '30%',
            // 类目间柱形距离,默认为类目间距的20%,可设固定值
            // barCategoryGap: '20%',
            // label: {
            //     normal: {
            //         show: false
            //     }
            // },
            itemStyle: {
                normal: {
                    // color: '各异'
                },
                emphasis: {}
            }
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/bar/PictorialBarSeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/bar/PictorialBarSeries.js

Statements: 50% (2 / 4)      Branches: 100% (0 / 0)      Functions: 0% (0 / 1)      Lines: 50% (2 / 4)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46    1                                                                                 1    
 
 
    var PictorialBarSeries = require('./BaseBarSeries').extend({
 
        type: 'series.pictorialBar',
 
        dependencies: ['grid'],
 
        defaultOption: {
            symbol: 'circle',     // Customized bar shape
            symbolSize: null,     // Can be ['100%', '100%'], null means auto.
            symbolRotate: null,
 
            symbolPosition: null, // 'start' or 'end' or 'center', null means auto.
            symbolOffset: null,
            symbolMargin: null,   // start margin and end margin. Can be a number or a percent string.
                                  // Auto margin by defualt.
            symbolRepeat: false,  // false/null/undefined, means no repeat.
                                  // Can be true, means auto calculate repeat times and cut by data.
                                  // Can be a number, specifies repeat times, and do not cut by data.
                                  // Can be 'fixed', means auto calculate repeat times but do not cut by data.
            symbolRepeatDirection: 'end', // 'end' means from 'start' to 'end'.
 
            symbolClip: false,
            symbolBoundingData: null,
            symbolPatternSize: 400, // 400 * 400 px
 
            barGap: '-100%',      // In most case, overlap is needed.
 
            // z can be set in data item, which is z2 actually.
 
            // Disable progressive
            progressive: 0,
            hoverAnimation: false // Open only when needed.
        },
 
        getInitialData: function (option) {
            // Disable stack.
            option.stack = null;
            return PictorialBarSeries.superApply(this, 'getInitialData', arguments);
        }
    });
 
    module.exports = PictorialBarSeries;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/bar/PictorialBarView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/bar/PictorialBarView.js

Statements: 11.99% (38 / 317)      Branches: 0% (0 / 134)      Functions: 0% (0 / 44)      Lines: 11.99% (38 / 317)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754    1 1 1 1 1   1   1     1         1   1                                                                                                                                                                                                                   1                                                                                                           1                                       1                                                                                       1                                     1                                                                                                                                                                                 1                                         1                                                                                                                     1                                   1           1             1                                                                                   1       1           1                                             1                                                           1             1               1         1                                   1                                                   1                                         1                                                   1               1             1                         1                                                                       1               1    
 
 
    var zrUtil = require('zrender/lib/core/util');
    var graphic = require('../../util/graphic');
    var symbolUtil = require('../../util/symbol');
    var numberUtil = require('../../util/number');
    var helper = require('./helper');
 
    var parsePercent = numberUtil.parsePercent;
 
    var BAR_BORDER_WIDTH_QUERY = ['itemStyle', 'normal', 'borderWidth'];
 
    // index: +isHorizontal
    var LAYOUT_ATTRS = [
        {xy: 'x', wh: 'width', index: 0, posDesc: ['left', 'right']},
        {xy: 'y', wh: 'height', index: 1, posDesc: ['top', 'bottom']}
    ];
 
    var pathForLineWidth = new graphic.Circle();
 
    var BarView = require('../../echarts').extendChartView({
 
        type: 'pictorialBar',
 
        render: function (seriesModel, ecModel, api) {
            var group = this.group;
            var data = seriesModel.getData();
            var oldData = this._data;
 
            var cartesian = seriesModel.coordinateSystem;
            var baseAxis = cartesian.getBaseAxis();
            var isHorizontal = !!baseAxis.isHorizontal();
            var coordSysRect = cartesian.grid.getRect();
 
            var opt = {
                ecSize: {width: api.getWidth(), height: api.getHeight()},
                seriesModel: seriesModel,
                coordSys: cartesian,
                coordSysExtent: [
                    [coordSysRect.x, coordSysRect.x + coordSysRect.width],
                    [coordSysRect.y, coordSysRect.y + coordSysRect.height]
                ],
                isHorizontal: isHorizontal,
                valueDim: LAYOUT_ATTRS[+isHorizontal],
                categoryDim: LAYOUT_ATTRS[1 - isHorizontal]
            };
 
            data.diff(oldData)
                .add(function (dataIndex) {
                    if (!data.hasValue(dataIndex)) {
                        return;
                    }
 
                    var itemModel = getItemModel(data, dataIndex);
                    var symbolMeta = getSymbolMeta(data, dataIndex, itemModel, opt);
 
                    var bar = createBar(data, opt, symbolMeta);
 
                    data.setItemGraphicEl(dataIndex, bar);
                    group.add(bar);
 
                    updateCommon(bar, opt, symbolMeta);
                })
                .update(function (newIndex, oldIndex) {
                    var bar = oldData.getItemGraphicEl(oldIndex);
 
                    if (!data.hasValue(newIndex)) {
                        group.remove(bar);
                        return;
                    }
 
                    var itemModel = getItemModel(data, newIndex);
                    var symbolMeta = getSymbolMeta(data, newIndex, itemModel, opt);
 
                    var pictorialShapeStr = getShapeStr(data, symbolMeta);
                    if (bar && pictorialShapeStr !== bar.__pictorialShapeStr) {
                        group.remove(bar);
                        data.setItemGraphicEl(newIndex, null);
                        bar = null;
                    }
 
                    if (bar) {
                        updateBar(bar, opt, symbolMeta);
                    }
                    else {
                        bar = createBar(data, opt, symbolMeta, true);
                    }
 
                    data.setItemGraphicEl(newIndex, bar);
                    bar.__pictorialSymbolMeta = symbolMeta;
                    // Add back
                    group.add(bar);
 
                    updateCommon(bar, opt, symbolMeta);
                })
                .remove(function (dataIndex) {
                    var bar = oldData.getItemGraphicEl(dataIndex);
                    bar && removeBar(oldData, dataIndex, bar.__pictorialSymbolMeta.animationModel, bar);
                })
                .execute();
 
            this._data = data;
 
            return this.group;
        },
 
        dispose: zrUtil.noop,
 
        remove: function (ecModel, api) {
            var group = this.group;
            var data = this._data;
            if (ecModel.get('animation')) {
                if (data) {
                    data.eachItemGraphicEl(function (bar) {
                        removeBar(data, bar.dataIndex, ecModel, bar);
                    });
                }
            }
            else {
                group.removeAll();
            }
        }
    });
 
 
    // Set or calculate default value about symbol, and calculate layout info.
    function getSymbolMeta(data, dataIndex, itemModel, opt) {
        var layout = data.getItemLayout(dataIndex);
        var symbolRepeat = itemModel.get('symbolRepeat');
        var symbolClip = itemModel.get('symbolClip');
        var symbolPosition = itemModel.get('symbolPosition') || 'start';
        var symbolRotate = itemModel.get('symbolRotate');
        var rotation = (symbolRotate || 0) * Math.PI / 180 || 0;
        var symbolPatternSize = itemModel.get('symbolPatternSize') || 2;
        var isAnimationEnabled = itemModel.isAnimationEnabled();
 
        var symbolMeta = {
            dataIndex: dataIndex,
            layout: layout,
            itemModel: itemModel,
            symbolType: data.getItemVisual(dataIndex, 'symbol') || 'circle',
            color: data.getItemVisual(dataIndex, 'color'),
            symbolClip: symbolClip,
            symbolRepeat: symbolRepeat,
            symbolRepeatDirection: itemModel.get('symbolRepeatDirection'),
            symbolPatternSize: symbolPatternSize,
            rotation: rotation,
            animationModel: isAnimationEnabled ? itemModel : null,
            hoverAnimation: isAnimationEnabled && itemModel.get('hoverAnimation'),
            z2: itemModel.getShallow('z', true) || 0
        };
 
        prepareBarLength(itemModel, symbolRepeat, layout, opt, symbolMeta);
 
        prepareSymbolSize(
            data, dataIndex, layout, symbolRepeat, symbolClip, symbolMeta.boundingLength,
            symbolMeta.pxSign, symbolPatternSize, opt, symbolMeta
        );
 
        prepareLineWidth(itemModel, symbolMeta.symbolScale, rotation, opt, symbolMeta);
 
        var symbolSize = symbolMeta.symbolSize;
        var symbolOffset = itemModel.get('symbolOffset');
        if (zrUtil.isArray(symbolOffset)) {
            symbolOffset = [
                parsePercent(symbolOffset[0], symbolSize[0]),
                parsePercent(symbolOffset[1], symbolSize[1])
            ];
        }
 
        prepareLayoutInfo(
            itemModel, symbolSize, layout, symbolRepeat, symbolClip, symbolOffset,
            symbolPosition, symbolMeta.valueLineWidth, symbolMeta.boundingLength, symbolMeta.repeatCutLength,
            opt, symbolMeta
        );
 
        return symbolMeta;
    }
 
    // bar length can be negative.
    function prepareBarLength(itemModel, symbolRepeat, layout, opt, output) {
        var valueDim = opt.valueDim;
        var symbolBoundingData = itemModel.get('symbolBoundingData');
        var valueAxis = opt.coordSys.getOtherAxis(opt.coordSys.getBaseAxis());
        var zeroPx = valueAxis.toGlobalCoord(valueAxis.dataToCoord(0));
 
        var boundingLength = output.boundingLength = symbolBoundingData != null
            ? valueAxis.toGlobalCoord(valueAxis.dataToCoord(valueAxis.scale.parse(symbolBoundingData))) - zeroPx
            : symbolRepeat
            ? opt.coordSysExtent[valueDim.index][1 - +(layout[valueDim.wh] <= 0)] - zeroPx
            : layout[valueDim.wh];
 
        if (symbolRepeat) {
            output.repeatCutLength = layout[valueDim.wh];
        }
 
        output.pxSign = boundingLength > 0 ? 1 : boundingLength < 0 ? -1 : 0;
    }
 
    // Support ['100%', '100%']
    function prepareSymbolSize(
        data, dataIndex, layout, symbolRepeat, symbolClip, boundingLength,
        pxSign, symbolPatternSize, opt, output
    ) {
        var valueDim = opt.valueDim;
        var categoryDim = opt.categoryDim;
        var categorySize = Math.abs(layout[categoryDim.wh]);
 
        var symbolSize = data.getItemVisual(dataIndex, 'symbolSize');
        if (zrUtil.isArray(symbolSize)) {
            symbolSize = symbolSize.slice();
        }
        else {
            if (symbolSize == null) {
                symbolSize = '100%';
            }
            symbolSize = [symbolSize, symbolSize];
        }
 
        // Note: percentage symbolSize (like '100%') do not consider lineWidth, because it is
        // to complicated to calculate real percent value if considering scaled lineWidth.
        // So the actual size will bigger than layout size if lineWidth is bigger than zero,
        // which can be tolerated in pictorial chart.
 
        symbolSize[categoryDim.index] = parsePercent(
            symbolSize[categoryDim.index],
            categorySize
        );
        symbolSize[valueDim.index] = parsePercent(
            symbolSize[valueDim.index],
            symbolRepeat ? categorySize : Math.abs(boundingLength)
        );
 
        output.symbolSize = symbolSize;
 
        // If x or y is less than zero, show reversed shape.
        var symbolScale = output.symbolScale = [
            symbolSize[0] / symbolPatternSize,
            symbolSize[1] / symbolPatternSize
        ];
        // Follow convention, 'right' and 'top' is the normal scale.
        symbolScale[valueDim.index] *= (opt.isHorizontal ? -1 : 1) * pxSign;
    }
 
    function prepareLineWidth(itemModel, symbolScale, rotation, opt, output) {
        // In symbols are drawn with scale, so do not need to care about the case that width
        // or height are too small. But symbol use strokeNoScale, where acture lineWidth should
        // be calculated.
        var valueLineWidth = itemModel.get(BAR_BORDER_WIDTH_QUERY) || 0;
 
        if (valueLineWidth) {
            pathForLineWidth.attr({
                scale: symbolScale.slice(),
                rotation: rotation
            });
            pathForLineWidth.updateTransform();
            valueLineWidth /= pathForLineWidth.getLineScale();
            valueLineWidth *= symbolScale[opt.valueDim.index];
        }
 
        output.valueLineWidth = valueLineWidth;
    }
 
    function prepareLayoutInfo(
        itemModel, symbolSize, layout, symbolRepeat, symbolClip, symbolOffset,
        symbolPosition, valueLineWidth, boundingLength, repeatCutLength, opt, output
    ) {
        var categoryDim = opt.categoryDim;
        var valueDim = opt.valueDim;
        var pxSign = output.pxSign;
 
        var unitLength = Math.max(symbolSize[valueDim.index] + valueLineWidth, 0);
        var pathLen = unitLength;
 
        // Note: rotation will not effect the layout of symbols, because user may
        // want symbols to rotate on its center, which should not be translated
        // when rotating.
 
        if (symbolRepeat) {
            var absBoundingLength = Math.abs(boundingLength);
 
            var symbolMargin = zrUtil.retrieve(itemModel.get('symbolMargin'), '15%') + '';
            var hasEndGap = false;
            if (symbolMargin.lastIndexOf('!') === symbolMargin.length - 1) {
                hasEndGap = true;
                symbolMargin = symbolMargin.slice(0, symbolMargin.length - 1);
            }
            symbolMargin = parsePercent(symbolMargin, symbolSize[valueDim.index]);
 
            var uLenWithMargin = Math.max(unitLength + symbolMargin * 2, 0);
 
            // When symbol margin is less than 0, margin at both ends will be subtracted
            // to ensure that all of the symbols will not be overflow the given area.
            var endFix = hasEndGap ? 0 : symbolMargin * 2;
 
            // Both final repeatTimes and final symbolMargin area calculated based on
            // boundingLength.
            var repeatSpecified = numberUtil.isNumeric(symbolRepeat);
            var repeatTimes = repeatSpecified
                ? symbolRepeat
                : toIntTimes((absBoundingLength + endFix) / uLenWithMargin);
 
            // Adjust calculate margin, to ensure each symbol is displayed
            // entirely in the given layout area.
            var mDiff = absBoundingLength - repeatTimes * unitLength;
            symbolMargin = mDiff / 2 / (hasEndGap ? repeatTimes : repeatTimes - 1);
            uLenWithMargin = unitLength + symbolMargin * 2;
            endFix = hasEndGap ? 0 : symbolMargin * 2;
 
            // Update repeatTimes when not all symbol will be shown.
            if (!repeatSpecified && symbolRepeat !== 'fixed') {
                repeatTimes = repeatCutLength
                    ? toIntTimes((Math.abs(repeatCutLength) + endFix) / uLenWithMargin)
                    : 0;
            }
 
            pathLen = repeatTimes * uLenWithMargin - endFix;
            output.repeatTimes = repeatTimes;
            output.symbolMargin = symbolMargin;
        }
 
        var sizeFix = pxSign * (pathLen / 2);
        var pathPosition = output.pathPosition = [];
        pathPosition[categoryDim.index] = layout[categoryDim.wh] / 2;
        pathPosition[valueDim.index] = symbolPosition === 'start'
            ? sizeFix
            : symbolPosition === 'end'
            ? boundingLength - sizeFix
            : boundingLength / 2; // 'center'
        if (symbolOffset) {
            pathPosition[0] += symbolOffset[0];
            pathPosition[1] += symbolOffset[1];
        }
 
        var bundlePosition = output.bundlePosition = [];
        bundlePosition[categoryDim.index] = layout[categoryDim.xy];
        bundlePosition[valueDim.index] = layout[valueDim.xy];
 
        var barRectShape = output.barRectShape = zrUtil.extend({}, layout);
        barRectShape[valueDim.wh] = pxSign * Math.max(
            Math.abs(layout[valueDim.wh]), Math.abs(pathPosition[valueDim.index] + sizeFix)
        );
        barRectShape[categoryDim.wh] = layout[categoryDim.wh];
 
        var clipShape = output.clipShape = {};
        // Consider that symbol may be overflow layout rect.
        clipShape[categoryDim.xy] = -layout[categoryDim.xy];
        clipShape[categoryDim.wh] = opt.ecSize[categoryDim.wh];
        clipShape[valueDim.xy] = 0;
        clipShape[valueDim.wh] = layout[valueDim.wh];
    }
 
    function createPath(symbolMeta) {
        var symbolPatternSize = symbolMeta.symbolPatternSize;
        var path = symbolUtil.createSymbol(
            // Consider texture img, make a big size.
            symbolMeta.symbolType,
            -symbolPatternSize / 2,
            -symbolPatternSize / 2,
            symbolPatternSize,
            symbolPatternSize,
            symbolMeta.color
        );
        path.attr({
            culling: true
        });
        path.type !== 'image' && path.setStyle({
            strokeNoScale: true
        });
 
        return path;
    }
 
    function createOrUpdateRepeatSymbols(bar, opt, symbolMeta, isUpdate) {
        var bundle = bar.__pictorialBundle;
        var symbolSize = symbolMeta.symbolSize;
        var valueLineWidth = symbolMeta.valueLineWidth;
        var pathPosition = symbolMeta.pathPosition;
        var valueDim = opt.valueDim;
        var repeatTimes = symbolMeta.repeatTimes || 0;
 
        var index = 0;
        var unit = symbolSize[opt.valueDim.index] + valueLineWidth + symbolMeta.symbolMargin * 2;
 
        eachPath(bar, function (path) {
            path.__pictorialAnimationIndex = index;
            path.__pictorialRepeatTimes = repeatTimes;
            if (index < repeatTimes) {
                updateAttr(path, null, makeTarget(index), symbolMeta, isUpdate);
            }
            else {
                updateAttr(path, null, {scale: [0, 0]}, symbolMeta, isUpdate, function () {
                    bundle.remove(path);
                });
            }
 
            updateHoverAnimation(path, symbolMeta);
 
            index++;
        });
 
        for (; index < repeatTimes; index++) {
            var path = createPath(symbolMeta);
            path.__pictorialAnimationIndex = index;
            path.__pictorialRepeatTimes = repeatTimes;
            bundle.add(path);
 
            var target = makeTarget(index, true);
 
            updateAttr(
                path,
                {
                    position: target.position,
                    scale: [0, 0]
                },
                {
                    scale: target.scale,
                    rotation: target.rotation
                },
                symbolMeta,
                isUpdate
            );
 
            // FIXME
            // If all emphasis/normal through action.
            path
                .on('mouseover', onMouseOver)
                .on('mouseout', onMouseOut);
 
            updateHoverAnimation(path, symbolMeta);
        }
 
        function makeTarget(index) {
            var position = pathPosition.slice();
            // (start && pxSign > 0) || (end && pxSign < 0): i = repeatTimes - index
            // Otherwise: i = index;
            var pxSign = symbolMeta.pxSign;
            var i = index;
            if (symbolMeta.symbolRepeatDirection === 'start' ? pxSign > 0 : pxSign < 0) {
                i = repeatTimes - 1 - index;
            }
            position[valueDim.index] = unit * (i - repeatTimes / 2 + 0.5) + pathPosition[valueDim.index];
 
            return {
                position: position,
                scale: symbolMeta.symbolScale.slice(),
                rotation: symbolMeta.rotation
            };
        }
 
        function onMouseOver() {
            eachPath(bar, function (path) {
                path.trigger('emphasis');
            });
        }
 
        function onMouseOut() {
            eachPath(bar, function (path) {
                path.trigger('normal');
            });
        }
    }
 
    function createOrUpdateSingleSymbol(bar, opt, symbolMeta, isUpdate) {
        var bundle = bar.__pictorialBundle;
        var mainPath = bar.__pictorialMainPath;
 
        if (!mainPath) {
            mainPath = bar.__pictorialMainPath = createPath(symbolMeta);
            bundle.add(mainPath);
 
            updateAttr(
                mainPath,
                {
                    position: symbolMeta.pathPosition.slice(),
                    scale: [0, 0],
                    rotation: symbolMeta.rotation
                },
                {
                    scale: symbolMeta.symbolScale.slice()
                },
                symbolMeta,
                isUpdate
            );
 
            mainPath
                .on('mouseover', onMouseOver)
                .on('mouseout', onMouseOut);
        }
        else {
            updateAttr(
                mainPath,
                null,
                {
                    position: symbolMeta.pathPosition.slice(),
                    scale: symbolMeta.symbolScale.slice(),
                    rotation: symbolMeta.rotation
                },
                symbolMeta,
                isUpdate
            );
        }
 
        updateHoverAnimation(mainPath, symbolMeta);
 
        function onMouseOver() {
            this.trigger('emphasis');
        }
 
        function onMouseOut() {
            this.trigger('normal');
        }
    }
 
    // bar rect is used for label.
    function createOrUpdateBarRect(bar, symbolMeta, isUpdate) {
        var rectShape = zrUtil.extend({}, symbolMeta.barRectShape);
 
        var barRect = bar.__pictorialBarRect;
        if (!barRect) {
            barRect = bar.__pictorialBarRect = new graphic.Rect({
                z2: 2,
                shape: rectShape,
                silent: true,
                style: {
                    stroke: 'transparent',
                    fill: 'transparent',
                    lineWidth: 0
                }
            });
 
            bar.add(barRect);
        }
        else {
            updateAttr(barRect, null, {shape: rectShape}, symbolMeta, isUpdate);
        }
    }
 
    function createOrUpdateClip(bar, opt, symbolMeta, isUpdate) {
        // If not clip, symbol will be remove and rebuilt.
        if (symbolMeta.symbolClip) {
            var clipPath = bar.__pictorialClipPath;
            var clipShape = zrUtil.extend({}, symbolMeta.clipShape);
            var valueDim = opt.valueDim;
            var animationModel = symbolMeta.animationModel;
            var dataIndex = symbolMeta.dataIndex;
 
            if (clipPath) {
                graphic.updateProps(
                    clipPath, {shape: clipShape}, animationModel, dataIndex
                );
            }
            else {
                clipShape[valueDim.wh] = 0;
                clipPath = new graphic.Rect({shape: clipShape});
                bar.__pictorialBundle.setClipPath(clipPath);
                bar.__pictorialClipPath = clipPath;
 
                var target = {};
                target[valueDim.wh] = symbolMeta.clipShape[valueDim.wh];
 
                graphic[isUpdate ? 'updateProps' : 'initProps'](
                    clipPath, {shape: target}, animationModel, dataIndex
                );
            }
        }
    }
 
    function getItemModel(data, dataIndex) {
        var itemModel = data.getItemModel(dataIndex);
        itemModel.getAnimationDelayParams = getAnimationDelayParams;
        itemModel.isAnimationEnabled = isAnimationEnabled;
        return itemModel;
    }
 
    function getAnimationDelayParams(path) {
        // The order is the same as the z-order, see `symbolRepeatDiretion`.
        return {
            index: path.__pictorialAnimationIndex,
            count: path.__pictorialRepeatTimes
        };
    }
 
    function isAnimationEnabled() {
        // `animation` prop can be set on itemModel in pictorial bar chart.
        return this.parentModel.isAnimationEnabled() && !!this.getShallow('animation');
    }
 
    function updateHoverAnimation(path, symbolMeta) {
        path.off('emphasis').off('normal');
 
        var scale = symbolMeta.symbolScale.slice();
 
        symbolMeta.hoverAnimation && path
            .on('emphasis', function() {
                this.animateTo({
                    scale: [scale[0] * 1.1, scale[1] * 1.1]
                }, 400, 'elasticOut');
            })
            .on('normal', function() {
                this.animateTo({
                    scale: scale.slice()
                }, 400, 'elasticOut');
            });
    }
 
    function createBar(data, opt, symbolMeta, isUpdate) {
        // bar is the main element for each data.
        var bar = new graphic.Group();
        // bundle is used for location and clip.
        var bundle = new graphic.Group();
        bar.add(bundle);
        bar.__pictorialBundle = bundle;
        bundle.attr('position', symbolMeta.bundlePosition.slice());
 
        if (symbolMeta.symbolRepeat) {
            createOrUpdateRepeatSymbols(bar, opt, symbolMeta);
        }
        else {
            createOrUpdateSingleSymbol(bar, opt, symbolMeta);
        }
 
        createOrUpdateBarRect(bar, symbolMeta, isUpdate);
 
        createOrUpdateClip(bar, opt, symbolMeta, isUpdate);
 
        bar.__pictorialShapeStr = getShapeStr(data, symbolMeta);
        bar.__pictorialSymbolMeta = symbolMeta;
 
        return bar;
    }
 
    function updateBar(bar, opt, symbolMeta) {
        var animationModel = symbolMeta.animationModel;
        var dataIndex = symbolMeta.dataIndex;
        var bundle = bar.__pictorialBundle;
 
        graphic.updateProps(
            bundle, {position: symbolMeta.bundlePosition.slice()}, animationModel, dataIndex
        );
 
        if (symbolMeta.symbolRepeat) {
            createOrUpdateRepeatSymbols(bar, opt, symbolMeta, true);
        }
        else {
            createOrUpdateSingleSymbol(bar, opt, symbolMeta, true);
        }
 
        createOrUpdateBarRect(bar, symbolMeta, true);
 
        createOrUpdateClip(bar, opt, symbolMeta, true);
    }
 
    function removeBar(data, dataIndex, animationModel, bar) {
        // Not show text when animating
        var labelRect = bar.__pictorialBarRect;
        labelRect && (labelRect.style.text = '');
 
        var pathes = [];
        eachPath(bar, function (path) {
            pathes.push(path);
        });
        bar.__pictorialMainPath && pathes.push(bar.__pictorialMainPath);
 
        // I do not find proper remove animation for clip yet.
        bar.__pictorialClipPath && (animationModel = null);
 
        zrUtil.each(pathes, function (path) {
            graphic.updateProps(
                path, {scale: [0, 0]}, animationModel, dataIndex,
                function () {
                    bar.parent && bar.parent.remove(bar);
                }
            );
        });
 
        data.setItemGraphicEl(dataIndex, null);
    }
 
    function getShapeStr(data, symbolMeta) {
        return [
            data.getItemVisual(symbolMeta.dataIndex, 'symbol') || 'none',
            !!symbolMeta.symbolRepeat,
            !!symbolMeta.symbolClip
        ].join(':');
    }
 
    function eachPath(bar, cb, context) {
        // Do not use Group#eachChild, because it do not support remove.
        zrUtil.each(bar.__pictorialBundle.children(), function (el) {
            el !== bar.__pictorialBarRect && cb.call(context, el);
        });
    }
 
    function updateAttr(el, immediateAttrs, animationAttrs, symbolMeta, isUpdate, cb) {
        immediateAttrs && el.attr(immediateAttrs);
        // when symbolCip used, only clip path has init animation, otherwise it would be weird effect.
        if (symbolMeta.symbolClip && !isUpdate) {
            animationAttrs && el.attr(animationAttrs);
        }
        else {
            animationAttrs && graphic[isUpdate ? 'updateProps' : 'initProps'](
                el, animationAttrs, symbolMeta.animationModel, symbolMeta.dataIndex, cb
            );
        }
    }
 
    function updateCommon(bar, opt, symbolMeta) {
        var color = symbolMeta.color;
        var dataIndex = symbolMeta.dataIndex;
        var itemModel = symbolMeta.itemModel;
        // Color must be excluded.
        // Because symbol provide setColor individually to set fill and stroke
        var normalStyle = itemModel.getModel('itemStyle.normal').getItemStyle(['color']);
        var hoverStyle = itemModel.getModel('itemStyle.emphasis').getItemStyle();
 
        eachPath(bar, function (path) {
            // PENDING setColor should be before setStyle!!!
            path.setColor(color);
            path.setStyle(zrUtil.defaults(
                {
                    fill: color,
                    opacity: symbolMeta.opacity
                },
                normalStyle
            ));
            graphic.setHoverStyle(path, hoverStyle);
 
            path.z2 = symbolMeta.z2;
        });
 
        var barRectHoverStyle = {};
        var barPositionOutside = opt.valueDim.posDesc[+(symbolMeta.boundingLength > 0)];
        var barRect = bar.__pictorialBarRect;
 
        helper.setLabel(
            barRect.style, barRectHoverStyle, itemModel,
            color, opt.seriesModel, dataIndex, barPositionOutside
        );
 
        graphic.setHoverStyle(barRect, barRectHoverStyle);
    }
 
    function toIntTimes(times) {
        var roundedTimes = Math.round(times);
        // Escapse accurate error
        return Math.abs(times - roundedTimes) < 1e-4
            ? roundedTimes
            : Math.ceil(times);
    }
 
    module.exports = BarView;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/bar/barItemStyle.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/bar/barItemStyle.js

Statements: 28.57% (2 / 7)      Branches: 0% (0 / 4)      Functions: 0% (0 / 1)      Lines: 28.57% (2 / 7)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30      1                             1                      
 
 
 
    var getBarItemStyle = require('../../model/mixin/makeStyleMapper')(
        [
            ['fill', 'color'],
            ['stroke', 'borderColor'],
            ['lineWidth', 'borderWidth'],
            // Compatitable with 2
            ['stroke', 'barBorderColor'],
            ['lineWidth', 'barBorderWidth'],
            ['opacity'],
            ['shadowBlur'],
            ['shadowOffsetX'],
            ['shadowOffsetY'],
            ['shadowColor']
        ]
    );
    module.exports = {
        getBarItemStyle: function (excludes) {
            var style = getBarItemStyle.call(this, excludes);
            if (this.getBorderLineDash) {
                var lineDash = this.getBorderLineDash();
                lineDash && (style.lineDash = lineDash);
            }
            return style;
        }
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/bar/helper.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/bar/helper.js

Statements: 33.33% (6 / 18)      Branches: 0% (0 / 6)      Functions: 0% (0 / 2)      Lines: 33.33% (6 / 18)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53    1 1   1   1                                                                     1               1    
 
 
    var zrUtil = require('zrender/lib/core/util');
    var graphic = require('../../util/graphic');
 
    var helper = {};
 
    helper.setLabel = function (
        normalStyle, hoverStyle, itemModel, color, seriesModel, dataIndex, labelPositionOutside
    ) {
        var labelModel = itemModel.getModel('label.normal');
        var hoverLabelModel = itemModel.getModel('label.emphasis');
 
        if (labelModel.get('show')) {
            setLabel(
                normalStyle, labelModel, color,
                zrUtil.retrieve(
                    seriesModel.getFormattedLabel(dataIndex, 'normal'),
                    seriesModel.getRawValue(dataIndex)
                ),
                labelPositionOutside
            );
        }
        else {
            normalStyle.text = '';
        }
 
        if (hoverLabelModel.get('show')) {
            setLabel(
                hoverStyle, hoverLabelModel, color,
                zrUtil.retrieve(
                    seriesModel.getFormattedLabel(dataIndex, 'emphasis'),
                    seriesModel.getRawValue(dataIndex)
                ),
                labelPositionOutside
            );
        }
        else {
            hoverStyle.text = '';
        }
    };
 
    function setLabel(style, model, color, labelText, labelPositionOutside) {
        graphic.setText(style, model, color);
        style.text = labelText;
        if (style.textPosition === 'outside') {
            style.textPosition = labelPositionOutside;
        }
    }
 
    module.exports = helper;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/boxplot/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/boxplot/

Statements: 20.71% (29 / 140)      Branches: 0% (0 / 24)      Functions: 0% (0 / 19)      Lines: 20.71% (29 / 140)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/chart/boxplot/
File Statements Branches Functions Lines
BoxplotSeries.js 100% (6 / 6) 100% (0 / 0) 100% (0 / 0) 100% (6 / 6)
BoxplotView.js 40% (10 / 25) 100% (0 / 0) 0% (0 / 2) 40% (10 / 25)
boxplotLayout.js 11.22% (11 / 98) 0% (0 / 20) 0% (0 / 14) 11.22% (11 / 98)
boxplotVisual.js 18.18% (2 / 11) 0% (0 / 4) 0% (0 / 3) 18.18% (2 / 11)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/boxplot/BoxplotSeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/boxplot/BoxplotSeries.js

Statements: 100% (6 / 6)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (6 / 6)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72      1 1 1   1                                                                                                                     1   1      
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
    var SeriesModel = require('../../model/Series');
    var whiskerBoxCommon = require('../helper/whiskerBoxCommon');
 
    var BoxplotSeries = SeriesModel.extend({
 
        type: 'series.boxplot',
 
        dependencies: ['xAxis', 'yAxis', 'grid'],
 
        // TODO
        // box width represents group size, so dimension should have 'size'.
 
        /**
         * @see <https://en.wikipedia.org/wiki/Box_plot>
         * The meanings of 'min' and 'max' depend on user,
         * and echarts do not need to know it.
         * @readOnly
         */
        valueDimensions: ['min', 'Q1', 'median', 'Q3', 'max'],
 
        /**
         * @type {Array.<string>}
         * @readOnly
         */
        dimensions: null,
 
        /**
         * @override
         */
        defaultOption: {
            zlevel: 0,                  // 一级层叠
            z: 2,                       // 二级层叠
            coordinateSystem: 'cartesian2d',
            legendHoverLink: true,
 
            hoverAnimation: true,
 
            // xAxisIndex: 0,
            // yAxisIndex: 0,
 
            layout: null,               // 'horizontal' or 'vertical'
            boxWidth: [7, 50],       // [min, max] can be percent of band width.
 
            itemStyle: {
                normal: {
                    color: '#fff',
                    borderWidth: 1
                },
                emphasis: {
                    borderWidth: 2,
                    shadowBlur: 5,
                    shadowOffsetX: 2,
                    shadowOffsetY: 2,
                    shadowColor: 'rgba(0,0,0,0.4)'
                }
            },
 
            animationEasing: 'elasticOut',
            animationDuration: 800
        }
    });
 
    zrUtil.mixin(BoxplotSeries, whiskerBoxCommon.seriesModelMixin, true);
 
    module.exports = BoxplotSeries;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/boxplot/BoxplotView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/boxplot/BoxplotView.js

Statements: 40% (10 / 25)      Branches: 100% (0 / 0)      Functions: 0% (0 / 2)      Lines: 40% (10 / 25)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51      1 1 1 1   1                     1     1 1   1                                           1      
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
    var ChartView = require('../../view/Chart');
    var graphic = require('../../util/graphic');
    var whiskerBoxCommon = require('../helper/whiskerBoxCommon');
 
    var BoxplotView = ChartView.extend({
 
        type: 'boxplot',
 
        getStyleUpdater: function () {
            return updateStyle;
        },
 
        dispose: zrUtil.noop
    });
 
    zrUtil.mixin(BoxplotView, whiskerBoxCommon.viewMixin, true);
 
    // Update common properties
    var normalStyleAccessPath = ['itemStyle', 'normal'];
    var emphasisStyleAccessPath = ['itemStyle', 'emphasis'];
 
    function updateStyle(itemGroup, data, idx) {
        var itemModel = data.getItemModel(idx);
        var normalItemStyleModel = itemModel.getModel(normalStyleAccessPath);
        var borderColor = data.getItemVisual(idx, 'color');
 
        // Exclude borderColor.
        var itemStyle = normalItemStyleModel.getItemStyle(['borderColor']);
 
        var whiskerEl = itemGroup.childAt(itemGroup.whiskerIndex);
        whiskerEl.style.set(itemStyle);
        whiskerEl.style.stroke = borderColor;
        whiskerEl.dirty();
 
        var bodyEl = itemGroup.childAt(itemGroup.bodyIndex);
        bodyEl.style.set(itemStyle);
        bodyEl.style.stroke = borderColor;
        bodyEl.dirty();
 
        var hoverStyle = itemModel.getModel(emphasisStyleAccessPath).getItemStyle();
        graphic.setHoverStyle(itemGroup, hoverStyle);
    }
 
    module.exports = BoxplotView;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/boxplot/boxplotLayout.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/boxplot/boxplotLayout.js

Statements: 11.22% (11 / 98)      Branches: 0% (0 / 20)      Functions: 0% (0 / 14)      Lines: 11.22% (11 / 98)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182    1 1 1 1   1                                                   1                                             1                                                                                                       1                                                                           1                             1                   1                    
 
 
    var zrUtil = require('zrender/lib/core/util');
    var numberUtil = require('../../util/number');
    var parsePercent = numberUtil.parsePercent;
    var each = zrUtil.each;
 
    module.exports = function (ecModel) {
 
        var groupResult = groupSeriesByAxis(ecModel);
 
        each(groupResult, function (groupItem) {
            var seriesModels = groupItem.seriesModels;
 
            if (!seriesModels.length) {
                return;
            }
 
            calculateBase(groupItem);
 
            each(seriesModels, function (seriesModel, idx) {
                layoutSingleSeries(
                    seriesModel,
                    groupItem.boxOffsetList[idx],
                    groupItem.boxWidthList[idx]
                );
            });
        });
    };
 
    /**
     * Group series by axis.
     */
    function groupSeriesByAxis(ecModel) {
        var result = [];
        var axisList = [];
 
        ecModel.eachSeriesByType('boxplot', function (seriesModel) {
            var baseAxis = seriesModel.getBaseAxis();
            var idx = zrUtil.indexOf(axisList, baseAxis);
 
            if (idx < 0) {
                idx = axisList.length;
                axisList[idx] = baseAxis;
                result[idx] = {axis: baseAxis, seriesModels: []};
            }
 
            result[idx].seriesModels.push(seriesModel);
        });
 
        return result;
    }
 
    /**
     * Calculate offset and box width for each series.
     */
    function calculateBase(groupItem) {
        var extent;
        var baseAxis = groupItem.axis;
        var seriesModels = groupItem.seriesModels;
        var seriesCount = seriesModels.length;
 
        var boxWidthList = groupItem.boxWidthList = [];
        var boxOffsetList = groupItem.boxOffsetList = [];
        var boundList = [];
 
        var bandWidth;
        if (baseAxis.type === 'category') {
            bandWidth = baseAxis.getBandWidth();
        }
        else {
            var maxDataCount = 0;
            each(seriesModels, function (seriesModel) {
                maxDataCount = Math.max(maxDataCount, seriesModel.getData().count());
            });
            extent = baseAxis.getExtent(),
            Math.abs(extent[1] - extent[0]) / maxDataCount;
        }
 
        each(seriesModels, function (seriesModel) {
            var boxWidthBound = seriesModel.get('boxWidth');
            if (!zrUtil.isArray(boxWidthBound)) {
                boxWidthBound = [boxWidthBound, boxWidthBound];
            }
            boundList.push([
                parsePercent(boxWidthBound[0], bandWidth) || 0,
                parsePercent(boxWidthBound[1], bandWidth) || 0
            ]);
        });
 
        var availableWidth = bandWidth * 0.8 - 2;
        var boxGap = availableWidth / seriesCount * 0.3;
        var boxWidth = (availableWidth - boxGap * (seriesCount - 1)) / seriesCount;
        var base = boxWidth / 2 - availableWidth / 2;
 
        each(seriesModels, function (seriesModel, idx) {
            boxOffsetList.push(base);
            base += boxGap + boxWidth;
 
            boxWidthList.push(
                Math.min(Math.max(boxWidth, boundList[idx][0]), boundList[idx][1])
            );
        });
    }
 
    /**
     * Calculate points location for each series.
     */
    function layoutSingleSeries(seriesModel, offset, boxWidth) {
        var coordSys = seriesModel.coordinateSystem;
        var data = seriesModel.getData();
        var dimensions = seriesModel.dimensions;
        var chartLayout = seriesModel.get('layout');
        var halfWidth = boxWidth / 2;
 
        data.each(dimensions, function () {
            var args = arguments;
            var dimLen = dimensions.length;
            var axisDimVal = args[0];
            var idx = args[dimLen];
            var variableDim = chartLayout === 'horizontal' ? 0 : 1;
            var constDim = 1 - variableDim;
 
            var median = getPoint(args[3]);
            var end1 = getPoint(args[1]);
            var end5 = getPoint(args[5]);
            var whiskerEnds = [
                [end1, getPoint(args[2])],
                [end5, getPoint(args[4])]
            ];
            layEndLine(end1);
            layEndLine(end5);
            layEndLine(median);
 
            var bodyEnds = [];
            addBodyEnd(whiskerEnds[0][1], 0);
            addBodyEnd(whiskerEnds[1][1], 1);
 
            data.setItemLayout(idx, {
                chartLayout: chartLayout,
                initBaseline: median[constDim],
                median: median,
                bodyEnds: bodyEnds,
                whiskerEnds: whiskerEnds
            });
 
            function getPoint(val) {
                var p = [];
                p[variableDim] = axisDimVal;
                p[constDim] = val;
                var point;
                if (isNaN(axisDimVal) || isNaN(val)) {
                    point = [NaN, NaN];
                }
                else {
                    point = coordSys.dataToPoint(p);
                    point[variableDim] += offset;
                }
                return point;
            }
 
            function addBodyEnd(point, start) {
                var point1 = point.slice();
                var point2 = point.slice();
                point1[variableDim] += halfWidth;
                point2[variableDim] -= halfWidth;
                start
                    ? bodyEnds.push(point1, point2)
                    : bodyEnds.push(point2, point1);
            }
 
            function layEndLine(endCenter) {
                var line = [endCenter.slice(), endCenter.slice()];
                line[0][variableDim] -= halfWidth;
                line[1][variableDim] += halfWidth;
                whiskerEnds.push(line);
            }
        });
    }
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/boxplot/boxplotVisual.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/boxplot/boxplotVisual.js

Statements: 18.18% (2 / 11)      Branches: 0% (0 / 4)      Functions: 0% (0 / 3)      Lines: 18.18% (2 / 11)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35    1   1                                                            
 
 
    var borderColorQuery = ['itemStyle', 'normal', 'borderColor'];
 
    module.exports = function (ecModel, api) {
 
        var globalColors = ecModel.get('color');
 
        ecModel.eachRawSeriesByType('boxplot', function (seriesModel) {
 
            var defaulColor = globalColors[seriesModel.seriesIndex % globalColors.length];
            var data = seriesModel.getData();
 
            data.setVisual({
                legendSymbol: 'roundRect',
                // Use name 'color' but not 'borderColor' for legend usage and
                // visual coding from other component like dataRange.
                color: seriesModel.get(borderColorQuery) || defaulColor
            });
 
            // Only visible series has each data be visual encoded
            if (!ecModel.isSeriesFiltered(seriesModel)) {
                data.each(function (idx) {
                    var itemModel = data.getItemModel(idx);
                    data.setItemVisual(
                        idx,
                        {color: itemModel.get(borderColorQuery, true)}
                    );
                });
            }
        });
 
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/candlestick/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/candlestick/

Statements: 27.73% (33 / 119)      Branches: 0% (0 / 42)      Functions: 0% (0 / 18)      Lines: 27.73% (33 / 119)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/chart/candlestick/
File Statements Branches Functions Lines
CandlestickSeries.js 50% (9 / 18) 0% (0 / 4) 0% (0 / 4) 50% (9 / 18)
CandlestickView.js 40% (10 / 25) 0% (0 / 2) 0% (0 / 2) 40% (10 / 25)
candlestickLayout.js 12.5% (7 / 56) 0% (0 / 22) 0% (0 / 7) 12.5% (7 / 56)
candlestickVisual.js 38.46% (5 / 13) 0% (0 / 6) 0% (0 / 3) 38.46% (5 / 13)
preprocessor.js 28.57% (2 / 7) 0% (0 / 8) 0% (0 / 2) 28.57% (2 / 7)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/candlestick/CandlestickSeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/candlestick/CandlestickSeries.js

Statements: 50% (9 / 18)      Branches: 0% (0 / 4)      Functions: 0% (0 / 4)      Lines: 50% (9 / 18)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105      1 1 1 1 1 1   1                                                                                                                                                                                 1   1      
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
    var SeriesModel = require('../../model/Series');
    var whiskerBoxCommon = require('../helper/whiskerBoxCommon');
    var formatUtil = require('../../util/format');
    var encodeHTML = formatUtil.encodeHTML;
    var addCommas = formatUtil.addCommas;
 
    var CandlestickSeries = SeriesModel.extend({
 
        type: 'series.candlestick',
 
        dependencies: ['xAxis', 'yAxis', 'grid'],
 
        /**
         * @readOnly
         */
        valueDimensions: ['open', 'close', 'lowest', 'highest'],
 
        /**
         * @type {Array.<string>}
         * @readOnly
         */
        dimensions: null,
 
        /**
         * @override
         */
        defaultOption: {
            zlevel: 0,                  // 一级层叠
            z: 2,                       // 二级层叠
            coordinateSystem: 'cartesian2d',
            legendHoverLink: true,
 
            hoverAnimation: true,
 
            // xAxisIndex: 0,
            // yAxisIndex: 0,
 
            layout: null, // 'horizontal' or 'vertical'
 
            itemStyle: {
                normal: {
                    color: '#c23531', // 阳线 positive
                    color0: '#314656', // 阴线 negative     '#c23531', '#314656'
                    borderWidth: 1,
                    // FIXME
                    // ec2中使用的是lineStyle.color 和 lineStyle.color0
                    borderColor: '#c23531',
                    borderColor0: '#314656'
                },
                emphasis: {
                    borderWidth: 2
                }
            },
 
            barMaxWidth: null,
            barMinWidth: null,
            barWidth: null,
 
            animationUpdate: false,
            animationEasing: 'linear',
            animationDuration: 300
        },
 
        /**
         * Get dimension for shadow in dataZoom
         * @return {string} dimension name
         */
        getShadowDim: function () {
            return 'open';
        },
 
        /**
         * @override
         */
        formatTooltip: function (dataIndex, mutipleSeries) {
            // It rearly use mutiple candlestick series in one cartesian,
            // so only consider one series in this default tooltip.
            var valueHTML = zrUtil.map(this.valueDimensions, function (dim) {
                return encodeHTML(dim + ': ' + addCommas(this.getData().get(dim, dataIndex)));
            }, this).join('<br />');
 
            var html = [];
            this.name != null && html.push(encodeHTML(this.name));
            valueHTML != null && html.push(valueHTML);
 
            return html.join('<br />');
        },
 
        brushSelector: function (dataIndex, data, selectors) {
            var itemLayout = data.getItemLayout(dataIndex);
            return selectors.rect(itemLayout.brushRect);
        }
 
    });
 
    zrUtil.mixin(CandlestickSeries, whiskerBoxCommon.seriesModelMixin, true);
 
    module.exports = CandlestickSeries;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/candlestick/CandlestickView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/candlestick/CandlestickView.js

Statements: 40% (10 / 25)      Branches: 0% (0 / 2)      Functions: 0% (0 / 2)      Lines: 40% (10 / 25)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55      1 1 1 1   1                     1     1 1   1                                                   1      
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
    var ChartView = require('../../view/Chart');
    var graphic = require('../../util/graphic');
    var whiskerBoxCommon = require('../helper/whiskerBoxCommon');
 
    var CandlestickView = ChartView.extend({
 
        type: 'candlestick',
 
        getStyleUpdater: function () {
            return updateStyle;
        },
 
        dispose: zrUtil.noop
    });
 
    zrUtil.mixin(CandlestickView, whiskerBoxCommon.viewMixin, true);
 
    // Update common properties
    var normalStyleAccessPath = ['itemStyle', 'normal'];
    var emphasisStyleAccessPath = ['itemStyle', 'emphasis'];
 
    function updateStyle(itemGroup, data, idx) {
        var itemModel = data.getItemModel(idx);
        var normalItemStyleModel = itemModel.getModel(normalStyleAccessPath);
        var color = data.getItemVisual(idx, 'color');
        var borderColor = data.getItemVisual(idx, 'borderColor') || color;
 
        // Color must be excluded.
        // Because symbol provide setColor individually to set fill and stroke
        var itemStyle = normalItemStyleModel.getItemStyle(
            ['color', 'color0', 'borderColor', 'borderColor0']
        );
 
        var whiskerEl = itemGroup.childAt(itemGroup.whiskerIndex);
        whiskerEl.useStyle(itemStyle);
        whiskerEl.style.stroke = borderColor;
 
        var bodyEl = itemGroup.childAt(itemGroup.bodyIndex);
        bodyEl.useStyle(itemStyle);
        bodyEl.style.fill = color;
        bodyEl.style.stroke = borderColor;
 
        var hoverStyle = itemModel.getModel(emphasisStyleAccessPath).getItemStyle();
        graphic.setHoverStyle(itemGroup, hoverStyle);
    }
 
 
    module.exports = CandlestickView;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/candlestick/candlestickLayout.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/candlestick/candlestickLayout.js

Statements: 12.5% (7 / 56)      Branches: 0% (0 / 22)      Functions: 0% (0 / 7)      Lines: 12.5% (7 / 56)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122    1 1   1                                                                                                     1                 1                   1                                     1                                                      
 
 
    var retrieve = require('zrender/lib/core/util').retrieve;
    var parsePercent = require('../../util/number').parsePercent;
 
    module.exports = function (ecModel) {
 
        ecModel.eachSeriesByType('candlestick', function (seriesModel) {
 
            var coordSys = seriesModel.coordinateSystem;
            var data = seriesModel.getData();
            var dimensions = seriesModel.dimensions;
            var chartLayout = seriesModel.get('layout');
 
            var candleWidth = calculateCandleWidth(seriesModel, data);
 
            data.each(dimensions, function () {
                var args = arguments;
                var dimLen = dimensions.length;
                var axisDimVal = args[0];
                var idx = args[dimLen];
                var variableDim = chartLayout === 'horizontal' ? 0 : 1;
                var constDim = 1 - variableDim;
 
                var openVal = args[1];
                var closeVal = args[2];
                var lowestVal = args[3];
                var highestVal = args[4];
 
                var ocLow = Math.min(openVal, closeVal);
                var ocHigh = Math.max(openVal, closeVal);
 
                var ocLowPoint = getPoint(ocLow);
                var ocHighPoint = getPoint(ocHigh);
                var lowestPoint = getPoint(lowestVal);
                var highestPoint = getPoint(highestVal);
 
                var whiskerEnds = [
                    [highestPoint, ocHighPoint],
                    [lowestPoint, ocLowPoint]
                ];
 
                var bodyEnds = [];
                addBodyEnd(ocHighPoint, 0);
                addBodyEnd(ocLowPoint, 1);
 
                data.setItemLayout(idx, {
                    chartLayout: chartLayout,
                    sign: openVal > closeVal ? -1 : openVal < closeVal ? 1 : 0,
                    initBaseline: openVal > closeVal
                        ? ocHighPoint[constDim] : ocLowPoint[constDim], // open point.
                    bodyEnds: bodyEnds,
                    whiskerEnds: whiskerEnds,
                    brushRect: makeBrushRect()
                });
 
                function getPoint(val) {
                    var p = [];
                    p[variableDim] = axisDimVal;
                    p[constDim] = val;
                    return (isNaN(axisDimVal) || isNaN(val))
                        ? [NaN, NaN]
                        : coordSys.dataToPoint(p);
                }
 
                function addBodyEnd(point, start) {
                    var point1 = point.slice();
                    var point2 = point.slice();
                    point1[variableDim] += candleWidth / 2;
                    point2[variableDim] -= candleWidth / 2;
                    start
                        ? bodyEnds.push(point1, point2)
                        : bodyEnds.push(point2, point1);
                }
 
                function makeBrushRect() {
                    var pmin = getPoint(Math.min(openVal, closeVal, lowestVal, highestVal));
                    var pmax = getPoint(Math.max(openVal, closeVal, lowestVal, highestVal));
 
                    pmin[variableDim] -= candleWidth / 2;
                    pmax[variableDim] -= candleWidth / 2;
 
                    return {
                        x: pmin[0],
                        y: pmin[1],
                        width: constDim ? candleWidth : pmax[0] - pmin[0],
                        height: constDim ? pmax[1] - pmin[1] : candleWidth
                    };
                }
 
            }, true);
        });
    };
 
    function calculateCandleWidth(seriesModel, data) {
        var baseAxis = seriesModel.getBaseAxis();
        var extent;
 
        var bandWidth = baseAxis.type === 'category'
            ? baseAxis.getBandWidth()
            : (
                extent = baseAxis.getExtent(),
                Math.abs(extent[1] - extent[0]) / data.count()
            );
 
        var barMaxWidth = parsePercent(
            retrieve(seriesModel.get('barMaxWidth'), bandWidth),
            bandWidth
        );
        var barMinWidth = parsePercent(
            retrieve(seriesModel.get('barMinWidth'), 1),
            bandWidth
        );
        var barWidth = seriesModel.get('barWidth');
        return barWidth != null
            ? parsePercent(barWidth, bandWidth)
            // Put max outer to ensure bar visible in spite of overlap.
            : Math.max(Math.min(bandWidth / 2, barMaxWidth), barMinWidth);
    }
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/candlestick/candlestickVisual.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/candlestick/candlestickVisual.js

Statements: 38.46% (5 / 13)      Branches: 0% (0 / 6)      Functions: 0% (0 / 3)      Lines: 38.46% (5 / 13)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41    1 1 1 1   1                                                                  
 
 
    var positiveBorderColorQuery = ['itemStyle', 'normal', 'borderColor'];
    var negativeBorderColorQuery = ['itemStyle', 'normal', 'borderColor0'];
    var positiveColorQuery = ['itemStyle', 'normal', 'color'];
    var negativeColorQuery = ['itemStyle', 'normal', 'color0'];
 
    module.exports = function (ecModel, api) {
 
        ecModel.eachRawSeriesByType('candlestick', function (seriesModel) {
 
            var data = seriesModel.getData();
 
            data.setVisual({
                legendSymbol: 'roundRect'
            });
 
            // Only visible series has each data be visual encoded
            if (!ecModel.isSeriesFiltered(seriesModel)) {
                data.each(function (idx) {
                    var itemModel = data.getItemModel(idx);
                    var sign = data.getItemLayout(idx).sign;
 
                    data.setItemVisual(
                        idx,
                        {
                            color: itemModel.get(
                                sign > 0 ? positiveColorQuery : negativeColorQuery
                            ),
                            borderColor: itemModel.get(
                                sign > 0 ? positiveBorderColorQuery : negativeBorderColorQuery
                            )
                        }
                    );
                });
            }
        });
 
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/candlestick/preprocessor.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/candlestick/preprocessor.js

Statements: 28.57% (2 / 7)      Branches: 0% (0 / 8)      Functions: 0% (0 / 2)      Lines: 28.57% (2 / 7)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19    1   1                            
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    module.exports = function (option) {
        if (!option || !zrUtil.isArray(option.series)) {
            return;
        }
 
        // Translate 'k' to 'candlestick'.
        zrUtil.each(option.series, function (seriesItem) {
            if (zrUtil.isObject(seriesItem) && seriesItem.type === 'k') {
                seriesItem.type = 'candlestick';
            }
        });
    };
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/chord/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/chord/

Statements: 13.33% (16 / 120)      Branches: 0% (0 / 40)      Functions: 0% (0 / 19)      Lines: 13.33% (16 / 120)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/chart/chord/
File Statements Branches Functions Lines
ChordSeries.js 31.25% (5 / 16) 0% (0 / 12) 0% (0 / 3) 31.25% (5 / 16)
ChordView.js 11.54% (3 / 26) 0% (0 / 2) 0% (0 / 5) 11.54% (3 / 26)
Ribbon.js 11.54% (3 / 26) 0% (0 / 6) 0% (0 / 1) 11.54% (3 / 26)
chordCircularLayout.js 9.62% (5 / 52) 0% (0 / 20) 0% (0 / 10) 9.62% (5 / 52)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/chord/ChordSeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/chord/ChordSeries.js

Statements: 31.25% (5 / 16)      Branches: 0% (0 / 12)      Functions: 0% (0 / 3)      Lines: 31.25% (5 / 16)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65    1 1 1   1                                                                                                               1    
 
 
    var SeriesModel = require('../../model/Series');
    var createGraphFromNodeEdge = require('../helper/createGraphFromNodeEdge');
    var createGraphFromNodeMatrix = require('../helper/createGraphFromNodeMatrix');
 
    var ChordSeries = SeriesModel.extend({
 
        type: 'series.chord',
 
        getInitialData: function (option) {
            var edges = option.edges || option.links;
            var nodes = option.data || option.nodes;
            var matrix = option.matrix;
            if (nodes && edges) {
                var graph = createGraphFromNodeEdge(nodes, edges, this, true);
                return graph.data;
            }
            else if (nodes && matrix) {
                var graph = createGraphFromNodeMatrix(nodes, matrix, this, true);
                return graph.data;
            }
        },
 
        /**
         * @return {module:echarts/data/Graph}
         */
        getGraph: function () {
            return this.getData().graph;
        },
 
        /**
         * @return {module:echarts/data/List}
         */
        getEdgeData: function () {
            return this.getGraph().edgeData;
        },
 
        defaultOption: {
            center: ['50%', '50%'],
            radius: ['65%', '75%'],
            //
            // layout: 'circular',
 
            sort: 'none',
            sortSub: 'none',
            padding: 0.02,
            startAngle: 90,
            clockwise: true,
 
            itemStyle: {
                normal: {},
                emphasis: {}
            },
 
            chordStyle: {
                normal: {},
                emphasis: {}
            }
        }
    });
 
    module.exports = ChordSeries;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/chord/ChordView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/chord/ChordView.js

Statements: 11.54% (3 / 26)      Branches: 0% (0 / 2)      Functions: 0% (0 / 5)      Lines: 11.54% (3 / 26)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78    1 1   1                                                                                                                                                
 
 
    var RibbonPath = require('./Ribbon');
    var graphic = require('../../util/graphic');
 
    module.exports = require('../../echarts').extendChartView({
 
        type: 'chord',
 
        init: function (option) {
 
        },
 
        render: function (seriesModel, ecModel, api) {
            var data = seriesModel.getData();
            var graph = seriesModel.getGraph();
            var edgeData = seriesModel.getEdgeData();
 
            var group = this.group;
            group.removeAll();
 
            data.each(function (idx) {
                var layout = data.getItemLayout(idx);
                var sector = new graphic.Sector({
                    shape: {
                        cx: layout.cx,
                        cy: layout.cy,
                        clockwise: layout.clockwise,
                        r0: layout.r0,
                        r: layout.r,
                        startAngle: layout.startAngle,
                        endAngle: layout.endAngle
                    }
                });
 
                sector.setStyle({
                    fill: data.getItemVisual(idx, 'color')
                });
 
                data.setItemLayout(idx);
                group.add(sector);
            });
 
            var edgeRendered = {};
            edgeData.each(function (idx) {
                if (edgeRendered[idx]) {
                    return;
                }
                var layout = edgeData.getItemLayout(idx);
                var edge = graph.getEdgeByIndex(idx);
                var otherEdge = graph.getEdge(edge.node2, edge.node1);
                var otherEdgeLayout = otherEdge.getLayout();
                edgeRendered[idx] = edgeRendered[otherEdge.dataIndex] = true;
                var ribbon = new RibbonPath({
                    shape: {
                        cx: layout.cx,
                        cy: layout.cy,
                        r: layout.r,
                        s0: layout.startAngle,
                        s1: layout.endAngle,
                        t0: otherEdgeLayout.startAngle,
                        t1: otherEdgeLayout.endAngle,
                        clockwise: layout.clockwise
                    }
                });
                ribbon.setStyle({
                    // Use color of source
                    fill: edge.node1.getVisual('color'),
                    opacity: 0.5
                });
                group.add(ribbon);
            });
        },
 
        dispose: function () {}
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/chord/Ribbon.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/chord/Ribbon.js

Statements: 11.54% (3 / 26)      Branches: 0% (0 / 6)      Functions: 0% (0 / 1)      Lines: 11.54% (3 / 26)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68    1 1   1                                                                                                                            
 
 
    var sin = Math.sin;
    var cos = Math.cos;
 
    module.exports = require('../../util/graphic').extendShape({
 
        type: 'ec-ribbon',
 
        shape: {
            cx: 0,
            cy: 0,
            r: 0,
            s0: 0,
            s1: 0,
            t0: 0,
            t1: 0
        },
 
        style: {
            fill: '#000'
        },
 
        buildPath: function (ctx, shape) {
 
            var clockwise = shape.clockwise || false;
 
            var cx = shape.cx;
            var cy = shape.cy;
            var r = shape.r;
            var s0 = shape.s0;
            var s1 = shape.s1;
            var t0 = shape.t0;
            var t1 = shape.t1;
            var sx0 = cx + cos(s0) * r;
            var sy0 = cy + sin(s0) * r;
            var sx1 = cx + cos(s1) * r;
            var sy1 = cy + sin(s1) * r;
            var tx0 = cx + cos(t0) * r;
            var ty0 = cy + sin(t0) * r;
            var tx1 = cx + cos(t1) * r;
            var ty1 = cy + sin(t1) * r;
 
            ctx.moveTo(sx0, sy0);
            ctx.arc(cx, cy, shape.r, s0, s1, !clockwise);
            ctx.bezierCurveTo(
                (cx - sx1) * 0.70 + sx1,
                (cy - sy1) * 0.70 + sy1,
                (cx - tx0) * 0.70 + tx0,
                (cy - ty0) * 0.70 + ty0,
                tx0, ty0
            );
            // Chord to self
            if (shape.s0 === shape.t0 && shape.s1 === shape.t1) {
                return;
            }
            ctx.arc(cx, cy, shape.r, t0, t1, !clockwise);
            ctx.bezierCurveTo(
                (cx - tx1) * 0.70 + tx1,
                (cy - ty1) * 0.70 + ty1,
                (cx - sx0) * 0.70 + sx0,
                (cy - sy0) * 0.70 + sy0,
                sx0, sy0
            );
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/chord/chordCircularLayout.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/chord/chordCircularLayout.js

Statements: 9.62% (5 / 52)      Branches: 0% (0 / 20)      Functions: 0% (0 / 10)      Lines: 9.62% (5 / 52)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124            1 1       1                                                                                                                                                                   1       1                                                    
/**
 * Chord layout
 * @module echarts/chart/chord/chordCircularLayout
 * @author pissang(http://github.com/pissang)
 */
 
    var zrUtil = require('zrender/lib/core/util');
    var numberUtil = require('../../util/number');
    /**
     * @param {module:echarts/data/Graph} graph
     */
    function layout(graphs, opts) {
        if (!zrUtil.isArray(graphs)) {
            graphs = [graphs];
        }
 
        var graph0 = graphs[0];
 
        var groups = [];
 
        // Init groups
        graph0.eachNode(function (node) {
            var group = {
                size: 0,
                subGroups: [],
                node: node
            };
            groups.push(group);
        });
 
        zrUtil.each(graphs, function (graph) {
            graph.eachEdge(function (edge) {
                var g1 = groups[edge.node1.dataIndex];
                g1.size += edge.getValue('value') || 0;
 
                g1.subGroups.push({
                    size: edge.getValue('value'),
                    edge: edge
                });
            });
        });
 
        var sumSize = zrUtil.reduce(groups, function (sumSize, group) {
            return sumSize + group.size;
        }, 0);
 
        if (opts.sort && opts.sort != 'none') {
            groups.sort(compareGroups);
            if (opts.sort === 'descending') {
                groups.revert();
            }
        }
 
        var unitAngle = (Math.PI * 2 - opts.padding * graph0.data.count()) / sumSize;
        var angle = opts.startAngle * Math.PI / 180;
        var sign = opts.clockwise ? -1 : 1;
        zrUtil.each(groups, function (group) {
            if (opts.sortSub && opts.sortSub != 'none') {
                group.subGroups.sort(compareGroups);
                if (opts.sortSub === 'descending') {
                    group.subGroups.revert();
                }
            }
 
            var endAngle = angle + sign * group.size * unitAngle;
            group.node.setLayout({
                startAngle: -angle,
                endAngle: -endAngle,
                cx: opts.cx,
                cy: opts.cy,
                r0: opts.r0,
                r: opts.r,
                clockwise: opts.clockwise
            });
            zrUtil.each(group.subGroups, function (subGroup) {
                var startAngle = angle;
                var endAngle = angle + sign * subGroup.size * unitAngle;
                var layout = subGroup.edge.getLayout() || {
                    cx: opts.cx,
                    cy: opts.cy,
                    r: opts.r0,
                    clockwise: opts.clockwise
                };
                layout.startAngle = -startAngle;
                layout.endAngle = -endAngle;
                subGroup.edge.setLayout(layout);
                angle = endAngle;
            });
 
            angle = endAngle + sign * opts.padding;
        });
    }
 
    var compareGroups = function (a, b) {
        return a.size - b.size;
    };
 
    module.exports = function (ecModel, api, payload) {
        ecModel.eachSeriesByType('chord', function (chordSeries) {
            var graph = chordSeries.getGraph();
 
            var center = chordSeries.get('center');
            var radius = chordSeries.get('radius');
 
            var parsePercent = numberUtil.parsePercent;
            var viewWidth = api.getWidth();
            var viewHeight = api.getHeight();
            var viewSize = Math.min(viewWidth, viewHeight) / 2;
 
            layout(graph, {
                sort: chordSeries.get('sort'),
                sortSub: chordSeries.get('sortSub'),
                padding: chordSeries.get('padding'),
                startAngle: chordSeries.get('startAngle'),
                clockwise: chordSeries.get('clockwise'),
                cx: parsePercent(center[0], viewWidth),
                cy: parsePercent(center[1], viewHeight),
                r0: parsePercent(radius[0], viewSize),
                r: parsePercent(radius[1], viewSize)
            });
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/effectScatter/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/effectScatter/

Statements: 40% (6 / 15)      Branches: 0% (0 / 2)      Functions: 0% (0 / 6)      Lines: 40% (6 / 15)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/chart/effectScatter/
File Statements Branches Functions Lines
EffectScatterSeries.js 60% (3 / 5) 100% (0 / 0) 0% (0 / 1) 60% (3 / 5)
EffectScatterView.js 30% (3 / 10) 0% (0 / 2) 0% (0 / 5) 30% (3 / 10)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/effectScatter/EffectScatterSeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/effectScatter/EffectScatterSeries.js

Statements: 60% (3 / 5)      Branches: 100% (0 / 0)      Functions: 0% (0 / 1)      Lines: 60% (3 / 5)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69      1 1   1                                                                                                                            
'use strict';
 
 
    var createListFromArray = require('../helper/createListFromArray');
    var SeriesModel = require('../../model/Series');
 
    module.exports = SeriesModel.extend({
 
        type: 'series.effectScatter',
 
        dependencies: ['grid', 'polar'],
 
        getInitialData: function (option, ecModel) {
            var list = createListFromArray(option.data, this, ecModel);
            return list;
        },
 
        brushSelector: 'point',
 
        defaultOption: {
            coordinateSystem: 'cartesian2d',
            zlevel: 0,
            z: 2,
            legendHoverLink: true,
 
            effectType: 'ripple',
 
            progressive: 0,
 
            // When to show the effect, option: 'render'|'emphasis'
            showEffectOn: 'render',
 
            // Ripple effect config
            rippleEffect: {
                period: 4,
                // Scale of ripple
                scale: 2.5,
                // Brush type can be fill or stroke
                brushType: 'fill'
            },
 
            // Cartesian coordinate system
            // xAxisIndex: 0,
            // yAxisIndex: 0,
 
            // Polar coordinate system
            // polarIndex: 0,
 
            // Geo coordinate system
            // geoIndex: 0,
 
            // symbol: null,        // 图形类型
            symbolSize: 10          // 图形大小,半宽(半径)参数,当图形为方向或菱形则总宽度为symbolSize * 2
            // symbolRotate: null,  // 图形旋转控制
 
            // large: false,
            // Available when large is true
            // largeThreshold: 2000,
 
            // itemStyle: {
            //     normal: {
            //         opacity: 1
            //     }
            // }
        }
 
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/effectScatter/EffectScatterView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/effectScatter/EffectScatterView.js

Statements: 30% (3 / 10)      Branches: 0% (0 / 2)      Functions: 0% (0 / 5)      Lines: 30% (3 / 10)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32    1 1   1                                                    
 
 
    var SymbolDraw = require('../helper/SymbolDraw');
    var EffectSymbol = require('../helper/EffectSymbol');
 
    require('../../echarts').extendChartView({
 
        type: 'effectScatter',
 
        init: function () {
            this._symbolDraw = new SymbolDraw(EffectSymbol);
        },
 
        render: function (seriesModel, ecModel, api) {
            var data = seriesModel.getData();
            var effectSymbolDraw = this._symbolDraw;
            effectSymbolDraw.updateData(data);
            this.group.add(effectSymbolDraw.group);
        },
 
        updateLayout: function () {
            this._symbolDraw.updateLayout();
        },
 
        remove: function (ecModel, api) {
            this._symbolDraw && this._symbolDraw.remove(api);
        },
 
        dispose: function () {}
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/funnel/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/funnel/

Statements: 11.96% (25 / 209)      Branches: 0% (0 / 43)      Functions: 0% (0 / 26)      Lines: 11.96% (25 / 209)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/chart/funnel/
File Statements Branches Functions Lines
FunnelSeries.js 20.83% (5 / 24) 0% (0 / 6) 0% (0 / 5) 20.83% (5 / 24)
FunnelView.js 14.94% (13 / 87) 0% (0 / 13) 0% (0 / 12) 14.94% (13 / 87)
funnelLayout.js 7.14% (7 / 98) 0% (0 / 24) 0% (0 / 9) 7.14% (7 / 98)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/funnel/FunnelSeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/funnel/FunnelSeries.js

Statements: 20.83% (5 / 24)      Branches: 0% (0 / 6)      Functions: 0% (0 / 5)      Lines: 20.83% (5 / 24)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114      1 1 1   1                                                                                                                                                                                                             1      
'use strict';
 
 
    var List = require('../../data/List');
    var modelUtil = require('../../util/model');
    var completeDimensions = require('../../data/helper/completeDimensions');
 
    var FunnelSeries = require('../../echarts').extendSeriesModel({
 
        type: 'series.funnel',
 
        init: function (option) {
            FunnelSeries.superApply(this, 'init', arguments);
 
            // Enable legend selection for each data item
            // Use a function instead of direct access because data reference may changed
            this.legendDataProvider = function () {
                return this.getRawData();
            };
            // Extend labelLine emphasis
            this._defaultLabelLine(option);
        },
 
        getInitialData: function (option, ecModel) {
            var dimensions = completeDimensions(['value'], option.data);
            var list = new List(dimensions, this);
            list.initData(option.data);
            return list;
        },
 
        _defaultLabelLine: function (option) {
            // Extend labelLine emphasis
            modelUtil.defaultEmphasis(option.labelLine, ['show']);
 
            var labelLineNormalOpt = option.labelLine.normal;
            var labelLineEmphasisOpt = option.labelLine.emphasis;
            // Not show label line if `label.normal.show = false`
            labelLineNormalOpt.show = labelLineNormalOpt.show
                && option.label.normal.show;
            labelLineEmphasisOpt.show = labelLineEmphasisOpt.show
                && option.label.emphasis.show;
        },
 
        // Overwrite
        getDataParams: function (dataIndex) {
            var data = this.getData();
            var params = FunnelSeries.superCall(this, 'getDataParams', dataIndex);
            var sum = data.getSum('value');
            // Percent is 0 if sum is 0
            params.percent = !sum ? 0 : +(data.get('value', dataIndex) / sum * 100).toFixed(2);
 
            params.$vars.push('percent');
            return params;
        },
 
        defaultOption: {
            zlevel: 0,                  // 一级层叠
            z: 2,                       // 二级层叠
            legendHoverLink: true,
            left: 80,
            top: 60,
            right: 80,
            bottom: 60,
            // width: {totalWidth} - left - right,
            // height: {totalHeight} - top - bottom,
 
            // 默认取数据最小最大值
            // min: 0,
            // max: 100,
            minSize: '0%',
            maxSize: '100%',
            sort: 'descending', // 'ascending', 'descending'
            gap: 0,
            funnelAlign: 'center',
            label: {
                normal: {
                    show: true,
                    position: 'outer'
                    // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调
                    // textStyle: null      // 默认使用全局文本样式,详见TEXTSTYLE
                },
                emphasis: {
                    show: true
                }
            },
            labelLine: {
                normal: {
                    show: true,
                    length: 20,
                    lineStyle: {
                        // color: 各异,
                        width: 1,
                        type: 'solid'
                    }
                },
                emphasis: {}
            },
            itemStyle: {
                normal: {
                    // color: 各异,
                    borderColor: '#fff',
                    borderWidth: 1
                },
                emphasis: {
                    // color: 各异,
                }
            }
        }
    });
 
    module.exports = FunnelSeries;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/funnel/FunnelView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/funnel/FunnelView.js

Statements: 14.94% (13 / 87)      Branches: 0% (0 / 13)      Functions: 0% (0 / 12)      Lines: 14.94% (13 / 87)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217    1 1             1                           1       1                   1   1                             1 1                                                                                                             1                                                                                                                 1     1                                                                                     1    
 
 
    var graphic = require('../../util/graphic');
    var zrUtil = require('zrender/lib/core/util');
 
    /**
     * Piece of pie including Sector, Label, LabelLine
     * @constructor
     * @extends {module:zrender/graphic/Group}
     */
    function FunnelPiece(data, idx) {
 
        graphic.Group.call(this);
 
        var polygon = new graphic.Polygon();
        var labelLine = new graphic.Polyline();
        var text = new graphic.Text();
        this.add(polygon);
        this.add(labelLine);
        this.add(text);
 
        this.updateData(data, idx, true);
 
        // Hover to change label and labelLine
        function onEmphasis() {
            labelLine.ignore = labelLine.hoverIgnore;
            text.ignore = text.hoverIgnore;
        }
        function onNormal() {
            labelLine.ignore = labelLine.normalIgnore;
            text.ignore = text.normalIgnore;
        }
        this.on('emphasis', onEmphasis)
            .on('normal', onNormal)
            .on('mouseover', onEmphasis)
            .on('mouseout', onNormal);
    }
 
    var funnelPieceProto = FunnelPiece.prototype;
 
    function getLabelStyle(data, idx, state, labelModel) {
        var textStyleModel = labelModel.getModel('textStyle');
        var position = labelModel.get('position');
        var isLabelInside = position === 'inside' || position === 'inner' || position === 'center';
        return {
            fill: textStyleModel.getTextColor()
                || (isLabelInside ? '#fff' : data.getItemVisual(idx, 'color')),
            textFont: textStyleModel.getFont(),
            text: zrUtil.retrieve(
                data.hostModel.getFormattedLabel(idx, state),
                data.getName(idx)
            )
        };
    }
 
    var opacityAccessPath = ['itemStyle', 'normal', 'opacity'];
    funnelPieceProto.updateData = function (data, idx, firstCreate) {
 
        var polygon = this.childAt(0);
 
        var seriesModel = data.hostModel;
        var itemModel = data.getItemModel(idx);
        var layout = data.getItemLayout(idx);
        var opacity = data.getItemModel(idx).get(opacityAccessPath);
        opacity = opacity == null ? 1 : opacity;
 
        // Reset style
        polygon.useStyle({});
 
        if (firstCreate) {
            polygon.setShape({
                points: layout.points
            });
            polygon.setStyle({ opacity : 0 });
            graphic.initProps(polygon, {
                style: {
                    opacity: opacity
                }
            }, seriesModel, idx);
        }
        else {
            graphic.updateProps(polygon, {
                style: {
                    opacity: opacity
                },
                shape: {
                    points: layout.points
                }
            }, seriesModel, idx);
        }
 
        // Update common style
        var itemStyleModel = itemModel.getModel('itemStyle');
        var visualColor = data.getItemVisual(idx, 'color');
 
        polygon.setStyle(
            zrUtil.defaults(
                {
                    lineJoin: 'round',
                    fill: visualColor
                },
                itemStyleModel.getModel('normal').getItemStyle(['opacity'])
            )
        );
        polygon.hoverStyle = itemStyleModel.getModel('emphasis').getItemStyle();
 
        this._updateLabel(data, idx);
 
        graphic.setHoverStyle(this);
    };
 
    funnelPieceProto._updateLabel = function (data, idx) {
 
        var labelLine = this.childAt(1);
        var labelText = this.childAt(2);
 
        var seriesModel = data.hostModel;
        var itemModel = data.getItemModel(idx);
        var layout = data.getItemLayout(idx);
        var labelLayout = layout.label;
        var visualColor = data.getItemVisual(idx, 'color');
 
        graphic.updateProps(labelLine, {
            shape: {
                points: labelLayout.linePoints || labelLayout.linePoints
            }
        }, seriesModel, idx);
 
        graphic.updateProps(labelText, {
            style: {
                x: labelLayout.x,
                y: labelLayout.y
            }
        }, seriesModel, idx);
        labelText.attr({
            style: {
                textAlign: labelLayout.textAlign,
                textVerticalAlign: labelLayout.verticalAlign,
                textFont: labelLayout.font
            },
            rotation: labelLayout.rotation,
            origin: [labelLayout.x, labelLayout.y],
            z2: 10
        });
 
        var labelModel = itemModel.getModel('label.normal');
        var labelHoverModel = itemModel.getModel('label.emphasis');
        var labelLineModel = itemModel.getModel('labelLine.normal');
        var labelLineHoverModel = itemModel.getModel('labelLine.emphasis');
 
        labelText.setStyle(getLabelStyle(data, idx, 'normal', labelModel));
 
        labelText.ignore = labelText.normalIgnore = !labelModel.get('show');
        labelText.hoverIgnore = !labelHoverModel.get('show');
 
        labelLine.ignore = labelLine.normalIgnore = !labelLineModel.get('show');
        labelLine.hoverIgnore = !labelLineHoverModel.get('show');
 
        // Default use item visual color
        labelLine.setStyle({
            stroke: visualColor
        });
        labelLine.setStyle(labelLineModel.getModel('lineStyle').getLineStyle());
 
        labelText.hoverStyle = getLabelStyle(data, idx, 'emphasis', labelHoverModel);
        labelLine.hoverStyle = labelLineHoverModel.getModel('lineStyle').getLineStyle();
    };
 
    zrUtil.inherits(FunnelPiece, graphic.Group);
 
 
    var Funnel = require('../../view/Chart').extend({
 
        type: 'funnel',
 
        render: function (seriesModel, ecModel, api) {
            var data = seriesModel.getData();
            var oldData = this._data;
 
            var group = this.group;
 
            data.diff(oldData)
                .add(function (idx) {
                    var funnelPiece = new FunnelPiece(data, idx);
 
                    data.setItemGraphicEl(idx, funnelPiece);
 
                    group.add(funnelPiece);
                })
                .update(function (newIdx, oldIdx) {
                    var piePiece = oldData.getItemGraphicEl(oldIdx);
 
                    piePiece.updateData(data, newIdx);
 
                    group.add(piePiece);
                    data.setItemGraphicEl(newIdx, piePiece);
                })
                .remove(function (idx) {
                    var piePiece = oldData.getItemGraphicEl(idx);
                    group.remove(piePiece);
                })
                .execute();
 
            this._data = data;
        },
 
        remove: function () {
            this.group.removeAll();
            this._data = null;
        },
 
        dispose: function () {}
    });
 
    module.exports = Funnel;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/funnel/funnelLayout.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/funnel/funnelLayout.js

Statements: 7.14% (7 / 98)      Branches: 0% (0 / 24)      Functions: 0% (0 / 9)      Lines: 7.14% (7 / 98)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178    1 1   1   1                 1                                         1                                                                                                                                 1                                                                                                                                                      
 
 
    var layout = require('../../util/layout');
    var number = require('../../util/number');
 
    var parsePercent = number.parsePercent;
 
    function getViewRect(seriesModel, api) {
        return layout.getLayoutRect(
            seriesModel.getBoxLayoutParams(), {
                width: api.getWidth(),
                height: api.getHeight()
            }
        );
    }
 
    function getSortedIndices(data, sort) {
        var valueArr = data.mapArray('value', function (val) {
            return val;
        });
        var indices = [];
        var isAscending = sort === 'ascending';
        for (var i = 0, len = data.count(); i < len; i++) {
            indices[i] = i;
        }
 
        // Add custom sortable function & none sortable opetion by "options.sort"
        if (typeof sort === 'function') {
            indices.sort(sort);
        } else if (sort !== 'none') {
            indices.sort(function (a, b) {
                return isAscending ? valueArr[a] - valueArr[b] : valueArr[b] - valueArr[a];
            });
        }
        return indices;
    }
 
    function labelLayout (data) {
        data.each(function (idx) {
            var itemModel = data.getItemModel(idx);
            var labelModel = itemModel.getModel('label.normal');
            var labelPosition = labelModel.get('position');
 
            var labelLineModel = itemModel.getModel('labelLine.normal');
 
            var layout = data.getItemLayout(idx);
            var points = layout.points;
 
            var isLabelInside = labelPosition === 'inner'
                || labelPosition === 'inside' || labelPosition === 'center';
 
            var textAlign;
            var textX;
            var textY;
            var linePoints;
 
            if (isLabelInside) {
                textX = (points[0][0] + points[1][0] + points[2][0] + points[3][0]) / 4;
                textY = (points[0][1] + points[1][1] + points[2][1] + points[3][1]) / 4;
                textAlign = 'center';
                linePoints = [
                    [textX, textY], [textX, textY]
                ];
            }
            else {
                var x1;
                var y1;
                var x2;
                var labelLineLen = labelLineModel.get('length');
                if (labelPosition === 'left') {
                    // Left side
                    x1 = (points[3][0] + points[0][0]) / 2;
                    y1 = (points[3][1] + points[0][1]) / 2;
                    x2 = x1 - labelLineLen;
                    textX = x2 - 5;
                    textAlign = 'right';
                }
                else {
                    // Right side
                    x1 = (points[1][0] + points[2][0]) / 2;
                    y1 = (points[1][1] + points[2][1]) / 2;
                    x2 = x1 + labelLineLen;
                    textX = x2 + 5;
                    textAlign = 'left';
                }
                var y2 = y1;
 
                linePoints = [[x1, y1], [x2, y2]];
                textY = y2;
            }
 
            layout.label = {
                linePoints: linePoints,
                x: textX,
                y: textY,
                verticalAlign: 'middle',
                textAlign: textAlign,
                inside: isLabelInside
            };
        });
    }
 
    module.exports = function (ecModel, api, payload) {
        ecModel.eachSeriesByType('funnel', function (seriesModel) {
            var data = seriesModel.getData();
            var sort = seriesModel.get('sort');
            var viewRect = getViewRect(seriesModel, api);
            var indices = getSortedIndices(data, sort);
 
            var sizeExtent = [
                parsePercent(seriesModel.get('minSize'), viewRect.width),
                parsePercent(seriesModel.get('maxSize'), viewRect.width)
            ];
            var dataExtent = data.getDataExtent('value');
            var min = seriesModel.get('min');
            var max = seriesModel.get('max');
            if (min == null) {
                min = Math.min(dataExtent[0], 0);
            }
            if (max == null) {
                max = dataExtent[1];
            }
 
            var funnelAlign = seriesModel.get('funnelAlign');
            var gap = seriesModel.get('gap');
            var itemHeight = (viewRect.height - gap * (data.count() - 1)) / data.count();
 
            var y = viewRect.y;
 
            var getLinePoints = function (idx, offY) {
                // End point index is data.count() and we assign it 0
                var val = data.get('value', idx) || 0;
                var itemWidth = number.linearMap(val, [min, max], sizeExtent, true);
                var x0;
                switch (funnelAlign) {
                    case 'left':
                        x0 = viewRect.x;
                        break;
                    case 'center':
                        x0 = viewRect.x + (viewRect.width - itemWidth) / 2;
                        break;
                    case 'right':
                        x0 = viewRect.x + viewRect.width - itemWidth;
                        break;
                }
                return [
                    [x0, offY],
                    [x0 + itemWidth, offY]
                ];
            };
 
            if (sort === 'ascending') {
                // From bottom to top
                itemHeight = -itemHeight;
                gap = -gap;
                y += viewRect.height;
                indices = indices.reverse();
            }
 
            for (var i = 0; i < indices.length; i++) {
                var idx = indices[i];
                var nextIdx = indices[i + 1];
                var start = getLinePoints(idx, y);
                var end = getLinePoints(nextIdx, y + itemHeight);
 
                y += itemHeight + gap;
 
                data.setItemLayout(idx, {
                    points: start.concat(end.slice().reverse())
                });
            }
 
            labelLayout(data);
        });
    };
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/gauge/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/gauge/

Statements: 7.98% (15 / 188)      Branches: 0% (0 / 62)      Functions: 0% (0 / 17)      Lines: 7.98% (15 / 188)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/chart/gauge/
File Statements Branches Functions Lines
GaugeSeries.js 45.45% (5 / 11) 0% (0 / 4) 0% (0 / 1) 45.45% (5 / 11)
GaugeView.js 5.56% (9 / 162) 0% (0 / 54) 0% (0 / 15) 5.56% (9 / 162)
PointerPath.js 6.67% (1 / 15) 0% (0 / 4) 0% (0 / 1) 6.67% (1 / 15)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/gauge/GaugeSeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/gauge/GaugeSeries.js

Statements: 45.45% (5 / 11)      Branches: 0% (0 / 4)      Functions: 0% (0 / 1)      Lines: 45.45% (5 / 11)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124    1 1 1   1                                                                                                                                                                                                                                     1    
 
 
    var List = require('../../data/List');
    var SeriesModel = require('../../model/Series');
    var zrUtil = require('zrender/lib/core/util');
 
    var GaugeSeries = SeriesModel.extend({
 
        type: 'series.gauge',
 
        getInitialData: function (option, ecModel) {
            var list = new List(['value'], this);
            var dataOpt = option.data || [];
            if (!zrUtil.isArray(dataOpt)) {
                dataOpt = [dataOpt];
            }
            // Only use the first data item
            list.initData(dataOpt);
            return list;
        },
 
        defaultOption: {
            zlevel: 0,
            z: 2,
            // 默认全局居中
            center: ['50%', '50%'],
            legendHoverLink: true,
            radius: '75%',
            startAngle: 225,
            endAngle: -45,
            clockwise: true,
            // 最小值
            min: 0,
            // 最大值
            max: 100,
            // 分割段数,默认为10
            splitNumber: 10,
            // 坐标轴线
            axisLine: {
                // 默认显示,属性show控制显示与否
                show: true,
                lineStyle: {       // 属性lineStyle控制线条样式
                    color: [[0.2, '#91c7ae'], [0.8, '#63869e'], [1, '#c23531']],
                    width: 30
                }
            },
            // 分隔线
            splitLine: {
                // 默认显示,属性show控制显示与否
                show: true,
                // 属性length控制线长
                length: 30,
                // 属性lineStyle(详见lineStyle)控制线条样式
                lineStyle: {
                    color: '#eee',
                    width: 2,
                    type: 'solid'
                }
            },
            // 坐标轴小标记
            axisTick: {
                // 属性show控制显示与否,默认不显示
                show: true,
                // 每份split细分多少段
                splitNumber: 5,
                // 属性length控制线长
                length: 8,
                // 属性lineStyle控制线条样式
                lineStyle: {
                    color: '#eee',
                    width: 1,
                    type: 'solid'
                }
            },
            axisLabel: {
                show: true,
                distance: 5,
                // formatter: null,
                textStyle: {       // 其余属性默认使用全局文本样式,详见TEXTSTYLE
                    color: 'auto'
                }
            },
            pointer: {
                show: true,
                length: '80%',
                width: 8
            },
            itemStyle: {
                normal: {
                    color: 'auto'
                }
            },
            title: {
                show: true,
                // x, y,单位px
                offsetCenter: [0, '-40%'],
                // 其余属性默认使用全局文本样式,详见TEXTSTYLE
                textStyle: {
                    color: '#333',
                    fontSize: 15
                }
            },
            detail: {
                show: true,
                backgroundColor: 'rgba(0,0,0,0)',
                borderWidth: 0,
                borderColor: '#ccc',
                width: 100,
                height: 40,
                // x, y,单位px
                offsetCenter: [0, '40%'],
                // formatter: null,
                // 其余属性默认使用全局文本样式,详见TEXTSTYLE
                textStyle: {
                    color: 'auto',
                    fontSize: 30
                }
            }
        }
    });
 
    module.exports = GaugeSeries;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/gauge/GaugeView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/gauge/GaugeView.js

Statements: 5.56% (9 / 162)      Branches: 0% (0 / 54)      Functions: 0% (0 / 15)      Lines: 5.56% (9 / 162)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430    1   1 1 1   1                               1                         1   1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       1    
 
 
    var PointerPath = require('./PointerPath');
 
    var graphic = require('../../util/graphic');
    var numberUtil = require('../../util/number');
    var parsePercent = numberUtil.parsePercent;
 
    function parsePosition(seriesModel, api) {
        var center = seriesModel.get('center');
        var width = api.getWidth();
        var height = api.getHeight();
        var size = Math.min(width, height);
        var cx = parsePercent(center[0], api.getWidth());
        var cy = parsePercent(center[1], api.getHeight());
        var r = parsePercent(seriesModel.get('radius'), size / 2);
 
        return {
            cx: cx,
            cy: cy,
            r: r
        };
    }
 
    function formatLabel(label, labelFormatter) {
        if (labelFormatter) {
            if (typeof labelFormatter === 'string') {
                label = labelFormatter.replace('{value}', label != null ? label : '');
            }
            else if (typeof labelFormatter === 'function') {
                label = labelFormatter(label);
            }
        }
 
        return label;
    }
 
    var PI2 = Math.PI * 2;
 
    var GaugeView = require('../../view/Chart').extend({
 
        type: 'gauge',
 
        render: function (seriesModel, ecModel, api) {
 
            this.group.removeAll();
 
            var colorList = seriesModel.get('axisLine.lineStyle.color');
            var posInfo = parsePosition(seriesModel, api);
 
            this._renderMain(
                seriesModel, ecModel, api, colorList, posInfo
            );
        },
 
        dispose: function () {},
 
        _renderMain: function (seriesModel, ecModel, api, colorList, posInfo) {
            var group = this.group;
 
            var axisLineModel = seriesModel.getModel('axisLine');
            var lineStyleModel = axisLineModel.getModel('lineStyle');
 
            var clockwise = seriesModel.get('clockwise');
            var startAngle = -seriesModel.get('startAngle') / 180 * Math.PI;
            var endAngle = -seriesModel.get('endAngle') / 180 * Math.PI;
 
            var angleRangeSpan = (endAngle - startAngle) % PI2;
 
            var prevEndAngle = startAngle;
            var axisLineWidth = lineStyleModel.get('width');
 
            for (var i = 0; i < colorList.length; i++) {
                // Clamp
                var percent = Math.min(Math.max(colorList[i][0], 0), 1);
                var endAngle = startAngle + angleRangeSpan * percent;
                var sector = new graphic.Sector({
                    shape: {
                        startAngle: prevEndAngle,
                        endAngle: endAngle,
                        cx: posInfo.cx,
                        cy: posInfo.cy,
                        clockwise: clockwise,
                        r0: posInfo.r - axisLineWidth,
                        r: posInfo.r
                    },
                    silent: true
                });
 
                sector.setStyle({
                    fill: colorList[i][1]
                });
 
                sector.setStyle(lineStyleModel.getLineStyle(
                    // Because we use sector to simulate arc
                    // so the properties for stroking are useless
                    ['color', 'borderWidth', 'borderColor']
                ));
 
                group.add(sector);
 
                prevEndAngle = endAngle;
            }
 
            var getColor = function (percent) {
                // Less than 0
                if (percent <= 0) {
                    return colorList[0][1];
                }
                for (var i = 0; i < colorList.length; i++) {
                    if (colorList[i][0] >= percent
                        && (i === 0 ? 0 : colorList[i - 1][0]) < percent
                    ) {
                        return colorList[i][1];
                    }
                }
                // More than 1
                return colorList[i - 1][1];
            };
 
            if (!clockwise) {
                var tmp = startAngle;
                startAngle = endAngle;
                endAngle = tmp;
            }
 
            this._renderTicks(
                seriesModel, ecModel, api, getColor, posInfo,
                startAngle, endAngle, clockwise
            );
 
            this._renderPointer(
                seriesModel, ecModel, api, getColor, posInfo,
                startAngle, endAngle, clockwise
            );
 
            this._renderTitle(
                seriesModel, ecModel, api, getColor, posInfo
            );
            this._renderDetail(
                seriesModel, ecModel, api, getColor, posInfo
            );
        },
 
        _renderTicks: function (
            seriesModel, ecModel, api, getColor, posInfo,
            startAngle, endAngle, clockwise
        ) {
            var group = this.group;
            var cx = posInfo.cx;
            var cy = posInfo.cy;
            var r = posInfo.r;
 
            var minVal = +seriesModel.get('min');
            var maxVal = +seriesModel.get('max');
 
            var splitLineModel = seriesModel.getModel('splitLine');
            var tickModel = seriesModel.getModel('axisTick');
            var labelModel = seriesModel.getModel('axisLabel');
 
            var splitNumber = seriesModel.get('splitNumber');
            var subSplitNumber = tickModel.get('splitNumber');
 
            var splitLineLen = parsePercent(
                splitLineModel.get('length'), r
            );
            var tickLen = parsePercent(
                tickModel.get('length'), r
            );
 
            var angle = startAngle;
            var step = (endAngle - startAngle) / splitNumber;
            var subStep = step / subSplitNumber;
 
            var splitLineStyle = splitLineModel.getModel('lineStyle').getLineStyle();
            var tickLineStyle = tickModel.getModel('lineStyle').getLineStyle();
            var textStyleModel = labelModel.getModel('textStyle');
 
            for (var i = 0; i <= splitNumber; i++) {
                var unitX = Math.cos(angle);
                var unitY = Math.sin(angle);
                // Split line
                if (splitLineModel.get('show')) {
                    var splitLine = new graphic.Line({
                        shape: {
                            x1: unitX * r + cx,
                            y1: unitY * r + cy,
                            x2: unitX * (r - splitLineLen) + cx,
                            y2: unitY * (r - splitLineLen) + cy
                        },
                        style: splitLineStyle,
                        silent: true
                    });
                    if (splitLineStyle.stroke === 'auto') {
                        splitLine.setStyle({
                            stroke: getColor(i / splitNumber)
                        });
                    }
 
                    group.add(splitLine);
                }
 
                // Label
                if (labelModel.get('show')) {
                    var label = formatLabel(
                        numberUtil.round(i / splitNumber * (maxVal - minVal) + minVal),
                        labelModel.get('formatter')
                    );
                    var distance = labelModel.get('distance');
 
                    var text = new graphic.Text({
                        style: {
                            text: label,
                            x: unitX * (r - splitLineLen - distance) + cx,
                            y: unitY * (r - splitLineLen - distance) + cy,
                            fill: textStyleModel.getTextColor(),
                            textFont: textStyleModel.getFont(),
                            textVerticalAlign: unitY < -0.4 ? 'top' : (unitY > 0.4 ? 'bottom' : 'middle'),
                            textAlign: unitX < -0.4 ? 'left' : (unitX > 0.4 ? 'right' : 'center')
                        },
                        silent: true
                    });
                    if (text.style.fill === 'auto') {
                        text.setStyle({
                            fill: getColor(i / splitNumber)
                        });
                    }
 
                    group.add(text);
                }
 
                // Axis tick
                if (tickModel.get('show') && i !== splitNumber) {
                    for (var j = 0; j <= subSplitNumber; j++) {
                        var unitX = Math.cos(angle);
                        var unitY = Math.sin(angle);
                        var tickLine = new graphic.Line({
                            shape: {
                                x1: unitX * r + cx,
                                y1: unitY * r + cy,
                                x2: unitX * (r - tickLen) + cx,
                                y2: unitY * (r - tickLen) + cy
                            },
                            silent: true,
                            style: tickLineStyle
                        });
 
                        if (tickLineStyle.stroke === 'auto') {
                            tickLine.setStyle({
                                stroke: getColor((i + j / subSplitNumber) / splitNumber)
                            });
                        }
 
                        group.add(tickLine);
                        angle += subStep;
                    }
                    angle -= subStep;
                }
                else {
                    angle += step;
                }
            }
        },
 
        _renderPointer: function (
            seriesModel, ecModel, api, getColor, posInfo,
            startAngle, endAngle, clockwise
        ) {
 
            var group = this.group;
            var oldData = this._data;
 
            if (!seriesModel.get('pointer.show')) {
                // Remove old element
                oldData && oldData.eachItemGraphicEl(function (el) {
                    group.remove(el);
                });
                return;
            }
 
            var valueExtent = [+seriesModel.get('min'), +seriesModel.get('max')];
            var angleExtent = [startAngle, endAngle];
 
            var data = seriesModel.getData();
 
            data.diff(oldData)
                .add(function (idx) {
                    var pointer = new PointerPath({
                        shape: {
                            angle: startAngle
                        }
                    });
 
                    graphic.initProps(pointer, {
                        shape: {
                            angle: numberUtil.linearMap(data.get('value', idx), valueExtent, angleExtent, true)
                        }
                    }, seriesModel);
 
                    group.add(pointer);
                    data.setItemGraphicEl(idx, pointer);
                })
                .update(function (newIdx, oldIdx) {
                    var pointer = oldData.getItemGraphicEl(oldIdx);
 
                    graphic.updateProps(pointer, {
                        shape: {
                            angle: numberUtil.linearMap(data.get('value', newIdx), valueExtent, angleExtent, true)
                        }
                    }, seriesModel);
 
                    group.add(pointer);
                    data.setItemGraphicEl(newIdx, pointer);
                })
                .remove(function (idx) {
                    var pointer = oldData.getItemGraphicEl(idx);
                    group.remove(pointer);
                })
                .execute();
 
            data.eachItemGraphicEl(function (pointer, idx) {
                var itemModel = data.getItemModel(idx);
                var pointerModel = itemModel.getModel('pointer');
 
                pointer.setShape({
                    x: posInfo.cx,
                    y: posInfo.cy,
                    width: parsePercent(
                        pointerModel.get('width'), posInfo.r
                    ),
                    r: parsePercent(pointerModel.get('length'), posInfo.r)
                });
 
                pointer.useStyle(itemModel.getModel('itemStyle.normal').getItemStyle());
 
                if (pointer.style.fill === 'auto') {
                    pointer.setStyle('fill', getColor(
                        numberUtil.linearMap(data.get('value', idx), valueExtent, [0, 1], true)
                    ));
                }
 
                graphic.setHoverStyle(
                    pointer, itemModel.getModel('itemStyle.emphasis').getItemStyle()
                );
            });
 
            this._data = data;
        },
 
        _renderTitle: function (
            seriesModel, ecModel, api, getColor, posInfo
        ) {
            var titleModel = seriesModel.getModel('title');
            if (titleModel.get('show')) {
                var textStyleModel = titleModel.getModel('textStyle');
                var offsetCenter = titleModel.get('offsetCenter');
                var x = posInfo.cx + parsePercent(offsetCenter[0], posInfo.r);
                var y = posInfo.cy + parsePercent(offsetCenter[1], posInfo.r);
 
                var text = new graphic.Text({
                    style: {
                        x: x,
                        y: y,
                        // FIXME First data name ?
                        text: seriesModel.getData().getName(0),
                        fill: textStyleModel.getTextColor(),
                        textFont: textStyleModel.getFont(),
                        textAlign: 'center',
                        textVerticalAlign: 'middle'
                    }
                });
 
                if (text.style.fill === 'auto') {
                    var minVal = +seriesModel.get('min');
                    var maxVal = +seriesModel.get('max');
                    var value = seriesModel.getData().get('value', 0);
                    text.setStyle('fill', getColor(
                        numberUtil.linearMap(value, [minVal, maxVal], [0, 1], true)
                    ));
                }
 
                this.group.add(text);
            }
        },
 
        _renderDetail: function (
            seriesModel, ecModel, api, getColor, posInfo
        ) {
            var detailModel = seriesModel.getModel('detail');
            var minVal = +seriesModel.get('min');
            var maxVal = +seriesModel.get('max');
            if (detailModel.get('show')) {
                var textStyleModel = detailModel.getModel('textStyle');
                var offsetCenter = detailModel.get('offsetCenter');
                var x = posInfo.cx + parsePercent(offsetCenter[0], posInfo.r);
                var y = posInfo.cy + parsePercent(offsetCenter[1], posInfo.r);
                var width = parsePercent(detailModel.get('width'), posInfo.r);
                var height = parsePercent(detailModel.get('height'), posInfo.r);
                var value = seriesModel.getData().get('value', 0);
                var rect = new graphic.Rect({
                    shape: {
                        x: x - width / 2,
                        y: y - height / 2,
                        width: width,
                        height: height
                    },
                    style: {
                        text: formatLabel(
                            // FIXME First data name ?
                            value, detailModel.get('formatter')
                        ),
                        fill: detailModel.get('backgroundColor'),
                        textFill: textStyleModel.getTextColor(),
                        textFont: textStyleModel.getFont()
                    }
                });
                if (rect.style.textFill === 'auto') {
                    rect.setStyle('textFill', getColor(
                        numberUtil.linearMap(value, [minVal, maxVal], [0, 1], true)
                    ));
                }
                rect.setStyle(detailModel.getItemStyle(['color']));
                this.group.add(rect);
            }
        }
    });
 
    module.exports = GaugeView;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/gauge/PointerPath.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/gauge/PointerPath.js

Statements: 6.67% (1 / 15)      Branches: 0% (0 / 4)      Functions: 0% (0 / 1)      Lines: 6.67% (1 / 15)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48    1                                                                                          
 
 
    module.exports = require('zrender/lib/graphic/Path').extend({
 
        type: 'echartsGaugePointer',
 
        shape: {
            angle: 0,
 
            width: 10,
 
            r: 10,
 
            x: 0,
 
            y: 0
        },
 
        buildPath: function (ctx, shape) {
            var mathCos = Math.cos;
            var mathSin = Math.sin;
 
            var r = shape.r;
            var width = shape.width;
            var angle = shape.angle;
            var x = shape.x - mathCos(angle) * width * (width >= r / 3 ? 1 : 2);
            var y = shape.y - mathSin(angle) * width * (width >= r / 3 ? 1 : 2);
 
            angle = shape.angle - Math.PI / 2;
            ctx.moveTo(x, y);
            ctx.lineTo(
                shape.x + mathCos(angle) * width,
                shape.y + mathSin(angle) * width
            );
            ctx.lineTo(
                shape.x + mathCos(shape.angle) * r,
                shape.y + mathSin(shape.angle) * r
            );
            ctx.lineTo(
                shape.x - mathCos(angle) * width,
                shape.y - mathSin(angle) * width
            );
            ctx.lineTo(x, y);
            return;
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/

Statements: 10.23% (71 / 694)      Branches: 0% (0 / 296)      Functions: 0% (0 / 101)      Lines: 10.23% (71 / 694)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/chart/graph/
File Statements Branches Functions Lines
GraphSeries.js 14.93% (10 / 67) 0% (0 / 36) 0% (0 / 19) 14.93% (10 / 67)
GraphView.js 7.69% (14 / 182) 0% (0 / 69) 0% (0 / 35) 7.69% (14 / 182)
adjustEdge.js 11% (11 / 100) 0% (0 / 34) 0% (0 / 4) 11% (11 / 100)
categoryFilter.js 5.26% (1 / 19) 0% (0 / 10) 0% (0 / 3) 5.26% (1 / 19)
categoryVisual.js 4.76% (1 / 21) 0% (0 / 10) 0% (0 / 4) 4.76% (1 / 21)
circularLayout.js 40% (2 / 5) 0% (0 / 2) 0% (0 / 2) 40% (2 / 5)
circularLayoutHelper.js 6.45% (2 / 31) 0% (0 / 14) 0% (0 / 3) 6.45% (2 / 31)
createView.js 11.9% (5 / 42) 0% (0 / 10) 0% (0 / 4) 11.9% (5 / 42)
edgeVisual.js 5.56% (2 / 36) 0% (0 / 20) 0% (0 / 4) 5.56% (2 / 36)
forceHelper.js 5.26% (3 / 57) 0% (0 / 20) 0% (0 / 5) 5.26% (3 / 57)
forceLayout.js 8.86% (7 / 79) 0% (0 / 47) 0% (0 / 7) 8.86% (7 / 79)
graphAction.js 54.55% (6 / 11) 0% (0 / 4) 0% (0 / 4) 54.55% (6 / 11)
simpleLayout.js 12.5% (3 / 24) 0% (0 / 12) 0% (0 / 3) 12.5% (3 / 24)
simpleLayoutEdge.js 20% (2 / 10) 0% (0 / 4) 0% (0 / 2) 20% (2 / 10)
simpleLayoutHelper.js 20% (2 / 10) 0% (0 / 4) 0% (0 / 2) 20% (2 / 10)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/GraphSeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/GraphSeries.js

Statements: 14.93% (10 / 67)      Branches: 0% (0 / 36)      Functions: 0% (0 / 19)      Lines: 14.93% (10 / 67)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270      1 1 1 1 1   1   1                                                                             1                                                   1                                                                                                                                                                                                                                                                                                                                                                                             1    
'use strict';
 
 
    var List = require('../../data/List');
    var zrUtil = require('zrender/lib/core/util');
    var modelUtil = require('../../util/model');
    var Model = require('../../model/Model');
    var formatUtil = require('../../util/format');
 
    var createGraphFromNodeEdge = require('../helper/createGraphFromNodeEdge');
 
    var GraphSeries = require('../../echarts').extendSeriesModel({
 
        type: 'series.graph',
 
        init: function (option) {
            GraphSeries.superApply(this, 'init', arguments);
 
            // Provide data for legend select
            this.legendDataProvider = function () {
                return this._categoriesData;
            };
 
            this.fillDataTextStyle(option.edges || option.links);
 
            this._updateCategoriesData();
        },
 
        mergeOption: function (option) {
            GraphSeries.superApply(this, 'mergeOption', arguments);
 
            this.fillDataTextStyle(option.edges || option.links);
 
            this._updateCategoriesData();
        },
 
        mergeDefaultAndTheme: function (option) {
            GraphSeries.superApply(this, 'mergeDefaultAndTheme', arguments);
            modelUtil.defaultEmphasis(option.edgeLabel, modelUtil.LABEL_OPTIONS);
        },
 
        getInitialData: function (option, ecModel) {
            var edges = option.edges || option.links || [];
            var nodes = option.data || option.nodes || [];
            var self = this;
 
            if (nodes && edges) {
                return createGraphFromNodeEdge(nodes, edges, this, true, beforeLink).data;
            }
 
            function beforeLink(nodeData, edgeData) {
                // Overwrite nodeData.getItemModel to
                nodeData.wrapMethod('getItemModel', function (model) {
                    var categoriesModels = self._categoriesModels;
                    var categoryIdx = model.getShallow('category');
                    var categoryModel = categoriesModels[categoryIdx];
                    if (categoryModel) {
                        categoryModel.parentModel = model.parentModel;
                        model.parentModel = categoryModel;
                    }
                    return model;
                });
 
                var edgeLabelModel = self.getModel('edgeLabel');
                // For option `edgeLabel` can be found by label.xxx.xxx on item mode.
                var fakeSeriesModel = new Model(
                    {label: edgeLabelModel.option},
                    edgeLabelModel.parentModel,
                    ecModel
                );
 
                edgeData.wrapMethod('getItemModel', function (model) {
                    model.customizeGetParent(edgeGetParent);
                    return model;
                });
 
                function edgeGetParent(path) {
                    path = this.parsePath(path);
                    return (path && path[0] === 'label')
                        ? fakeSeriesModel
                        : this.parentModel;
                }
            }
        },
 
        /**
         * @return {module:echarts/data/Graph}
         */
        getGraph: function () {
            return this.getData().graph;
        },
 
        /**
         * @return {module:echarts/data/List}
         */
        getEdgeData: function () {
            return this.getGraph().edgeData;
        },
 
        /**
         * @return {module:echarts/data/List}
         */
        getCategoriesData: function () {
            return this._categoriesData;
        },
 
        /**
         * @override
         */
        formatTooltip: function (dataIndex, multipleSeries, dataType) {
            if (dataType === 'edge') {
                var nodeData = this.getData();
                var params = this.getDataParams(dataIndex, dataType);
                var edge = nodeData.graph.getEdgeByIndex(dataIndex);
                var sourceName = nodeData.getName(edge.node1.dataIndex);
                var targetName = nodeData.getName(edge.node2.dataIndex);
 
                var html = [];
                sourceName != null && html.push(sourceName);
                targetName != null && html.push(targetName);
                html = formatUtil.encodeHTML(html.join(' > '));
 
                if (params.value) {
                    html += ' : ' + formatUtil.encodeHTML(params.value);
                }
                return html;
            }
            else { // dataType === 'node' or empty
                return GraphSeries.superApply(this, 'formatTooltip', arguments);
            }
        },
 
        _updateCategoriesData: function () {
            var categories = zrUtil.map(this.option.categories || [], function (category) {
                // Data must has value
                return category.value != null ? category : zrUtil.extend({
                    value: 0
                }, category);
            });
            var categoriesData = new List(['value'], this);
            categoriesData.initData(categories);
 
            this._categoriesData = categoriesData;
 
            this._categoriesModels = categoriesData.mapArray(function (idx) {
                return categoriesData.getItemModel(idx, true);
            });
        },
 
        setZoom: function (zoom) {
            this.option.zoom = zoom;
        },
 
        setCenter: function (center) {
            this.option.center = center;
        },
 
        isAnimationEnabled: function () {
            return GraphSeries.superCall(this, 'isAnimationEnabled')
                // Not enable animation when do force layout
                && !(this.get('layout') === 'force' && this.get('force.layoutAnimation'));
        },
 
        defaultOption: {
            zlevel: 0,
            z: 2,
 
            coordinateSystem: 'view',
 
            // Default option for all coordinate systems
            // xAxisIndex: 0,
            // yAxisIndex: 0,
            // polarIndex: 0,
            // geoIndex: 0,
 
            legendHoverLink: true,
 
            hoverAnimation: true,
 
            layout: null,
 
            focusNodeAdjacency: false,
 
            // Configuration of circular layout
            circular: {
                rotateLabel: false
            },
            // Configuration of force directed layout
            force: {
                initLayout: null,
                // Node repulsion. Can be an array to represent range.
                repulsion: [0, 50],
                gravity: 0.1,
 
                // Edge length. Can be an array to represent range.
                edgeLength: 30,
 
                layoutAnimation: true
            },
 
            left: 'center',
            top: 'center',
            // right: null,
            // bottom: null,
            // width: '80%',
            // height: '80%',
 
            symbol: 'circle',
            symbolSize: 10,
 
            edgeSymbol: ['none', 'none'],
            edgeSymbolSize: 10,
            edgeLabel: {
                normal: {
                    position: 'middle'
                },
                emphasis: {}
            },
 
            draggable: false,
 
            roam: false,
 
            // Default on center of graph
            center: null,
 
            zoom: 1,
            // Symbol size scale ratio in roam
            nodeScaleRatio: 0.6,
 
            // categories: [],
 
            // data: []
            // Or
            // nodes: []
            //
            // links: []
            // Or
            // edges: []
 
            label: {
                normal: {
                    show: false,
                    formatter: '{b}'
                },
                emphasis: {
                    show: true
                }
            },
 
            itemStyle: {
                normal: {},
                emphasis: {}
            },
 
            lineStyle: {
                normal: {
                    color: '#aaa',
                    width: 1,
                    curveness: 0,
                    opacity: 0.5
                },
                emphasis: {}
            }
        }
    });
 
    module.exports = GraphSeries;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/GraphView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/GraphView.js

Statements: 7.69% (14 / 182)      Branches: 0% (0 / 69)      Functions: 0% (0 / 35)      Lines: 7.69% (14 / 182)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349      1 1 1 1 1   1 1 1   1 1   1       1                                                                                                                                                                                                                                                                                                                       1                             1                                                                                                                                                                                                                                                                                                                          
 
 
 
    var SymbolDraw = require('../helper/SymbolDraw');
    var LineDraw = require('../helper/LineDraw');
    var RoamController = require('../../component/helper/RoamController');
    var roamHelper = require('../../component/helper/roamHelper');
    var cursorHelper = require('../../component/helper/cursorHelper');
 
    var graphic = require('../../util/graphic');
    var adjustEdge = require('./adjustEdge');
    var zrUtil = require('zrender/lib/core/util');
 
    var nodeOpacityPath = ['itemStyle', 'normal', 'opacity'];
    var lineOpacityPath = ['lineStyle', 'normal', 'opacity'];
 
    function getItemOpacity(item, opacityPath) {
        return item.getVisual('opacity') || item.getModel().get(opacityPath);
    }
 
    require('../../echarts').extendChartView({
 
        type: 'graph',
 
        init: function (ecModel, api) {
            var symbolDraw = new SymbolDraw();
            var lineDraw = new LineDraw();
            var group = this.group;
 
            this._controller = new RoamController(api.getZr());
            this._controllerHost = {target: group};
 
            group.add(symbolDraw.group);
            group.add(lineDraw.group);
 
            this._symbolDraw = symbolDraw;
            this._lineDraw = lineDraw;
 
            this._firstRender = true;
        },
 
        render: function (seriesModel, ecModel, api) {
            var coordSys = seriesModel.coordinateSystem;
 
            this._model = seriesModel;
            this._nodeScaleRatio = seriesModel.get('nodeScaleRatio');
 
            var symbolDraw = this._symbolDraw;
            var lineDraw = this._lineDraw;
 
            var group = this.group;
 
            if (coordSys.type === 'view') {
                var groupNewProp = {
                    position: coordSys.position,
                    scale: coordSys.scale
                };
                if (this._firstRender) {
                    group.attr(groupNewProp);
                }
                else {
                    graphic.updateProps(group, groupNewProp, seriesModel);
                }
            }
            // Fix edge contact point with node
            adjustEdge(seriesModel.getGraph(), this._getNodeGlobalScale(seriesModel));
 
            var data = seriesModel.getData();
            symbolDraw.updateData(data);
 
            var edgeData = seriesModel.getEdgeData();
            lineDraw.updateData(edgeData);
 
            this._updateNodeAndLinkScale();
 
            this._updateController(seriesModel, ecModel, api);
 
            clearTimeout(this._layoutTimeout);
            var forceLayout = seriesModel.forceLayout;
            var layoutAnimation = seriesModel.get('force.layoutAnimation');
            if (forceLayout) {
                this._startForceLayoutIteration(forceLayout, layoutAnimation);
            }
            data.eachItemGraphicEl(function (el, idx) {
                var itemModel = data.getItemModel(idx);
                // Update draggable
                el.off('drag').off('dragend');
                var draggable = data.getItemModel(idx).get('draggable');
                if (draggable) {
                    el.on('drag', function () {
                        if (forceLayout) {
                            forceLayout.warmUp();
                            !this._layouting
                                && this._startForceLayoutIteration(forceLayout, layoutAnimation);
                            forceLayout.setFixed(idx);
                            // Write position back to layout
                            data.setItemLayout(idx, el.position);
                        }
                    }, this).on('dragend', function () {
                        if (forceLayout) {
                            forceLayout.setUnfixed(idx);
                        }
                    }, this);
                }
                el.setDraggable(draggable && forceLayout);
 
                el.off('mouseover', el.__focusNodeAdjacency);
                el.off('mouseout', el.__unfocusNodeAdjacency);
 
                if (itemModel.get('focusNodeAdjacency')) {
                    el.on('mouseover', el.__focusNodeAdjacency = function () {
                        api.dispatchAction({
                            type: 'focusNodeAdjacency',
                            seriesId: seriesModel.id,
                            dataIndex: el.dataIndex
                        });
                    });
                    el.on('mouseout', el.__unfocusNodeAdjacency = function () {
                        api.dispatchAction({
                            type: 'unfocusNodeAdjacency',
                            seriesId: seriesModel.id
                        });
                    });
                }
 
            }, this);
 
            var circularRotateLabel = seriesModel.get('layout') === 'circular' && seriesModel.get('circular.rotateLabel');
            var cx = data.getLayout('cx');
            var cy = data.getLayout('cy');
            data.eachItemGraphicEl(function (el, idx) {
                var symbolPath = el.getSymbolPath();
                if (circularRotateLabel) {
                    var pos = data.getItemLayout(idx);
                    var rad = Math.atan2(pos[1] - cy, pos[0] - cx);
                    if (rad < 0) {
                        rad = Math.PI * 2 + rad;
                    }
                    var isLeft = pos[0] < cx;
                    if (isLeft) {
                        rad = rad - Math.PI;
                    }
                    var textPosition = isLeft ? 'left' : 'right';
                    symbolPath.setStyle({
                        textRotation: rad,
                        textPosition: textPosition
                    });
                    symbolPath.hoverStyle && (symbolPath.hoverStyle.textPosition = textPosition);
                }
                else {
                    symbolPath.setStyle({
                        textRotation: 0
                    });
                }
            });
 
            this._firstRender = false;
        },
 
        dispose: function () {
            this._controller && this._controller.dispose();
            this._controllerHost = {};
        },
 
        focusNodeAdjacency: function (seriesModel, ecModel, api, payload) {
            var data = this._model.getData();
            var dataIndex = payload.dataIndex;
            var el = data.getItemGraphicEl(dataIndex);
 
            if (!el) {
                return;
            }
 
            var graph = data.graph;
            var dataType = el.dataType;
 
            function fadeOutItem(item, opacityPath) {
                var opacity = getItemOpacity(item, opacityPath);
                var el = item.getGraphicEl();
                if (opacity == null) {
                    opacity = 1;
                }
 
                el.traverse(function (child) {
                    child.trigger('normal');
                    if (child.type !== 'group') {
                        child.setStyle('opacity', opacity * 0.1);
                    }
                });
            }
 
            function fadeInItem(item, opacityPath) {
                var opacity = getItemOpacity(item, opacityPath);
                var el = item.getGraphicEl();
 
                el.traverse(function (child) {
                    child.trigger('emphasis');
                    if (child.type !== 'group') {
                        child.setStyle('opacity', opacity);
                    }
                });
            }
            if (dataIndex !== null && dataType !== 'edge') {
                graph.eachNode(function (node) {
                    fadeOutItem(node, nodeOpacityPath);
                });
                graph.eachEdge(function (edge) {
                    fadeOutItem(edge, lineOpacityPath);
                });
 
                var node = graph.getNodeByIndex(dataIndex);
                fadeInItem(node, nodeOpacityPath);
                zrUtil.each(node.edges, function (edge) {
                    if (edge.dataIndex < 0) {
                        return;
                    }
                    fadeInItem(edge, lineOpacityPath);
                    fadeInItem(edge.node1, nodeOpacityPath);
                    fadeInItem(edge.node2, nodeOpacityPath);
                });
            }
        },
 
        unfocusNodeAdjacency: function (seriesModel, ecModel, api, payload) {
            var graph = this._model.getData().graph;
            graph.eachNode(function (node) {
                var opacity = getItemOpacity(node, nodeOpacityPath);
                node.getGraphicEl().traverse(function (child) {
                    child.trigger('normal');
                    if (child.type !== 'group') {
                        child.setStyle('opacity', opacity);
                    }
                });
            });
            graph.eachEdge(function (edge) {
                var opacity = getItemOpacity(edge, lineOpacityPath);
                edge.getGraphicEl().traverse(function (child) {
                    child.trigger('normal');
                    if (child.type !== 'group') {
                        child.setStyle('opacity', opacity);
                    }
                });
            });
        },
 
        _startForceLayoutIteration: function (forceLayout, layoutAnimation) {
            var self = this;
            (function step() {
                forceLayout.step(function (stopped) {
                    self.updateLayout(self._model);
                    (self._layouting = !stopped) && (
                        layoutAnimation
                            ? (self._layoutTimeout = setTimeout(step, 16))
                            : step()
                    );
                });
            })();
        },
 
        _updateController: function (seriesModel, ecModel, api) {
            var controller = this._controller;
            var controllerHost = this._controllerHost;
            var group = this.group;
 
            controller.setPointerChecker(function (e, x, y) {
                var rect = group.getBoundingRect();
                rect.applyTransform(group.transform);
                return rect.contain(x, y)
                    && !cursorHelper.onIrrelevantElement(e, api, seriesModel);
            });
 
            if (seriesModel.coordinateSystem.type !== 'view') {
                controller.disable();
                return;
            }
            controller.enable(seriesModel.get('roam'));
            controllerHost.zoomLimit = seriesModel.get('scaleLimit');
            controllerHost.zoom = seriesModel.coordinateSystem.getZoom();
 
            controller
                .off('pan')
                .off('zoom')
                .on('pan', function (dx, dy) {
                    roamHelper.updateViewOnPan(controllerHost, dx, dy);
                    api.dispatchAction({
                        seriesId: seriesModel.id,
                        type: 'graphRoam',
                        dx: dx,
                        dy: dy
                    });
                })
                .on('zoom', function (zoom, mouseX, mouseY) {
                    roamHelper.updateViewOnZoom(controllerHost, zoom, mouseX, mouseY);
                    api.dispatchAction({
                        seriesId: seriesModel.id,
                        type: 'graphRoam',
                        zoom:  zoom,
                        originX: mouseX,
                        originY: mouseY
                    });
                    this._updateNodeAndLinkScale();
                    adjustEdge(seriesModel.getGraph(), this._getNodeGlobalScale(seriesModel));
                    this._lineDraw.updateLayout();
                }, this);
        },
 
        _updateNodeAndLinkScale: function () {
            var seriesModel = this._model;
            var data = seriesModel.getData();
 
            var nodeScale = this._getNodeGlobalScale(seriesModel);
            var invScale = [nodeScale, nodeScale];
 
            data.eachItemGraphicEl(function (el, idx) {
                el.attr('scale', invScale);
            });
        },
 
        _getNodeGlobalScale: function (seriesModel) {
            var coordSys = seriesModel.coordinateSystem;
            if (coordSys.type !== 'view') {
                return 1;
            }
 
            var nodeScaleRatio = this._nodeScaleRatio;
 
            var groupScale = coordSys.scale;
            var groupZoom = (groupScale && groupScale[0]) || 1;
            // Scale node when zoom changes
            var roamZoom = coordSys.getZoom();
            var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1;
 
            return nodeScale / groupZoom;
        },
 
        updateLayout: function (seriesModel) {
            adjustEdge(seriesModel.getGraph(), this._getNodeGlobalScale(seriesModel));
 
            this._symbolDraw.updateLayout();
            this._lineDraw.updateLayout();
        },
 
        remove: function (ecModel, api) {
            this._symbolDraw && this._symbolDraw.remove();
            this._lineDraw && this._lineDraw.remove();
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/adjustEdge.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/adjustEdge.js

Statements: 11% (11 / 100)      Branches: 0% (0 / 34)      Functions: 0% (0 / 4)      Lines: 11% (11 / 100)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162    1 1   1 1 1 1 1 1 1                                                                                                                           1               1                                                                                                                                                                
 
 
    var curveTool = require('zrender/lib/core/curve');
    var vec2 = require('zrender/lib/core/vector');
 
    var v1 = [];
    var v2 = [];
    var v3 = [];
    var quadraticAt = curveTool.quadraticAt;
    var v2DistSquare = vec2.distSquare;
    var mathAbs = Math.abs;
    function intersectCurveCircle(curvePoints, center, radius) {
        var p0 = curvePoints[0];
        var p1 = curvePoints[1];
        var p2 = curvePoints[2];
 
        var d = Infinity;
        var t;
        var radiusSquare = radius * radius;
        var interval = 0.1;
 
        for (var _t = 0.1; _t <= 0.9; _t += 0.1) {
            v1[0] = quadraticAt(p0[0], p1[0], p2[0], _t);
            v1[1] = quadraticAt(p0[1], p1[1], p2[1], _t);
            var diff = mathAbs(v2DistSquare(v1, center) - radiusSquare);
            if (diff < d) {
                d = diff;
                t = _t;
            }
        }
 
        // Assume the segment is monotone,Find root through Bisection method
        // At most 32 iteration
        for (var i = 0; i < 32; i++) {
            // var prev = t - interval;
            var next = t + interval;
            // v1[0] = quadraticAt(p0[0], p1[0], p2[0], prev);
            // v1[1] = quadraticAt(p0[1], p1[1], p2[1], prev);
            v2[0] = quadraticAt(p0[0], p1[0], p2[0], t);
            v2[1] = quadraticAt(p0[1], p1[1], p2[1], t);
            v3[0] = quadraticAt(p0[0], p1[0], p2[0], next);
            v3[1] = quadraticAt(p0[1], p1[1], p2[1], next);
 
            var diff = v2DistSquare(v2, center) - radiusSquare;
            if (mathAbs(diff) < 1e-2) {
                break;
            }
 
            // var prevDiff = v2DistSquare(v1, center) - radiusSquare;
            var nextDiff = v2DistSquare(v3, center) - radiusSquare;
 
            interval /= 2;
            if (diff < 0) {
                if (nextDiff >= 0) {
                    t = t + interval;
                }
                else {
                    t = t - interval;
                }
            }
            else {
                if (nextDiff >= 0) {
                    t = t - interval;
                }
                else {
                    t = t + interval;
                }
            }
        }
 
        return t;
    }
    // Adjust edge to avoid
    module.exports = function (graph, scale) {
        var tmp0 = [];
        var quadraticSubdivide = curveTool.quadraticSubdivide;
        var pts = [[], [], []];
        var pts2 = [[], []];
        var v = [];
        scale /= 2;
 
        function getSymbolSize(node) {
            var symbolSize = node.getVisual('symbolSize');
            if (symbolSize instanceof Array) {
                symbolSize = (symbolSize[0] + symbolSize[1]) / 2;
            }
            return symbolSize;
        }
        graph.eachEdge(function (edge, idx) {
            var linePoints = edge.getLayout();
            var fromSymbol = edge.getVisual('fromSymbol');
            var toSymbol = edge.getVisual('toSymbol');
 
            if (!linePoints.__original) {
                linePoints.__original = [
                    vec2.clone(linePoints[0]),
                    vec2.clone(linePoints[1])
                ];
                if (linePoints[2]) {
                    linePoints.__original.push(vec2.clone(linePoints[2]));
                }
            }
            var originalPoints = linePoints.__original;
            // Quadratic curve
            if (linePoints[2] != null) {
                vec2.copy(pts[0], originalPoints[0]);
                vec2.copy(pts[1], originalPoints[2]);
                vec2.copy(pts[2], originalPoints[1]);
                if (fromSymbol && fromSymbol != 'none') {
                    var symbolSize = getSymbolSize(edge.node1);
 
                    var t = intersectCurveCircle(pts, originalPoints[0], symbolSize * scale);
                    // Subdivide and get the second
                    quadraticSubdivide(pts[0][0], pts[1][0], pts[2][0], t, tmp0);
                    pts[0][0] = tmp0[3];
                    pts[1][0] = tmp0[4];
                    quadraticSubdivide(pts[0][1], pts[1][1], pts[2][1], t, tmp0);
                    pts[0][1] = tmp0[3];
                    pts[1][1] = tmp0[4];
                }
                if (toSymbol && toSymbol != 'none') {
                    var symbolSize = getSymbolSize(edge.node2);
 
                    var t = intersectCurveCircle(pts, originalPoints[1], symbolSize * scale);
                    // Subdivide and get the first
                    quadraticSubdivide(pts[0][0], pts[1][0], pts[2][0], t, tmp0);
                    pts[1][0] = tmp0[1];
                    pts[2][0] = tmp0[2];
                    quadraticSubdivide(pts[0][1], pts[1][1], pts[2][1], t, tmp0);
                    pts[1][1] = tmp0[1];
                    pts[2][1] = tmp0[2];
                }
                // Copy back to layout
                vec2.copy(linePoints[0], pts[0]);
                vec2.copy(linePoints[1], pts[2]);
                vec2.copy(linePoints[2], pts[1]);
            }
            // Line
            else {
                vec2.copy(pts2[0], originalPoints[0]);
                vec2.copy(pts2[1], originalPoints[1]);
 
                vec2.sub(v, pts2[1], pts2[0]);
                vec2.normalize(v, v);
                if (fromSymbol && fromSymbol != 'none') {
 
                    var symbolSize = getSymbolSize(edge.node1);
 
                    vec2.scaleAndAdd(pts2[0], pts2[0], v, symbolSize * scale);
                }
                if (toSymbol && toSymbol != 'none') {
                    var symbolSize = getSymbolSize(edge.node2);
 
                    vec2.scaleAndAdd(pts2[1], pts2[1], v, -symbolSize * scale);
                }
                vec2.copy(linePoints[0], pts2[0]);
                vec2.copy(linePoints[1], pts2[1]);
            }
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/categoryFilter.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/categoryFilter.js

Statements: 5.26% (1 / 19)      Branches: 0% (0 / 10)      Functions: 0% (0 / 3)      Lines: 5.26% (1 / 19)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36    1                                                                  
 
 
    module.exports = function (ecModel) {
        var legendModels = ecModel.findComponents({
            mainType: 'legend'
        });
        if (!legendModels || !legendModels.length) {
            return;
        }
        ecModel.eachSeriesByType('graph', function (graphSeries) {
            var categoriesData = graphSeries.getCategoriesData();
            var graph = graphSeries.getGraph();
            var data = graph.data;
 
            var categoryNames = categoriesData.mapArray(categoriesData.getName);
 
            data.filterSelf(function (idx) {
                var model = data.getItemModel(idx);
                var category = model.getShallow('category');
                if (category != null) {
                    if (typeof category === 'number') {
                        category = categoryNames[category];
                    }
                    // If in any legend component the status is not selected.
                    for (var i = 0; i < legendModels.length; i++) {
                        if (!legendModels[i].isSelected(category)) {
                            return false;
                        }
                    }
                }
                return true;
            });
        }, this);
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/categoryVisual.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/categoryVisual.js

Statements: 4.76% (1 / 21)      Branches: 0% (0 / 10)      Functions: 0% (0 / 4)      Lines: 4.76% (1 / 21)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43    1                                                                                
 
 
    module.exports = function (ecModel) {
 
        var paletteScope = {};
        ecModel.eachSeriesByType('graph', function (seriesModel) {
            var categoriesData = seriesModel.getCategoriesData();
            var data = seriesModel.getData();
 
            var categoryNameIdxMap = {};
 
            categoriesData.each(function (idx) {
                var name = categoriesData.getName(idx);
                categoryNameIdxMap[name] = idx;
 
                var itemModel = categoriesData.getItemModel(idx);
                var color = itemModel.get('itemStyle.normal.color')
                    || seriesModel.getColorFromPalette(name, paletteScope);
                categoriesData.setItemVisual(idx, 'color', color);
            });
 
            // Assign category color to visual
            if (categoriesData.count()) {
                data.each(function (idx) {
                    var model = data.getItemModel(idx);
                    var category = model.getShallow('category');
                    if (category != null) {
                        if (typeof category === 'string') {
                            category = categoryNameIdxMap[category];
                        }
                        if (!data.getItemVisual(idx, 'color', true)) {
                            data.setItemVisual(
                                idx, 'color',
                                categoriesData.getItemVisual(category, 'color')
                            );
                        }
                    }
                });
            }
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/circularLayout.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/circularLayout.js

Statements: 40% (2 / 5)      Branches: 0% (0 / 2)      Functions: 0% (0 / 2)      Lines: 40% (2 / 5)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11  1 1                
 
    var circularLayoutHelper = require('./circularLayoutHelper');
    module.exports = function (ecModel) {
        ecModel.eachSeriesByType('graph', function (seriesModel) {
            if (seriesModel.get('layout') === 'circular') {
                circularLayoutHelper(seriesModel);
            }
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/circularLayoutHelper.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/circularLayoutHelper.js

Statements: 6.45% (2 / 31)      Branches: 0% (0 / 14)      Functions: 0% (0 / 3)      Lines: 6.45% (2 / 31)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59  1 1                                                                                                                
 
    var vec2 = require('zrender/lib/core/vector');
    module.exports = function (seriesModel) {
        var coordSys = seriesModel.coordinateSystem;
        if (coordSys && coordSys.type !== 'view') {
            return;
        }
 
        var rect = coordSys.getBoundingRect();
 
        var nodeData = seriesModel.getData();
        var graph = nodeData.graph;
 
        var angle = 0;
        var sum = nodeData.getSum('value');
        var unitAngle = Math.PI * 2 / (sum || nodeData.count());
 
        var cx = rect.width / 2 + rect.x;
        var cy = rect.height / 2 + rect.y;
 
        var r = Math.min(rect.width, rect.height) / 2;
 
        graph.eachNode(function (node) {
            var value = node.getValue('value');
 
            angle += unitAngle * (sum ? value : 1) / 2;
 
            node.setLayout([
                r * Math.cos(angle) + cx,
                r * Math.sin(angle) + cy
            ]);
 
            angle += unitAngle * (sum ? value : 1) / 2;
        });
 
        nodeData.setLayout({
            cx: cx,
            cy: cy
        });
 
        graph.eachEdge(function (edge) {
            var curveness = edge.getModel().get('lineStyle.normal.curveness') || 0;
            var p1 = vec2.clone(edge.node1.getLayout());
            var p2 = vec2.clone(edge.node2.getLayout());
            var cp1;
            var x12 = (p1[0] + p2[0]) / 2;
            var y12 = (p1[1] + p2[1]) / 2;
            if (+curveness) {
                curveness *= 3;
                cp1 = [
                    cx * curveness + x12 * (1 - curveness),
                    cy * curveness + y12 * (1 - curveness)
                ];
            }
            edge.setLayout([p1, p2, cp1]);
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/createView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/createView.js

Statements: 11.9% (5 / 42)      Branches: 0% (0 / 10)      Functions: 0% (0 / 4)      Lines: 11.9% (5 / 42)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77    1 1 1   1                 1                                                                                                                          
 
    // FIXME Where to create the simple view coordinate system
    var View = require('../../coord/View');
    var layout = require('../../util/layout');
    var bbox = require('zrender/lib/core/bbox');
 
    function getViewRect(seriesModel, api, aspect) {
        var option = seriesModel.getBoxLayoutParams();
        option.aspect = aspect;
        return layout.getLayoutRect(option, {
            width: api.getWidth(),
            height: api.getHeight()
        });
    }
 
    module.exports = function (ecModel, api) {
        var viewList = [];
        ecModel.eachSeriesByType('graph', function (seriesModel) {
            var coordSysType = seriesModel.get('coordinateSystem');
            if (!coordSysType || coordSysType === 'view') {
 
                var data = seriesModel.getData();
                var positions = data.mapArray(function (idx) {
                    var itemModel = data.getItemModel(idx);
                    return [+itemModel.get('x'), +itemModel.get('y')];
                });
 
                var min = [];
                var max = [];
 
                bbox.fromPoints(positions, min, max);
 
                // If width or height is 0
                if (max[0] - min[0] === 0) {
                    max[0] += 1;
                    min[0] -= 1;
                }
                if (max[1] - min[1] === 0) {
                    max[1] += 1;
                    min[1] -= 1;
                }
                var aspect = (max[0] - min[0]) / (max[1] - min[1]);
                // FIXME If get view rect after data processed?
                var viewRect = getViewRect(seriesModel, api, aspect);
                // Position may be NaN, use view rect instead
                if (isNaN(aspect)) {
                    min = [viewRect.x, viewRect.y];
                    max = [viewRect.x + viewRect.width, viewRect.y + viewRect.height];
                }
 
                var bbWidth = max[0] - min[0];
                var bbHeight = max[1] - min[1];
 
                var viewWidth = viewRect.width;
                var viewHeight = viewRect.height;
 
                var viewCoordSys = seriesModel.coordinateSystem = new View();
                viewCoordSys.zoomLimit = seriesModel.get('scaleLimit');
 
                viewCoordSys.setBoundingRect(
                    min[0], min[1], bbWidth, bbHeight
                );
                viewCoordSys.setViewRect(
                    viewRect.x, viewRect.y, viewWidth, viewHeight
                );
 
                // Update roam info
                viewCoordSys.setCenter(seriesModel.get('center'));
                viewCoordSys.setZoom(seriesModel.get('zoom'));
 
                viewList.push(viewCoordSys);
            }
        });
        return viewList;
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/edgeVisual.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/edgeVisual.js

Statements: 5.56% (2 / 36)      Branches: 0% (0 / 20)      Functions: 0% (0 / 4)      Lines: 5.56% (2 / 36)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54    1           1                                                                                          
 
 
    function normalize(a) {
        if (!(a instanceof Array)) {
            a = [a, a];
        }
        return a;
    }
    module.exports = function (ecModel) {
        ecModel.eachSeriesByType('graph', function (seriesModel) {
            var graph = seriesModel.getGraph();
            var edgeData = seriesModel.getEdgeData();
            var symbolType = normalize(seriesModel.get('edgeSymbol'));
            var symbolSize = normalize(seriesModel.get('edgeSymbolSize'));
 
            var colorQuery = 'lineStyle.normal.color'.split('.');
            var opacityQuery = 'lineStyle.normal.opacity'.split('.');
 
            edgeData.setVisual('fromSymbol', symbolType && symbolType[0]);
            edgeData.setVisual('toSymbol', symbolType && symbolType[1]);
            edgeData.setVisual('fromSymbolSize', symbolSize && symbolSize[0]);
            edgeData.setVisual('toSymbolSize', symbolSize && symbolSize[1]);
            edgeData.setVisual('color', seriesModel.get(colorQuery));
            edgeData.setVisual('opacity', seriesModel.get(opacityQuery));
 
            edgeData.each(function (idx) {
                var itemModel = edgeData.getItemModel(idx);
                var edge = graph.getEdgeByIndex(idx);
                var symbolType = normalize(itemModel.getShallow('symbol', true));
                var symbolSize = normalize(itemModel.getShallow('symbolSize', true));
                // Edge visual must after node visual
                var color = itemModel.get(colorQuery);
                var opacity = itemModel.get(opacityQuery);
                switch (color) {
                    case 'source':
                        color = edge.node1.getVisual('color');
                        break;
                    case 'target':
                        color = edge.node2.getVisual('color');
                        break;
                }
 
                symbolType[0] && edge.setVisual('fromSymbol', symbolType[0]);
                symbolType[1] && edge.setVisual('toSymbol', symbolType[1]);
                symbolSize[0] && edge.setVisual('fromSymbolSize', symbolSize[0]);
                symbolSize[1] && edge.setVisual('toSymbolSize', symbolSize[1]);
 
                edge.setVisual('color', color);
                edge.setVisual('opacity', opacity);
            });
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/forceHelper.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/forceHelper.js

Statements: 5.26% (3 / 57)      Branches: 0% (0 / 20)      Functions: 0% (0 / 5)      Lines: 5.26% (3 / 57)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138    1 1           1                                                                                                                                                                                                                                                                
 
 
    var vec2 = require('zrender/lib/core/vector');
    var scaleAndAdd = vec2.scaleAndAdd;
 
    // function adjacentNode(n, e) {
    //     return e.n1 === n ? e.n2 : e.n1;
    // }
 
    module.exports = function (nodes, edges, opts) {
        var rect = opts.rect;
        var width = rect.width;
        var height = rect.height;
        var center = [rect.x + width / 2, rect.y + height / 2];
        // var scale = opts.scale || 1;
        var gravity = opts.gravity == null ? 0.1 : opts.gravity;
 
        // for (var i = 0; i < edges.length; i++) {
        //     var e = edges[i];
        //     var n1 = e.n1;
        //     var n2 = e.n2;
        //     n1.edges = n1.edges || [];
        //     n2.edges = n2.edges || [];
        //     n1.edges.push(e);
        //     n2.edges.push(e);
        // }
        // Init position
        for (var i = 0; i < nodes.length; i++) {
            var n = nodes[i];
            if (!n.p) {
                // Use the position from first adjecent node with defined position
                // Or use a random position
                // From d3
                // if (n.edges) {
                //     var j = -1;
                //     while (++j < n.edges.length) {
                //         var e = n.edges[j];
                //         var other = adjacentNode(n, e);
                //         if (other.p) {
                //             n.p = vec2.clone(other.p);
                //             break;
                //         }
                //     }
                // }
                // if (!n.p) {
                    n.p = vec2.create(
                        width * (Math.random() - 0.5) + center[0],
                        height * (Math.random() - 0.5) + center[1]
                    );
                // }
            }
            n.pp = vec2.clone(n.p);
            n.edges = null;
        }
 
        // Formula in 'Graph Drawing by Force-directed Placement'
        // var k = scale * Math.sqrt(width * height / nodes.length);
        // var k2 = k * k;
 
        var friction = 0.6;
 
        return {
            warmUp: function () {
                friction = 0.5;
            },
 
            setFixed: function (idx) {
                nodes[idx].fixed = true;
            },
 
            setUnfixed: function (idx) {
                nodes[idx].fixed = false;
            },
 
            step: function (cb) {
                var v12 = [];
                var nLen = nodes.length;
                for (var i = 0; i < edges.length; i++) {
                    var e = edges[i];
                    var n1 = e.n1;
                    var n2 = e.n2;
 
                    vec2.sub(v12, n2.p, n1.p);
                    var d = vec2.len(v12) - e.d;
                    var w = n2.w / (n1.w + n2.w);
                    vec2.normalize(v12, v12);
 
                    !n1.fixed && scaleAndAdd(n1.p, n1.p, v12, w * d * friction);
                    !n2.fixed && scaleAndAdd(n2.p, n2.p, v12, -(1 - w) * d * friction);
                }
                // Gravity
                for (var i = 0; i < nLen; i++) {
                    var n = nodes[i];
                    if (!n.fixed) {
                        vec2.sub(v12, center, n.p);
                        // var d = vec2.len(v12);
                        // vec2.scale(v12, v12, 1 / d);
                        // var gravityFactor = gravity;
                        vec2.scaleAndAdd(n.p, n.p, v12, gravity * friction);
                    }
                }
 
                // Repulsive
                // PENDING
                for (var i = 0; i < nLen; i++) {
                    var n1 = nodes[i];
                    for (var j = i + 1; j < nLen; j++) {
                        var n2 = nodes[j];
                        vec2.sub(v12, n2.p, n1.p);
                        var d = vec2.len(v12);
                        if (d === 0) {
                            // Random repulse
                            vec2.set(v12, Math.random() - 0.5, Math.random() - 0.5);
                            d = 1;
                        }
                        var repFact = (n1.rep + n2.rep) / d / d;
                        !n1.fixed && scaleAndAdd(n1.pp, n1.pp, v12, repFact);
                        !n2.fixed && scaleAndAdd(n2.pp, n2.pp, v12, -repFact);
                    }
                }
                var v = [];
                for (var i = 0; i < nLen; i++) {
                    var n = nodes[i];
                    if (!n.fixed) {
                        vec2.sub(v, n.p, n.pp);
                        vec2.scaleAndAdd(n.p, n.p, v, friction);
                        vec2.copy(n.pp, n.p);
                    }
                }
 
                friction = friction * 0.992;
 
                cb && cb(nodes, edges, friction < 0.01);
            }
        };
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/forceLayout.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/forceLayout.js

Statements: 8.86% (7 / 79)      Branches: 0% (0 / 47)      Functions: 0% (0 / 7)      Lines: 8.86% (7 / 79)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135    1 1 1 1 1 1   1                                                                                                                                                                                                                                                          
 
 
    var forceHelper = require('./forceHelper');
    var numberUtil = require('../../util/number');
    var simpleLayoutHelper = require('./simpleLayoutHelper');
    var circularLayoutHelper = require('./circularLayoutHelper');
    var vec2 = require('zrender/lib/core/vector');
    var zrUtil = require('zrender/lib/core/util');
 
    module.exports = function (ecModel) {
        ecModel.eachSeriesByType('graph', function (graphSeries) {
            var coordSys = graphSeries.coordinateSystem;
            if (coordSys && coordSys.type !== 'view') {
                return;
            }
            if (graphSeries.get('layout') === 'force') {
                var preservedPoints = graphSeries.preservedPoints || {};
                var graph = graphSeries.getGraph();
                var nodeData = graph.data;
                var edgeData = graph.edgeData;
                var forceModel = graphSeries.getModel('force');
                var initLayout = forceModel.get('initLayout');
                if (graphSeries.preservedPoints) {
                    nodeData.each(function (idx) {
                        var id = nodeData.getId(idx);
                        nodeData.setItemLayout(idx, preservedPoints[id] || [NaN, NaN]);
                    });
                }
                else if (!initLayout || initLayout === 'none') {
                    simpleLayoutHelper(graphSeries);
                }
                else if (initLayout === 'circular') {
                    circularLayoutHelper(graphSeries);
                }
 
                var nodeDataExtent = nodeData.getDataExtent('value');
                var edgeDataExtent = edgeData.getDataExtent('value');
                // var edgeDataExtent = edgeData.getDataExtent('value');
                var repulsion = forceModel.get('repulsion');
                var edgeLength = forceModel.get('edgeLength');
                if (!zrUtil.isArray(repulsion)) {
                    repulsion = [repulsion, repulsion];
                }
                if (!zrUtil.isArray(edgeLength)) {
                    edgeLength = [edgeLength, edgeLength];
                }
                // Larger value has smaller length
                edgeLength = [edgeLength[1], edgeLength[0]];
 
                var nodes = nodeData.mapArray('value', function (value, idx) {
                    var point = nodeData.getItemLayout(idx);
                    // var w = numberUtil.linearMap(value, nodeDataExtent, [0, 50]);
                    var rep = numberUtil.linearMap(value, nodeDataExtent, repulsion);
                    if (isNaN(rep)) {
                        rep = (repulsion[0] + repulsion[1]) / 2;
                    }
                    return {
                        w: rep,
                        rep: rep,
                        p: (!point || isNaN(point[0]) || isNaN(point[1])) ? null : point
                    };
                });
                var edges = edgeData.mapArray('value', function (value, idx) {
                    var edge = graph.getEdgeByIndex(idx);
                    var d = numberUtil.linearMap(value, edgeDataExtent, edgeLength);
                    if (isNaN(d)) {
                        d = (edgeLength[0] + edgeLength[1]) / 2;
                    }
                    return {
                        n1: nodes[edge.node1.dataIndex],
                        n2: nodes[edge.node2.dataIndex],
                        d: d,
                        curveness: edge.getModel().get('lineStyle.normal.curveness') || 0
                    };
                });
 
                var coordSys = graphSeries.coordinateSystem;
                var rect = coordSys.getBoundingRect();
                var forceInstance = forceHelper(nodes, edges, {
                    rect: rect,
                    gravity: forceModel.get('gravity')
                });
                var oldStep = forceInstance.step;
                forceInstance.step = function (cb) {
                    for (var i = 0, l = nodes.length; i < l; i++) {
                        if (nodes[i].fixed) {
                            // Write back to layout instance
                            vec2.copy(nodes[i].p, graph.getNodeByIndex(i).getLayout());
                        }
                    }
                    oldStep(function (nodes, edges, stopped) {
                        for (var i = 0, l = nodes.length; i < l; i++) {
                            if (!nodes[i].fixed) {
                                graph.getNodeByIndex(i).setLayout(nodes[i].p);
                            }
                            preservedPoints[nodeData.getId(i)] = nodes[i].p;
                        }
                        for (var i = 0, l = edges.length; i < l; i++) {
                            var e = edges[i];
                            var edge = graph.getEdgeByIndex(i);
                            var p1 = e.n1.p;
                            var p2 = e.n2.p;
                            var points = edge.getLayout();
                            points = points ? points.slice() : [];
                            points[0] = points[0] || [];
                            points[1] = points[1] || [];
                            vec2.copy(points[0], p1);
                            vec2.copy(points[1], p2);
                            if (+e.curveness) {
                                points[2] = [
                                    (p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * e.curveness,
                                    (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * e.curveness
                                ];
                            }
                            edge.setLayout(points);
                        }
                        // Update layout
 
                        cb && cb(stopped);
                    });
                };
                graphSeries.forceLayout = forceInstance;
                graphSeries.preservedPoints = preservedPoints;
 
                // Step to get the layout
                forceInstance.step();
            }
            else {
                // Remove prev injected forceLayout instance
                graphSeries.forceLayout = null;
            }
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/graphAction.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/graphAction.js

Statements: 54.55% (6 / 11)      Branches: 0% (0 / 4)      Functions: 0% (0 / 4)      Lines: 54.55% (6 / 11)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62    1 1   1                             1                                           1                       1              
 
 
    var echarts = require('../../echarts');
    var roamHelper = require('../../action/roamHelper');
 
    var actionInfo = {
        type: 'graphRoam',
        event: 'graphRoam',
        update: 'none'
    };
 
    /**
     * @payload
     * @property {string} name Series name
     * @property {number} [dx]
     * @property {number} [dy]
     * @property {number} [zoom]
     * @property {number} [originX]
     * @property {number} [originY]
     */
    echarts.registerAction(actionInfo, function (payload, ecModel) {
        ecModel.eachComponent({mainType: 'series', query: payload}, function (seriesModel) {
            var coordSys = seriesModel.coordinateSystem;
 
            var res = roamHelper.updateCenterAndZoom(coordSys, payload);
 
            seriesModel.setCenter
                && seriesModel.setCenter(res.center);
 
            seriesModel.setZoom
                && seriesModel.setZoom(res.zoom);
        });
    });
 
 
    /**
     * @payload
     * @property {number} [seriesIndex]
     * @property {string} [seriesId]
     * @property {string} [seriesName]
     * @property {number} [dataIndex]
     */
    echarts.registerAction({
        type: 'focusNodeAdjacency',
        event: 'focusNodeAdjacency',
        update: 'series.graph:focusNodeAdjacency'
    }, function () {});
 
    /**
     * @payload
     * @property {number} [seriesIndex]
     * @property {string} [seriesId]
     * @property {string} [seriesName]
     */
    echarts.registerAction({
        type: 'unfocusNodeAdjacency',
        event: 'unfocusNodeAdjacency',
        update: 'series.graph:unfocusNodeAdjacency'
    }, function () {});
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/simpleLayout.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/simpleLayout.js

Statements: 12.5% (3 / 24)      Branches: 0% (0 / 12)      Functions: 0% (0 / 3)      Lines: 12.5% (3 / 24)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44    1 1   1                                                                            
 
 
    var simpleLayoutHelper = require('./simpleLayoutHelper');
    var simpleLayoutEdge = require('./simpleLayoutEdge');
 
    module.exports = function (ecModel, api) {
        ecModel.eachSeriesByType('graph', function (seriesModel) {
            var layout = seriesModel.get('layout');
            var coordSys = seriesModel.coordinateSystem;
            if (coordSys && coordSys.type !== 'view') {
                var data = seriesModel.getData();
                var dimensions = coordSys.dimensions;
 
                data.each(dimensions, function () {
                    var hasValue;
                    var args = arguments;
                    var value = [];
                    for (var i = 0; i < dimensions.length; i++) {
                        if (!isNaN(args[i])) {
                            hasValue = true;
                        }
                        value.push(args[i]);
                    }
                    var idx = args[args.length - 1];
 
                    if (hasValue) {
                        data.setItemLayout(idx, coordSys.dataToPoint(value));
                    }
                    else {
                        // Also {Array.<number>}, not undefined to avoid if...else... statement
                        data.setItemLayout(idx, [NaN, NaN]);
                    }
                });
 
                simpleLayoutEdge(data.graph);
            }
            else if (!layout || layout === 'none') {
                simpleLayoutHelper(seriesModel);
            }
        });
    };
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/simpleLayoutEdge.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/simpleLayoutEdge.js

Statements: 20% (2 / 10)      Branches: 0% (0 / 4)      Functions: 0% (0 / 2)      Lines: 20% (2 / 10)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19  1 1                                
 
    var vec2 = require('zrender/lib/core/vector');
    module.exports = function (graph) {
        graph.eachEdge(function (edge) {
            var curveness = edge.getModel().get('lineStyle.normal.curveness') || 0;
            var p1 = vec2.clone(edge.node1.getLayout());
            var p2 = vec2.clone(edge.node2.getLayout());
            var points = [p1, p2];
            if (+curveness) {
                points.push([
                    (p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * curveness,
                    (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * curveness
                ]);
            }
            edge.setLayout(points);
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/simpleLayoutHelper.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/graph/simpleLayoutHelper.js

Statements: 20% (2 / 10)      Branches: 0% (0 / 4)      Functions: 0% (0 / 2)      Lines: 20% (2 / 10)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20    1   1                              
 
 
    var simpleLayoutEdge = require('./simpleLayoutEdge');
 
    module.exports = function (seriesModel) {
        var coordSys = seriesModel.coordinateSystem;
        if (coordSys && coordSys.type !== 'view') {
            return;
        }
        var graph = seriesModel.getGraph();
 
        graph.eachNode(function (node) {
            var model = node.getModel();
            node.setLayout([+model.get('x'), +model.get('y')]);
        });
 
        simpleLayoutEdge(graph);
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/heatmap/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/heatmap/

Statements: 7.39% (15 / 203)      Branches: 0% (0 / 80)      Functions: 0% (0 / 19)      Lines: 7.39% (15 / 203)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/chart/heatmap/
File Statements Branches Functions Lines
HeatmapLayer.js 6.67% (5 / 75) 0% (0 / 10) 0% (0 / 4) 6.67% (5 / 75)
HeatmapSeries.js 75% (3 / 4) 100% (0 / 0) 0% (0 / 1) 75% (3 / 4)
HeatmapView.js 5.65% (7 / 124) 0% (0 / 70) 0% (0 / 14) 5.65% (7 / 124)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/heatmap/HeatmapLayer.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/heatmap/HeatmapLayer.js

Statements: 6.67% (5 / 75)      Branches: 0% (0 / 10)      Functions: 0% (0 / 4)      Lines: 6.67% (5 / 75)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150                  1 1             1                         1                                                                                                                                                                                                                                       1      
/**
 * @file defines echarts Heatmap Chart
 * @author Ovilia (me@zhangwenli.com)
 * Inspired by https://github.com/mourner/simpleheat
 *
 * @module
 */
 
 
    var GRADIENT_LEVELS = 256;
    var zrUtil = require('zrender/lib/core/util');
 
    /**
     * Heatmap Chart
     *
     * @class
     */
    function Heatmap() {
        var canvas = zrUtil.createCanvas();
        this.canvas = canvas;
 
        this.blurSize = 30;
        this.pointSize = 20;
 
        this.maxOpacity = 1;
        this.minOpacity = 0;
 
        this._gradientPixels = {};
    }
 
    Heatmap.prototype = {
        /**
         * Renders Heatmap and returns the rendered canvas
         * @param {Array} data array of data, each has x, y, value
         * @param {number} width canvas width
         * @param {number} height canvas height
         */
        update: function(data, width, height, normalize, colorFunc, isInRange) {
            var brush = this._getBrush();
            var gradientInRange = this._getGradient(data, colorFunc, 'inRange');
            var gradientOutOfRange = this._getGradient(data, colorFunc, 'outOfRange');
            var r = this.pointSize + this.blurSize;
 
            var canvas = this.canvas;
            var ctx = canvas.getContext('2d');
            var len = data.length;
            canvas.width = width;
            canvas.height = height;
            for (var i = 0; i < len; ++i) {
                var p = data[i];
                var x = p[0];
                var y = p[1];
                var value = p[2];
 
                // calculate alpha using value
                var alpha = normalize(value);
 
                // draw with the circle brush with alpha
                ctx.globalAlpha = alpha;
                ctx.drawImage(brush, x - r, y - r);
            }
 
            // colorize the canvas using alpha value and set with gradient
            var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
            var pixels = imageData.data;
            var offset = 0;
            var pixelLen = pixels.length;
            var minOpacity = this.minOpacity;
            var maxOpacity = this.maxOpacity;
            var diffOpacity = maxOpacity - minOpacity;
 
            while(offset < pixelLen) {
                var alpha = pixels[offset + 3] / 256;
                var gradientOffset = Math.floor(alpha * (GRADIENT_LEVELS - 1)) * 4;
                // Simple optimize to ignore the empty data
                if (alpha > 0) {
                    var gradient = isInRange(alpha) ? gradientInRange : gradientOutOfRange;
                    // Any alpha > 0 will be mapped to [minOpacity, maxOpacity]
                    alpha > 0 && (alpha = alpha * diffOpacity + minOpacity);
                    pixels[offset++] = gradient[gradientOffset];
                    pixels[offset++] = gradient[gradientOffset + 1];
                    pixels[offset++] = gradient[gradientOffset + 2];
                    pixels[offset++] = gradient[gradientOffset + 3] * alpha * 256;
                }
                else {
                    offset += 4;
                }
            }
            ctx.putImageData(imageData, 0, 0);
 
            return canvas;
        },
 
        /**
         * get canvas of a black circle brush used for canvas to draw later
         * @private
         * @returns {Object} circle brush canvas
         */
        _getBrush: function() {
            var brushCanvas = this._brushCanvas || (this._brushCanvas = zrUtil.createCanvas());
            // set brush size
            var r = this.pointSize + this.blurSize;
            var d = r * 2;
            brushCanvas.width = d;
            brushCanvas.height = d;
 
            var ctx = brushCanvas.getContext('2d');
            ctx.clearRect(0, 0, d, d);
 
            // in order to render shadow without the distinct circle,
            // draw the distinct circle in an invisible place,
            // and use shadowOffset to draw shadow in the center of the canvas
            ctx.shadowOffsetX = d;
            ctx.shadowBlur = this.blurSize;
            // draw the shadow in black, and use alpha and shadow blur to generate
            // color in color map
            ctx.shadowColor = '#000';
 
            // draw circle in the left to the canvas
            ctx.beginPath();
            ctx.arc(-r, r, this.pointSize, 0, Math.PI * 2, true);
            ctx.closePath();
            ctx.fill();
            return brushCanvas;
        },
 
        /**
         * get gradient color map
         * @private
         */
        _getGradient: function (data, colorFunc, state) {
            var gradientPixels = this._gradientPixels;
            var pixelsSingleState = gradientPixels[state] || (gradientPixels[state] = new Uint8ClampedArray(256 * 4));
            var color = [0, 0, 0, 0];
            var off = 0;
            for (var i = 0; i < 256; i++) {
                colorFunc[state](i / 255, true, color);
                pixelsSingleState[off++] = color[0];
                pixelsSingleState[off++] = color[1];
                pixelsSingleState[off++] = color[2];
                pixelsSingleState[off++] = color[3];
            }
            return pixelsSingleState;
        }
    };
 
    module.exports = Heatmap;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/heatmap/HeatmapSeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/heatmap/HeatmapSeries.js

Statements: 75% (3 / 4)      Branches: 100% (0 / 0)      Functions: 0% (0 / 1)      Lines: 75% (3 / 4)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39    1 1   1                                                                  
 
 
    var SeriesModel = require('../../model/Series');
    var createListFromArray = require('../helper/createListFromArray');
 
    module.exports = SeriesModel.extend({
        type: 'series.heatmap',
 
        getInitialData: function (option, ecModel) {
            return createListFromArray(option.data, this, ecModel);
        },
 
        defaultOption: {
 
            // Cartesian2D or geo
            coordinateSystem: 'cartesian2d',
 
            zlevel: 0,
 
            z: 2,
 
            // Cartesian coordinate system
            // xAxisIndex: 0,
            // yAxisIndex: 0,
 
            // Geo coordinate system
            geoIndex: 0,
 
            blurSize: 30,
 
            pointSize: 20,
 
            maxOpacity: 1,
 
            minOpacity: 0
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/heatmap/HeatmapView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/heatmap/HeatmapView.js

Statements: 5.65% (7 / 124)      Branches: 0% (0 / 70)      Functions: 0% (0 / 14)      Lines: 5.65% (7 / 124)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275    1 1 1   1                                                                   1                     1           1                                                                                                                                                                                                                                                                                                                                                                                                                                                  
 
 
    var graphic = require('../../util/graphic');
    var HeatmapLayer = require('./HeatmapLayer');
    var zrUtil = require('zrender/lib/core/util');
 
    function getIsInPiecewiseRange(dataExtent, pieceList, selected) {
        var dataSpan = dataExtent[1] - dataExtent[0];
        pieceList = zrUtil.map(pieceList, function (piece) {
            return {
                interval: [
                    (piece.interval[0] - dataExtent[0]) / dataSpan,
                    (piece.interval[1] - dataExtent[0]) / dataSpan
                ]
            };
        });
        var len = pieceList.length;
        var lastIndex = 0;
        return function (val) {
            // Try to find in the location of the last found
            for (var i = lastIndex; i < len; i++) {
                var interval = pieceList[i].interval;
                if (interval[0] <= val && val <= interval[1]) {
                    lastIndex = i;
                    break;
                }
            }
            if (i === len) { // Not found, back interation
                for (var i = lastIndex - 1; i >= 0; i--) {
                    var interval = pieceList[i].interval;
                    if (interval[0] <= val && val <= interval[1]) {
                        lastIndex = i;
                        break;
                    }
                }
            }
            return i >= 0 && i < len && selected[i];
        };
    }
 
    function getIsInContinuousRange(dataExtent, range) {
        var dataSpan = dataExtent[1] - dataExtent[0];
        range = [
            (range[0] - dataExtent[0]) / dataSpan,
            (range[1] - dataExtent[0]) / dataSpan
        ];
        return function (val) {
            return val >= range[0] && val <= range[1];
        };
    }
 
    function isGeoCoordSys(coordSys) {
        var dimensions = coordSys.dimensions;
        // Not use coorSys.type === 'geo' because coordSys maybe extended
        return dimensions[0] === 'lng' && dimensions[1] === 'lat';
    }
 
    module.exports = require('../../echarts').extendChartView({
 
        type: 'heatmap',
 
        render: function (seriesModel, ecModel, api) {
            var visualMapOfThisSeries;
            ecModel.eachComponent('visualMap', function (visualMap) {
                visualMap.eachTargetSeries(function (targetSeries) {
                    if (targetSeries === seriesModel) {
                        visualMapOfThisSeries = visualMap;
                    }
                });
            });
 
            if (__DEV__) {
                if (!visualMapOfThisSeries) {
                    throw new Error('Heatmap must use with visualMap');
                }
            }
 
            this.group.removeAll();
            var coordSys = seriesModel.coordinateSystem;
            if (coordSys.type === 'cartesian2d' || coordSys.type === 'calendar') {
                this._renderOnCartesianAndCalendar(coordSys, seriesModel, api);
            }
            else if (isGeoCoordSys(coordSys)) {
                this._renderOnGeo(
                    coordSys, seriesModel, visualMapOfThisSeries, api
                );
            }
        },
 
        dispose: function () {},
 
        _renderOnCartesianAndCalendar: function (coordSys, seriesModel, api) {
 
            if (coordSys.type === 'cartesian2d') {
                var xAxis = coordSys.getAxis('x');
                var yAxis = coordSys.getAxis('y');
 
                if (__DEV__) {
                    if (!(xAxis.type === 'category' && yAxis.type === 'category')) {
                        throw new Error('Heatmap on cartesian must have two category axes');
                    }
                    if (!(xAxis.onBand && yAxis.onBand)) {
                        throw new Error('Heatmap on cartesian must have two axes with boundaryGap true');
                    }
                }
 
                var width = xAxis.getBandWidth();
                var height = yAxis.getBandWidth();
 
            }
 
 
            var group = this.group;
            var data = seriesModel.getData();
 
            var itemStyleQuery = 'itemStyle.normal';
            var hoverItemStyleQuery = 'itemStyle.emphasis';
            var labelQuery = 'label.normal';
            var hoverLabelQuery = 'label.emphasis';
            var style = seriesModel.getModel(itemStyleQuery).getItemStyle(['color']);
            var hoverStl = seriesModel.getModel(hoverItemStyleQuery).getItemStyle();
            var labelModel = seriesModel.getModel('label.normal');
            var hoverLabelModel = seriesModel.getModel('label.emphasis');
 
 
 
            data.each(
                coordSys.type === 'cartesian2d' ? ['x', 'y', 'z'] : ['time', 'value'],
 
                function (x, y, z, idx) {
                    var rect;
 
                    if (coordSys.type === 'cartesian2d') {
 
                        // Ignore empty data
                        if (isNaN(z)) {
                            return;
                        }
 
                        var point = coordSys.dataToPoint([x, y]);
 
                        rect = new graphic.Rect({
                            shape: {
                                x: point[0] - width / 2,
                                y: point[1] - height / 2,
                                width: width,
                                height: height
                            },
                            style: {
                                fill: data.getItemVisual(idx, 'color'),
                                opacity: data.getItemVisual(idx, 'opacity')
                            }
                        });
                    }
                    else {
                        // x => time y => value z => idx
 
                        // Ignore empty data
                        if (isNaN(y)) {
                            return;
                        }
 
                        idx = z;
 
                        rect = new graphic.Rect({
                            z2: 1,
                            shape: coordSys.dataToRect([x, y]).contentShape,
                            style: {
                                fill: data.getItemVisual(idx, 'color'),
                                opacity: data.getItemVisual(idx, 'opacity')
                            }
                        });
                    }
 
 
                    var itemModel = data.getItemModel(idx);
 
                    // Optimization for large datset
                    if (data.hasItemOption) {
                        style = itemModel.getModel(itemStyleQuery).getItemStyle(['color']);
                        hoverStl = itemModel.getModel(hoverItemStyleQuery).getItemStyle();
                        labelModel = itemModel.getModel(labelQuery);
                        hoverLabelModel = itemModel.getModel(hoverLabelQuery);
                    }
 
                    var rawValue = seriesModel.getRawValue(idx);
                    var defaultText = '-';
                    if (rawValue && rawValue[2] != null) {
                        defaultText = rawValue[2];
                    }
                    if (labelModel.getShallow('show')) {
                        graphic.setText(style, labelModel);
                        style.text = seriesModel.getFormattedLabel(idx, 'normal') || defaultText;
                    }
                    if (hoverLabelModel.getShallow('show')) {
                        graphic.setText(hoverStl, hoverLabelModel);
                        hoverStl.text = seriesModel.getFormattedLabel(idx, 'emphasis') || defaultText;
                    }
 
                    rect.setStyle(style);
 
                    graphic.setHoverStyle(rect, data.hasItemOption ? hoverStl : zrUtil.extend({}, hoverStl));
 
                    group.add(rect);
                    data.setItemGraphicEl(idx, rect);
                }
            );
        },
 
        _renderOnGeo: function (geo, seriesModel, visualMapModel, api) {
            var inRangeVisuals = visualMapModel.targetVisuals.inRange;
            var outOfRangeVisuals = visualMapModel.targetVisuals.outOfRange;
            // if (!visualMapping) {
            //     throw new Error('Data range must have color visuals');
            // }
 
            var data = seriesModel.getData();
            var hmLayer = this._hmLayer || (this._hmLayer || new HeatmapLayer());
            hmLayer.blurSize = seriesModel.get('blurSize');
            hmLayer.pointSize = seriesModel.get('pointSize');
            hmLayer.minOpacity = seriesModel.get('minOpacity');
            hmLayer.maxOpacity = seriesModel.get('maxOpacity');
 
            var rect = geo.getViewRect().clone();
            var roamTransform = geo.getRoamTransform().transform;
            rect.applyTransform(roamTransform);
 
            // Clamp on viewport
            var x = Math.max(rect.x, 0);
            var y = Math.max(rect.y, 0);
            var x2 = Math.min(rect.width + rect.x, api.getWidth());
            var y2 = Math.min(rect.height + rect.y, api.getHeight());
            var width = x2 - x;
            var height = y2 - y;
 
            var points = data.mapArray(['lng', 'lat', 'value'], function (lng, lat, value) {
                var pt = geo.dataToPoint([lng, lat]);
                pt[0] -= x;
                pt[1] -= y;
                pt.push(value);
                return pt;
            });
 
            var dataExtent = visualMapModel.getExtent();
            var isInRange = visualMapModel.type === 'visualMap.continuous'
                ? getIsInContinuousRange(dataExtent, visualMapModel.option.range)
                : getIsInPiecewiseRange(
                    dataExtent, visualMapModel.getPieceList(), visualMapModel.option.selected
                );
 
            hmLayer.update(
                points, width, height,
                inRangeVisuals.color.getNormalizer(),
                {
                    inRange: inRangeVisuals.color.getColorMapper(),
                    outOfRange: outOfRangeVisuals.color.getColorMapper()
                },
                isInRange
            );
            var img = new graphic.Image({
                style: {
                    width: width,
                    height: height,
                    x: x,
                    y: y,
                    image: hmLayer.canvas
                },
                silent: true
            });
            this.group.add(img);
        }
    });
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/

Statements: 18% (207 / 1150)      Branches: 0% (0 / 463)      Functions: 0% (0 / 150)      Lines: 18% (207 / 1150)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/chart/helper/
File Statements Branches Functions Lines
EffectLine.js 18.37% (18 / 98) 0% (0 / 24) 0% (0 / 12) 18.37% (18 / 98)
EffectPolyline.js 21.43% (12 / 56) 0% (0 / 10) 0% (0 / 5) 21.43% (12 / 56)
EffectSymbol.js 19.61% (20 / 102) 0% (0 / 28) 0% (0 / 15) 19.61% (20 / 102)
LargeLineDraw.js 16.95% (10 / 59) 0% (0 / 18) 0% (0 / 7) 16.95% (10 / 59)
LargeSymbolDraw.js 15% (9 / 60) 0% (0 / 14) 0% (0 / 8) 15% (9 / 60)
Line.js 11.89% (22 / 185) 0% (0 / 89) 0% (0 / 14) 11.89% (22 / 185)
LineDraw.js 25% (10 / 40) 0% (0 / 12) 0% (0 / 10) 25% (10 / 40)
LinePath.js 50% (6 / 12) 0% (0 / 8) 0% (0 / 4) 50% (6 / 12)
Polyline.js 29.41% (10 / 34) 0% (0 / 8) 0% (0 / 5) 29.41% (10 / 34)
Symbol.js 21.31% (26 / 122) 0% (0 / 54) 0% (0 / 17) 21.31% (26 / 122)
SymbolDraw.js 16.67% (9 / 54) 0% (0 / 23) 0% (0 / 12) 16.67% (9 / 54)
WhiskerBoxDraw.js 20.51% (16 / 78) 0% (0 / 24) 0% (0 / 16) 20.51% (16 / 78)
createGraphFromNodeEdge.js 22.22% (8 / 36) 0% (0 / 14) 0% (0 / 1) 22.22% (8 / 36)
createGraphFromNodeMatrix.js 21.05% (8 / 38) 0% (0 / 14) 0% (0 / 1) 21.05% (8 / 38)
createListFromArray.js 11.81% (15 / 127) 0% (0 / 105) 0% (0 / 13) 11.81% (15 / 127)
whiskerBoxCommon.js 16.33% (8 / 49) 0% (0 / 18) 0% (0 / 10) 16.33% (8 / 49)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/EffectLine.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/EffectLine.js

Statements: 18.37% (18 / 98)      Branches: 0% (0 / 24)      Functions: 0% (0 / 12)      Lines: 18.37% (18 / 98)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189            1 1 1 1 1   1             1               1   1       1                                                                                     1                                                                                                                       1           1                 1         1                                         1             1   1    
/**
 * Provide effect for line
 * @module echarts/chart/helper/EffectLine
 */
 
 
    var graphic = require('../../util/graphic');
    var Line = require('./Line');
    var zrUtil = require('zrender/lib/core/util');
    var symbolUtil = require('../../util/symbol');
    var vec2 = require('zrender/lib/core/vector');
 
    var curveUtil = require('zrender/lib/core/curve');
 
    /**
     * @constructor
     * @extends {module:zrender/graphic/Group}
     * @alias {module:echarts/chart/helper/Line}
     */
    function EffectLine(lineData, idx, seriesScope) {
        graphic.Group.call(this);
 
        this.add(this.createLine(lineData, idx, seriesScope));
 
        this._updateEffectSymbol(lineData, idx);
    }
 
    var effectLineProto = EffectLine.prototype;
 
    effectLineProto.createLine = function (lineData, idx, seriesScope) {
        return new Line(lineData, idx, seriesScope);
    };
 
    effectLineProto._updateEffectSymbol = function (lineData, idx) {
        var itemModel = lineData.getItemModel(idx);
        var effectModel = itemModel.getModel('effect');
        var size = effectModel.get('symbolSize');
        var symbolType = effectModel.get('symbol');
        if (!zrUtil.isArray(size)) {
            size = [size, size];
        }
        var color = effectModel.get('color') || lineData.getItemVisual(idx, 'color');
        var symbol = this.childAt(1);
 
        if (this._symbolType !== symbolType) {
            // Remove previous
            this.remove(symbol);
 
            symbol = symbolUtil.createSymbol(
                symbolType, -0.5, -0.5, 1, 1, color
            );
            symbol.z2 = 100;
            symbol.culling = true;
 
            this.add(symbol);
        }
 
        // Symbol may be removed if loop is false
        if (!symbol) {
            return;
        }
 
        // Shadow color is same with color in default
        symbol.setStyle('shadowColor', color);
        symbol.setStyle(effectModel.getItemStyle(['color']));
 
        symbol.attr('scale', size);
 
        symbol.setColor(color);
        symbol.attr('scale', size);
 
        this._symbolType = symbolType;
 
        this._updateEffectAnimation(lineData, effectModel, idx);
    };
 
    effectLineProto._updateEffectAnimation = function (lineData, effectModel, idx) {
 
        var symbol = this.childAt(1);
        if (!symbol) {
            return;
        }
 
        var self = this;
 
        var points = lineData.getItemLayout(idx);
 
        var period = effectModel.get('period') * 1000;
        var loop = effectModel.get('loop');
        var constantSpeed = effectModel.get('constantSpeed');
        var delayExpr = zrUtil.retrieve(effectModel.get('delay'), function (idx) {
            return idx / lineData.count() * period / 3;
        });
        var isDelayFunc = typeof delayExpr === 'function';
 
        // Ignore when updating
        symbol.ignore = true;
 
        this.updateAnimationPoints(symbol, points);
 
        if (constantSpeed > 0) {
            period = this.getLineLength(symbol) / constantSpeed * 1000;
        }
 
        if (period !== this._period || loop !== this._loop) {
 
            symbol.stopAnimation();
 
            var delay = delayExpr;
            if (isDelayFunc) {
                delay = delayExpr(idx);
            }
            if (symbol.__t > 0) {
                delay = -period * symbol.__t;
            }
            symbol.__t = 0;
            var animator = symbol.animate('', loop)
                .when(period, {
                    __t: 1
                })
                .delay(delay)
                .during(function () {
                    self.updateSymbolPosition(symbol);
                });
            if (!loop) {
                animator.done(function () {
                    self.remove(symbol);
                });
            }
            animator.start();
        }
 
        this._period = period;
        this._loop = loop;
    };
 
    effectLineProto.getLineLength = function (symbol) {
        // Not so accurate
        return (vec2.dist(symbol.__p1, symbol.__cp1)
            + vec2.dist(symbol.__cp1, symbol.__p2));
    };
 
    effectLineProto.updateAnimationPoints = function (symbol, points) {
        symbol.__p1 = points[0];
        symbol.__p2 = points[1];
        symbol.__cp1 = points[2] || [
            (points[0][0] + points[1][0]) / 2,
            (points[0][1] + points[1][1]) / 2
        ];
    };
 
    effectLineProto.updateData = function (lineData, idx, seriesScope) {
        this.childAt(0).updateData(lineData, idx, seriesScope);
        this._updateEffectSymbol(lineData, idx);
    };
 
    effectLineProto.updateSymbolPosition = function (symbol) {
        var p1 = symbol.__p1;
        var p2 = symbol.__p2;
        var cp1 = symbol.__cp1;
        var t = symbol.__t;
        var pos = symbol.position;
        var quadraticAt = curveUtil.quadraticAt;
        var quadraticDerivativeAt = curveUtil.quadraticDerivativeAt;
        pos[0] = quadraticAt(p1[0], cp1[0], p2[0], t);
        pos[1] = quadraticAt(p1[1], cp1[1], p2[1], t);
 
        // Tangent
        var tx = quadraticDerivativeAt(p1[0], cp1[0], p2[0], t);
        var ty = quadraticDerivativeAt(p1[1], cp1[1], p2[1], t);
 
        symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2;
 
        symbol.ignore = false;
    };
 
 
    effectLineProto.updateLayout = function (lineData, idx) {
        this.childAt(0).updateLayout(lineData, idx);
 
        var effectModel = lineData.getItemModel(idx).getModel('effect');
        this._updateEffectAnimation(lineData, effectModel, idx);
    };
 
    zrUtil.inherits(EffectLine, graphic.Group);
 
    module.exports = EffectLine;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/EffectPolyline.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/EffectPolyline.js

Statements: 21.43% (12 / 56)      Branches: 0% (0 / 10)      Functions: 0% (0 / 5)      Lines: 21.43% (12 / 56)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112            1 1 1 1             1           1     1         1                                           1         1                                                                                                   1   1    
/**
 * Provide effect for line
 * @module echarts/chart/helper/EffectLine
 */
 
 
    var Polyline = require('./Polyline');
    var zrUtil = require('zrender/lib/core/util');
    var EffectLine = require('./EffectLine');
    var vec2 = require('zrender/lib/core/vector');
 
    /**
     * @constructor
     * @extends {module:echarts/chart/helper/EffectLine}
     * @alias {module:echarts/chart/helper/Polyline}
     */
    function EffectPolyline(lineData, idx, seriesScope) {
        EffectLine.call(this, lineData, idx, seriesScope);
        this._lastFrame = 0;
        this._lastFramePercent = 0;
    }
 
    var effectPolylineProto = EffectPolyline.prototype;
 
    // Overwrite
    effectPolylineProto.createLine = function (lineData, idx, seriesScope) {
        return new Polyline(lineData, idx, seriesScope);
    };
 
    // Overwrite
    effectPolylineProto.updateAnimationPoints = function (symbol, points) {
        this._points = points;
        var accLenArr = [0];
        var len = 0;
        for (var i = 1; i < points.length; i++) {
            var p1 = points[i - 1];
            var p2 = points[i];
            len += vec2.dist(p1, p2);
            accLenArr.push(len);
        }
        if (len === 0) {
            return;
        }
 
        for (var i = 0; i < accLenArr.length; i++) {
            accLenArr[i] /= len;
        }
        this._offsets = accLenArr;
        this._length = len;
    };
 
    // Overwrite
    effectPolylineProto.getLineLength = function (symbol) {
        return this._length;
    };
 
    // Overwrite
    effectPolylineProto.updateSymbolPosition = function (symbol) {
        var t = symbol.__t;
        var points = this._points;
        var offsets = this._offsets;
        var len = points.length;
 
        if (!offsets) {
            // Has length 0
            return;
        }
 
        var lastFrame = this._lastFrame;
        var frame;
 
        if (t < this._lastFramePercent) {
            // Start from the next frame
            // PENDING start from lastFrame ?
            var start = Math.min(lastFrame + 1, len - 1);
            for (frame = start; frame >= 0; frame--) {
                if (offsets[frame] <= t) {
                    break;
                }
            }
            // PENDING really need to do this ?
            frame = Math.min(frame, len - 2);
        }
        else {
            for (var frame = lastFrame; frame < len; frame++) {
                if (offsets[frame] > t) {
                    break;
                }
            }
            frame = Math.min(frame - 1, len - 2);
        }
 
        vec2.lerp(
            symbol.position, points[frame], points[frame + 1],
            (t - offsets[frame]) / (offsets[frame + 1] - offsets[frame])
        );
 
        var tx = points[frame + 1][0] - points[frame][0];
        var ty = points[frame + 1][1] - points[frame][1];
        symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2;
 
        this._lastFrame = frame;
        this._lastFramePercent = t;
 
        symbol.ignore = false;
    };
 
    zrUtil.inherits(EffectPolyline, EffectLine);
 
    module.exports = EffectPolyline;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/EffectSymbol.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/EffectSymbol.js

Statements: 19.61% (20 / 102)      Branches: 0% (0 / 28)      Functions: 0% (0 / 15)      Lines: 19.61% (20 / 102)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230            1 1 1 1 1 1   1   1             1                                   1                           1   1       1                                                                                               1                                         1             1                 1                                                                                                                                                     1         1   1    
/**
 * Symbol with ripple effect
 * @module echarts/chart/helper/EffectSymbol
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
    var symbolUtil = require('../../util/symbol');
    var graphic = require('../../util/graphic');
    var numberUtil = require('../../util/number');
    var Symbol = require('./Symbol');
    var Group = graphic.Group;
 
    var EFFECT_RIPPLE_NUMBER = 3;
 
    function normalizeSymbolSize(symbolSize) {
        if (!zrUtil.isArray(symbolSize)) {
            symbolSize = [+symbolSize, +symbolSize];
        }
        return symbolSize;
    }
 
    function updateRipplePath(rippleGroup, effectCfg) {
        rippleGroup.eachChild(function (ripplePath) {
            ripplePath.attr({
                z: effectCfg.z,
                zlevel: effectCfg.zlevel,
                style: {
                    stroke: effectCfg.brushType === 'stroke' ? effectCfg.color : null,
                    fill: effectCfg.brushType === 'fill' ? effectCfg.color : null
                }
            });
        });
    }
    /**
     * @constructor
     * @param {module:echarts/data/List} data
     * @param {number} idx
     * @extends {module:zrender/graphic/Group}
     */
    function EffectSymbol(data, idx) {
        Group.call(this);
 
        var symbol = new Symbol(data, idx);
        var rippleGroup = new Group();
        this.add(symbol);
        this.add(rippleGroup);
 
        rippleGroup.beforeUpdate = function () {
            this.attr(symbol.getScale());
        };
        this.updateData(data, idx);
    }
 
    var effectSymbolProto = EffectSymbol.prototype;
 
    effectSymbolProto.stopEffectAnimation = function () {
        this.childAt(1).removeAll();
    };
 
    effectSymbolProto.startEffectAnimation = function (effectCfg) {
        var symbolType = effectCfg.symbolType;
        var color = effectCfg.color;
        var rippleGroup = this.childAt(1);
 
        for (var i = 0; i < EFFECT_RIPPLE_NUMBER; i++) {
            // var ripplePath = symbolUtil.createSymbol(
            //     symbolType, -0.5, -0.5, 1, 1, color
            // );
            // If width/height are set too small (e.g., set to 1) on ios10
            // and macOS Sierra, a circle stroke become a rect, no matter what
            // the scale is set. So we set width/height as 2. See #4136.
            var ripplePath = symbolUtil.createSymbol(
                symbolType, -1, -1, 2, 2, color
            );
            ripplePath.attr({
                style: {
                    strokeNoScale: true
                },
                z2: 99,
                silent: true,
                scale: [0.5, 0.5]
            });
 
            var delay = -i / EFFECT_RIPPLE_NUMBER * effectCfg.period + effectCfg.effectOffset;
            // TODO Configurable effectCfg.period
            ripplePath.animate('', true)
                .when(effectCfg.period, {
                    scale: [effectCfg.rippleScale / 2, effectCfg.rippleScale / 2]
                })
                .delay(delay)
                .start();
            ripplePath.animateStyle(true)
                .when(effectCfg.period, {
                    opacity: 0
                })
                .delay(delay)
                .start();
 
            rippleGroup.add(ripplePath);
        }
 
        updateRipplePath(rippleGroup, effectCfg);
    };
 
    /**
     * Update effect symbol
     */
    effectSymbolProto.updateEffectAnimation = function (effectCfg) {
        var oldEffectCfg = this._effectCfg;
        var rippleGroup = this.childAt(1);
 
        // Must reinitialize effect if following configuration changed
        var DIFFICULT_PROPS = ['symbolType', 'period', 'rippleScale'];
        for (var i = 0; i < DIFFICULT_PROPS; i++) {
            var propName = DIFFICULT_PROPS[i];
            if (oldEffectCfg[propName] !== effectCfg[propName]) {
                this.stopEffectAnimation();
                this.startEffectAnimation(effectCfg);
                return;
            }
        }
 
        updateRipplePath(rippleGroup, effectCfg);
    };
 
    /**
     * Highlight symbol
     */
    effectSymbolProto.highlight = function () {
        this.trigger('emphasis');
    };
 
    /**
     * Downplay symbol
     */
    effectSymbolProto.downplay = function () {
        this.trigger('normal');
    };
 
    /**
     * Update symbol properties
     * @param  {module:echarts/data/List} data
     * @param  {number} idx
     */
    effectSymbolProto.updateData = function (data, idx) {
        var seriesModel = data.hostModel;
 
        this.childAt(0).updateData(data, idx);
 
        var rippleGroup = this.childAt(1);
        var itemModel = data.getItemModel(idx);
        var symbolType = data.getItemVisual(idx, 'symbol');
        var symbolSize = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize'));
        var color = data.getItemVisual(idx, 'color');
 
        rippleGroup.attr('scale', symbolSize);
 
        rippleGroup.traverse(function (ripplePath) {
            ripplePath.attr({
                fill: color
            });
        });
 
        var symbolOffset = itemModel.getShallow('symbolOffset');
        if (symbolOffset) {
            var pos = rippleGroup.position;
            pos[0] = numberUtil.parsePercent(symbolOffset[0], symbolSize[0]);
            pos[1] = numberUtil.parsePercent(symbolOffset[1], symbolSize[1]);
        }
        rippleGroup.rotation = (itemModel.getShallow('symbolRotate') || 0) * Math.PI / 180 || 0;
 
        var effectCfg = {};
 
        effectCfg.showEffectOn = seriesModel.get('showEffectOn');
        effectCfg.rippleScale = itemModel.get('rippleEffect.scale');
        effectCfg.brushType = itemModel.get('rippleEffect.brushType');
        effectCfg.period = itemModel.get('rippleEffect.period') * 1000;
        effectCfg.effectOffset = idx / data.count();
        effectCfg.z = itemModel.getShallow('z') || 0;
        effectCfg.zlevel = itemModel.getShallow('zlevel') || 0;
        effectCfg.symbolType = symbolType;
        effectCfg.color = color;
 
        this.off('mouseover').off('mouseout').off('emphasis').off('normal');
 
        if (effectCfg.showEffectOn === 'render') {
            this._effectCfg
                ? this.updateEffectAnimation(effectCfg)
                : this.startEffectAnimation(effectCfg);
 
            this._effectCfg = effectCfg;
        }
        else {
            // Not keep old effect config
            this._effectCfg = null;
 
            this.stopEffectAnimation();
            var symbol = this.childAt(0);
            var onEmphasis = function () {
                symbol.trigger('emphasis');
                if (effectCfg.showEffectOn !== 'render') {
                    this.startEffectAnimation(effectCfg);
                }
            };
            var onNormal = function () {
                symbol.trigger('normal');
                if (effectCfg.showEffectOn !== 'render') {
                    this.stopEffectAnimation();
                }
            };
            this.on('mouseover', onEmphasis, this)
                .on('mouseout', onNormal, this)
                .on('emphasis', onEmphasis, this)
                .on('normal', onNormal, this);
        }
 
        this._effectCfg = effectCfg;
    };
 
    effectSymbolProto.fadeOut = function (cb) {
        this.off('mouseover').off('mouseout').off('emphasis').off('normal');
        cb && cb();
    };
 
    zrUtil.inherits(EffectSymbol, Group);
 
    module.exports = EffectSymbol;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/LargeLineDraw.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/LargeLineDraw.js

Statements: 16.95% (10 / 59)      Branches: 0% (0 / 18)      Functions: 0% (0 / 7)      Lines: 16.95% (10 / 59)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144        1   1 1   1                                                                                                                                             1           1           1                                                                           1             1       1    
// TODO Batch by color
 
 
 
    var graphic = require('../../util/graphic');
 
    var quadraticContain = require('zrender/lib/contain/quadratic');
    var lineContain = require('zrender/lib/contain/line');
 
    var LargeLineShape = graphic.extendShape({
        shape: {
            polyline: false,
 
            segs: []
        },
 
        buildPath: function (path, shape) {
            var segs = shape.segs;
            var isPolyline = shape.polyline;
 
            for (var i = 0; i < segs.length; i++) {
                var seg = segs[i];
                if (isPolyline) {
                    path.moveTo(seg[0][0], seg[0][1]);
                    for (var j = 1; j < seg.length; j++) {
                        path.lineTo(seg[j][0], seg[j][1]);
                    }
                }
                else {
                    path.moveTo(seg[0][0], seg[0][1]);
                    if (seg.length > 2) {
                        path.quadraticCurveTo(seg[2][0], seg[2][1], seg[1][0], seg[1][1]);
                    }
                    else {
                        path.lineTo(seg[1][0], seg[1][1]);
                    }
                }
            }
        },
 
        findDataIndex: function (x, y) {
            var shape = this.shape;
            var segs = shape.segs;
            var isPolyline = shape.polyline;
            var lineWidth = Math.max(this.style.lineWidth, 1);
 
            // Not consider transform
            for (var i = 0; i < segs.length; i++) {
                var seg = segs[i];
                if (isPolyline) {
                    for (var j = 1; j < seg.length; j++) {
                        if (lineContain.containStroke(
                            seg[j - 1][0], seg[j - 1][1], seg[j][0], seg[j][1], lineWidth, x, y
                        )) {
                            return i;
                        }
                    }
                }
                else {
                    if (seg.length > 2) {
                        if (quadraticContain.containStroke(
                            seg[0][0], seg[0][1], seg[2][0], seg[2][1], seg[1][0], seg[1][1], lineWidth, x, y
                        )) {
                            return i;
                        }
                    }
                    else {
                        if (lineContain.containStroke(
                            seg[0][0], seg[0][1], seg[1][0], seg[1][1], lineWidth, x, y
                        )) {
                            return i;
                        }
                    }
                }
            }
 
            return -1;
        }
    });
 
    function LargeLineDraw() {
        this.group = new graphic.Group();
 
        this._lineEl = new LargeLineShape();
    }
 
    var largeLineProto = LargeLineDraw.prototype;
 
    /**
     * Update symbols draw by new data
     * @param {module:echarts/data/List} data
     */
    largeLineProto.updateData = function (data) {
        this.group.removeAll();
 
        var lineEl = this._lineEl;
 
        var seriesModel = data.hostModel;
 
        lineEl.setShape({
            segs: data.mapArray(data.getItemLayout),
            polyline: seriesModel.get('polyline')
        });
 
        lineEl.useStyle(
            seriesModel.getModel('lineStyle.normal').getLineStyle()
        );
 
        var visualColor = data.getVisual('color');
        if (visualColor) {
            lineEl.setStyle('stroke', visualColor);
        }
        lineEl.setStyle('fill');
 
        // Enable tooltip
        // PENDING May have performance issue when path is extremely large
        lineEl.seriesIndex = seriesModel.seriesIndex;
        lineEl.on('mousemove', function (e) {
            lineEl.dataIndex = null;
            var dataIndex = lineEl.findDataIndex(e.offsetX, e.offsetY);
            if (dataIndex > 0) {
                // Provide dataIndex for tooltip
                lineEl.dataIndex = dataIndex;
            }
        });
 
        // Add back
        this.group.add(lineEl);
    };
 
    largeLineProto.updateLayout = function (seriesModel) {
        var data = seriesModel.getData();
        this._lineEl.setShape({
            segs: data.mapArray(data.getItemLayout)
        });
    };
 
    largeLineProto.remove = function () {
        this.group.removeAll();
    };
 
    module.exports = LargeLineDraw;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/LargeSymbolDraw.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/LargeSymbolDraw.js

Statements: 15% (9 / 60)      Branches: 0% (0 / 14)      Functions: 0% (0 / 8)      Lines: 15% (9 / 60)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147        1 1   1                                                                                                                     1                 1           1                                                                                                       1             1       1    
// TODO Batch by color
 
 
 
    var graphic = require('../../util/graphic');
    var symbolUtil = require('../../util/symbol');
 
    var LargeSymbolPath = graphic.extendShape({
 
        shape: {
            points: null,
            sizes: null
        },
 
        symbolProxy: null,
 
        buildPath: function (path, shape) {
            var points = shape.points;
            var sizes = shape.sizes;
 
            var symbolProxy = this.symbolProxy;
            var symbolProxyShape = symbolProxy.shape;
            for (var i = 0; i < points.length; i++) {
                var pt = points[i];
                var size = sizes[i];
                if (size[0] < 4) {
                    // Optimize for small symbol
                    path.rect(
                        pt[0] - size[0] / 2, pt[1] - size[1] / 2,
                        size[0], size[1]
                    );
                }
                else {
                    symbolProxyShape.x = pt[0] - size[0] / 2;
                    symbolProxyShape.y = pt[1] - size[1] / 2;
                    symbolProxyShape.width = size[0];
                    symbolProxyShape.height = size[1];
 
                    symbolProxy.buildPath(path, symbolProxyShape, true);
                }
            }
        },
 
        findDataIndex: function (x, y) {
            var shape = this.shape;
            var points = shape.points;
            var sizes = shape.sizes;
 
            // Not consider transform
            // Treat each element as a rect
            // top down traverse
            for (var i = points.length - 1; i >= 0; i--) {
                var pt = points[i];
                var size = sizes[i];
                var x0 = pt[0] - size[0] / 2;
                var y0 = pt[1] - size[1] / 2;
                if (x >= x0 && y >= y0 && x <= x0 + size[0] && y <= y0 + size[1]) {
                    // i is dataIndex
                    return i;
                }
            }
 
            return -1;
        }
    });
 
    function LargeSymbolDraw() {
        this.group = new graphic.Group();
 
        this._symbolEl = new LargeSymbolPath({
            // rectHover: true,
            // cursor: 'default'
        });
    }
 
    var largeSymbolProto = LargeSymbolDraw.prototype;
 
    /**
     * Update symbols draw by new data
     * @param {module:echarts/data/List} data
     */
    largeSymbolProto.updateData = function (data) {
        this.group.removeAll();
 
        var symbolEl = this._symbolEl;
 
        var seriesModel = data.hostModel;
 
        symbolEl.setShape({
            points: data.mapArray(data.getItemLayout),
            sizes: data.mapArray(
                function (idx) {
                    var size = data.getItemVisual(idx, 'symbolSize');
                    if (!(size instanceof Array)) {
                        size = [size, size];
                    }
                    return size;
                }
            )
        });
 
        // Create symbolProxy to build path for each data
        symbolEl.symbolProxy = symbolUtil.createSymbol(
            data.getVisual('symbol'), 0, 0, 0, 0
        );
        // Use symbolProxy setColor method
        symbolEl.setColor = symbolEl.symbolProxy.setColor;
 
        symbolEl.useStyle(
            seriesModel.getModel('itemStyle.normal').getItemStyle(['color'])
        );
 
        var visualColor = data.getVisual('color');
        if (visualColor) {
            symbolEl.setColor(visualColor);
        }
 
        // Enable tooltip
        // PENDING May have performance issue when path is extremely large
        symbolEl.seriesIndex = seriesModel.seriesIndex;
        symbolEl.on('mousemove', function (e) {
            symbolEl.dataIndex = null;
            var dataIndex = symbolEl.findDataIndex(e.offsetX, e.offsetY);
            if (dataIndex > 0) {
                // Provide dataIndex for tooltip
                symbolEl.dataIndex = dataIndex;
            }
        });
 
        // Add back
        this.group.add(symbolEl);
    };
 
    largeSymbolProto.updateLayout = function (seriesModel) {
        var data = seriesModel.getData();
        this._symbolEl.setShape({
            points: data.mapArray(data.getItemLayout)
        });
    };
 
    largeSymbolProto.remove = function () {
        this.group.removeAll();
    };
 
    module.exports = LargeSymbolDraw;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/Line.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/Line.js

Statements: 11.89% (22 / 185)      Branches: 0% (0 / 89)      Functions: 0% (0 / 14)      Lines: 11.89% (22 / 185)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368          1 1   1 1 1 1   1 1           1                                           1               1                                       1                                                                                                                                                                                                                   1           1     1   1                                                             1                                                   1                                                                                                                                                                                                                         1       1           1   1    
/**
 * @module echarts/chart/helper/Line
 */
 
 
    var symbolUtil = require('../../util/symbol');
    var vector = require('zrender/lib/core/vector');
    // var matrix = require('zrender/lib/core/matrix');
    var LinePath = require('./LinePath');
    var graphic = require('../../util/graphic');
    var zrUtil = require('zrender/lib/core/util');
    var numberUtil = require('../../util/number');
 
    var SYMBOL_CATEGORIES = ['fromSymbol', 'toSymbol'];
    function makeSymbolTypeKey(symbolCategory) {
        return '_' + symbolCategory + 'Type';
    }
    /**
     * @inner
     */
    function createSymbol(name, lineData, idx) {
        var color = lineData.getItemVisual(idx, 'color');
        var symbolType = lineData.getItemVisual(idx, name);
        var symbolSize = lineData.getItemVisual(idx, name + 'Size');
 
        if (!symbolType || symbolType === 'none') {
            return;
        }
 
        if (!zrUtil.isArray(symbolSize)) {
            symbolSize = [symbolSize, symbolSize];
        }
        var symbolPath = symbolUtil.createSymbol(
            symbolType, -symbolSize[0] / 2, -symbolSize[1] / 2,
            symbolSize[0], symbolSize[1], color
        );
 
        symbolPath.name = name;
 
        return symbolPath;
    }
 
    function createLine(points) {
        var line = new LinePath({
            name: 'line'
        });
        setLinePoints(line.shape, points);
        return line;
    }
 
    function setLinePoints(targetShape, points) {
        var p1 = points[0];
        var p2 = points[1];
        var cp1 = points[2];
        targetShape.x1 = p1[0];
        targetShape.y1 = p1[1];
        targetShape.x2 = p2[0];
        targetShape.y2 = p2[1];
        targetShape.percent = 1;
 
        if (cp1) {
            targetShape.cpx1 = cp1[0];
            targetShape.cpy1 = cp1[1];
        }
        else {
            targetShape.cpx1 = NaN;
            targetShape.cpy1 = NaN;
        }
    }
 
    function updateSymbolAndLabelBeforeLineUpdate () {
        var lineGroup = this;
        var symbolFrom = lineGroup.childOfName('fromSymbol');
        var symbolTo = lineGroup.childOfName('toSymbol');
        var label = lineGroup.childOfName('label');
        // Quick reject
        if (!symbolFrom && !symbolTo && label.ignore) {
            return;
        }
 
        var invScale = 1;
        var parentNode = this.parent;
        while (parentNode) {
            if (parentNode.scale) {
                invScale /= parentNode.scale[0];
            }
            parentNode = parentNode.parent;
        }
 
        var line = lineGroup.childOfName('line');
        // If line not changed
        // FIXME Parent scale changed
        if (!this.__dirty && !line.__dirty) {
            return;
        }
 
        var percent = line.shape.percent;
        var fromPos = line.pointAt(0);
        var toPos = line.pointAt(percent);
 
        var d = vector.sub([], toPos, fromPos);
        vector.normalize(d, d);
 
        if (symbolFrom) {
            symbolFrom.attr('position', fromPos);
            var tangent = line.tangentAt(0);
            symbolFrom.attr('rotation', Math.PI / 2 - Math.atan2(
                tangent[1], tangent[0]
            ));
            symbolFrom.attr('scale', [invScale * percent, invScale * percent]);
        }
        if (symbolTo) {
            symbolTo.attr('position', toPos);
            var tangent = line.tangentAt(1);
            symbolTo.attr('rotation', -Math.PI / 2 - Math.atan2(
                tangent[1], tangent[0]
            ));
            symbolTo.attr('scale', [invScale * percent, invScale * percent]);
        }
 
        if (!label.ignore) {
            label.attr('position', toPos);
 
            var textPosition;
            var textAlign;
            var textVerticalAlign;
 
            var distance = 5 * invScale;
            // End
            if (label.__position === 'end') {
                textPosition = [d[0] * distance + toPos[0], d[1] * distance + toPos[1]];
                textAlign = d[0] > 0.8 ? 'left' : (d[0] < -0.8 ? 'right' : 'center');
                textVerticalAlign = d[1] > 0.8 ? 'top' : (d[1] < -0.8 ? 'bottom' : 'middle');
            }
            // Middle
            else if (label.__position === 'middle') {
                var halfPercent = percent / 2;
                var tangent = line.tangentAt(halfPercent);
                var n = [tangent[1], -tangent[0]];
                var cp = line.pointAt(halfPercent);
                if (n[1] > 0) {
                    n[0] = -n[0];
                    n[1] = -n[1];
                }
                textPosition = [cp[0] + n[0] * distance, cp[1] + n[1] * distance];
                textAlign = 'center';
                textVerticalAlign = 'bottom';
                var rotation = -Math.atan2(tangent[1], tangent[0]);
                if (toPos[0] < fromPos[0]) {
                    rotation = Math.PI + rotation;
                }
                label.attr('rotation', rotation);
            }
            // Start
            else {
                textPosition = [-d[0] * distance + fromPos[0], -d[1] * distance + fromPos[1]];
                textAlign = d[0] > 0.8 ? 'right' : (d[0] < -0.8 ? 'left' : 'center');
                textVerticalAlign = d[1] > 0.8 ? 'bottom' : (d[1] < -0.8 ? 'top' : 'middle');
            }
            label.attr({
                style: {
                    // Use the user specified text align and baseline first
                    textVerticalAlign: label.__verticalAlign || textVerticalAlign,
                    textAlign: label.__textAlign || textAlign
                },
                position: textPosition,
                scale: [invScale, invScale]
            });
        }
    }
 
    /**
     * @constructor
     * @extends {module:zrender/graphic/Group}
     * @alias {module:echarts/chart/helper/Line}
     */
    function Line(lineData, idx, seriesScope) {
        graphic.Group.call(this);
 
        this._createLine(lineData, idx, seriesScope);
    }
 
    var lineProto = Line.prototype;
 
    // Update symbol position and rotation
    lineProto.beforeUpdate = updateSymbolAndLabelBeforeLineUpdate;
 
    lineProto._createLine = function (lineData, idx, seriesScope) {
        var seriesModel = lineData.hostModel;
        var linePoints = lineData.getItemLayout(idx);
 
        var line = createLine(linePoints);
        line.shape.percent = 0;
        graphic.initProps(line, {
            shape: {
                percent: 1
            }
        }, seriesModel, idx);
 
        this.add(line);
 
        var label = new graphic.Text({
            name: 'label'
        });
        this.add(label);
 
        zrUtil.each(SYMBOL_CATEGORIES, function (symbolCategory) {
            var symbol = createSymbol(symbolCategory, lineData, idx);
            // symbols must added after line to make sure
            // it will be updated after line#update.
            // Or symbol position and rotation update in line#beforeUpdate will be one frame slow
            this.add(symbol);
            this[makeSymbolTypeKey(symbolCategory)] = lineData.getItemVisual(idx, symbolCategory);
        }, this);
 
        this._updateCommonStl(lineData, idx, seriesScope);
    };
 
    lineProto.updateData = function (lineData, idx, seriesScope) {
        var seriesModel = lineData.hostModel;
 
        var line = this.childOfName('line');
        var linePoints = lineData.getItemLayout(idx);
        var target = {
            shape: {}
        };
        setLinePoints(target.shape, linePoints);
        graphic.updateProps(line, target, seriesModel, idx);
 
        zrUtil.each(SYMBOL_CATEGORIES, function (symbolCategory) {
            var symbolType = lineData.getItemVisual(idx, symbolCategory);
            var key = makeSymbolTypeKey(symbolCategory);
            // Symbol changed
            if (this[key] !== symbolType) {
                this.remove(this.childOfName(symbolCategory));
                var symbol = createSymbol(symbolCategory, lineData, idx);
                this.add(symbol);
            }
            this[key] = symbolType;
        }, this);
 
        this._updateCommonStl(lineData, idx, seriesScope);
    };
 
    lineProto._updateCommonStl = function (lineData, idx, seriesScope) {
        var seriesModel = lineData.hostModel;
 
        var line = this.childOfName('line');
 
        var lineStyle = seriesScope && seriesScope.lineStyle;
        var hoverLineStyle = seriesScope && seriesScope.hoverLineStyle;
        var labelModel = seriesScope && seriesScope.labelModel;
        var hoverLabelModel = seriesScope && seriesScope.hoverLabelModel;
 
        // Optimization for large dataset
        if (!seriesScope || lineData.hasItemOption) {
            var itemModel = lineData.getItemModel(idx);
 
            lineStyle = itemModel.getModel('lineStyle.normal').getLineStyle();
            hoverLineStyle = itemModel.getModel('lineStyle.emphasis').getLineStyle();
 
            labelModel = itemModel.getModel('label.normal');
            hoverLabelModel = itemModel.getModel('label.emphasis');
        }
 
        var visualColor = lineData.getItemVisual(idx, 'color');
        var visualOpacity = zrUtil.retrieve(
            lineData.getItemVisual(idx, 'opacity'),
            lineStyle.opacity,
            1
        );
 
        line.useStyle(zrUtil.defaults(
            {
                strokeNoScale: true,
                fill: 'none',
                stroke: visualColor,
                opacity: visualOpacity
            },
            lineStyle
        ));
        line.hoverStyle = hoverLineStyle;
 
        // Update symbol
        zrUtil.each(SYMBOL_CATEGORIES, function (symbolCategory) {
            var symbol = this.childOfName(symbolCategory);
            if (symbol) {
                symbol.setColor(visualColor);
                symbol.setStyle({
                    opacity: visualOpacity
                });
            }
        }, this);
 
        var showLabel = labelModel.getShallow('show');
        var hoverShowLabel = hoverLabelModel.getShallow('show');
 
        var label = this.childOfName('label');
        var defaultLabelColor;
        var defaultText;
 
        if (showLabel || hoverShowLabel) {
            var rawVal = seriesModel.getRawValue(idx);
            defaultText = rawVal == null
                ? defaultText = lineData.getName(idx)
                : isFinite(rawVal)
                ? numberUtil.round(rawVal)
                : rawVal;
            defaultLabelColor = visualColor || '#000';
        }
 
        // label.afterUpdate = lineAfterUpdate;
        if (showLabel) {
            var textStyleModel = labelModel.getModel('textStyle');
            label.setStyle({
                text: zrUtil.retrieve(
                    seriesModel.getFormattedLabel(idx, 'normal', lineData.dataType),
                    defaultText
                ),
                textFont: textStyleModel.getFont(),
                fill: textStyleModel.getTextColor() || defaultLabelColor
            });
 
            label.__textAlign = textStyleModel.get('align');
            label.__verticalAlign = textStyleModel.get('baseline');
            label.__position = labelModel.get('position');
        }
        else {
            label.setStyle('text', '');
        }
        if (hoverShowLabel) {
            var textStyleHoverModel = hoverLabelModel.getModel('textStyle');
 
            label.hoverStyle = {
                text: zrUtil.retrieve(
                    seriesModel.getFormattedLabel(idx, 'emphasis', lineData.dataType),
                    defaultText
                ),
                textFont: textStyleHoverModel.getFont(),
                fill: textStyleHoverModel.getTextColor() || defaultLabelColor
            };
        }
        else {
            label.hoverStyle = {
                text: ''
            };
        }
 
        label.ignore = !showLabel && !hoverShowLabel;
 
        graphic.setHoverStyle(this);
    };
 
    lineProto.updateLayout = function (lineData, idx) {
        this.setLinePoints(lineData.getItemLayout(idx));
    };
 
    lineProto.setLinePoints = function (points) {
        var linePath = this.childOfName('line');
        setLinePoints(linePath.shape, points);
        linePath.dirty();
    };
 
    zrUtil.inherits(Line, graphic.Group);
 
    module.exports = Line;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/LineDraw.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/LineDraw.js

Statements: 25% (10 / 40)      Branches: 0% (0 / 12)      Functions: 0% (0 / 10)      Lines: 25% (10 / 40)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95          1 1     1     1             1         1         1                                                                                                       1             1       1    
/**
 * @module echarts/chart/helper/LineDraw
 */
 
 
    var graphic = require('../../util/graphic');
    var LineGroup = require('./Line');
 
 
    function isPointNaN(pt) {
        return isNaN(pt[0]) || isNaN(pt[1]);
    }
    function lineNeedsDraw(pts) {
        return !isPointNaN(pts[0]) && !isPointNaN(pts[1]);
    }
    /**
     * @alias module:echarts/component/marker/LineDraw
     * @constructor
     */
    function LineDraw(ctor) {
        this._ctor = ctor || LineGroup;
        this.group = new graphic.Group();
    }
 
    var lineDrawProto = LineDraw.prototype;
 
    /**
     * @param {module:echarts/data/List} lineData
     */
    lineDrawProto.updateData = function (lineData) {
 
        var oldLineData = this._lineData;
        var group = this.group;
        var LineCtor = this._ctor;
 
        var hostModel = lineData.hostModel;
 
        var seriesScope = {
            lineStyle: hostModel.getModel('lineStyle.normal').getLineStyle(),
            hoverLineStyle: hostModel.getModel('lineStyle.emphasis').getLineStyle(),
            labelModel: hostModel.getModel('label.normal'),
            hoverLabelModel: hostModel.getModel('label.emphasis')
        };
 
        lineData.diff(oldLineData)
            .add(function (idx) {
                if (!lineNeedsDraw(lineData.getItemLayout(idx))) {
                    return;
                }
                var lineGroup = new LineCtor(lineData, idx, seriesScope);
 
                lineData.setItemGraphicEl(idx, lineGroup);
 
                group.add(lineGroup);
            })
            .update(function (newIdx, oldIdx) {
                var lineGroup = oldLineData.getItemGraphicEl(oldIdx);
                if (!lineNeedsDraw(lineData.getItemLayout(newIdx))) {
                    group.remove(lineGroup);
                    return;
                }
 
                if (!lineGroup) {
                    lineGroup = new LineCtor(lineData, newIdx, seriesScope);
                }
                else {
                    lineGroup.updateData(lineData, newIdx, seriesScope);
                }
 
                lineData.setItemGraphicEl(newIdx, lineGroup);
 
                group.add(lineGroup);
            })
            .remove(function (idx) {
                group.remove(oldLineData.getItemGraphicEl(idx));
            })
            .execute();
 
        this._lineData = lineData;
    };
 
    lineDrawProto.updateLayout = function () {
        var lineData = this._lineData;
        lineData.eachItemGraphicEl(function (el, idx) {
            el.updateLayout(lineData, idx);
        }, this);
    };
 
    lineDrawProto.remove = function () {
        this.group.removeAll();
    };
 
    module.exports = LineDraw;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/LinePath.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/LinePath.js

Statements: 50% (6 / 12)      Branches: 0% (0 / 8)      Functions: 0% (0 / 4)      Lines: 50% (6 / 12)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53        1 1   1 1   1       1                                                                            
/**
 * Line path for bezier and straight line draw
 */
 
    var graphic = require('../../util/graphic');
    var vec2 = require('zrender/lib/core/vector');
 
    var straightLineProto = graphic.Line.prototype;
    var bezierCurveProto = graphic.BezierCurve.prototype;
 
    function isLine(shape) {
        return isNaN(+shape.cpx1) || isNaN(+shape.cpy1);
    }
 
    module.exports = graphic.extendShape({
 
        type: 'ec-line',
 
        style: {
            stroke: '#000',
            fill: null
        },
 
        shape: {
            x1: 0,
            y1: 0,
            x2: 0,
            y2: 0,
            percent: 1,
            cpx1: null,
            cpy1: null
        },
 
        buildPath: function (ctx, shape) {
            (isLine(shape) ? straightLineProto : bezierCurveProto).buildPath(ctx, shape);
        },
 
        pointAt: function (t) {
            return isLine(this.shape)
                ? straightLineProto.pointAt.call(this, t)
                : bezierCurveProto.pointAt.call(this, t);
        },
 
        tangentAt: function (t) {
            var shape = this.shape;
            var p = isLine(shape)
                ? [shape.x2 - shape.x1, shape.y2 - shape.y1]
                : bezierCurveProto.tangentAt.call(this, t);
            return vec2.normalize(p, p);
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/Polyline.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/Polyline.js

Statements: 29.41% (10 / 34)      Branches: 0% (0 / 8)      Functions: 0% (0 / 5)      Lines: 29.41% (10 / 34)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86          1 1             1           1   1                             1                           1                                                   1         1   1    
/**
 * @module echarts/chart/helper/Line
 */
 
 
    var graphic = require('../../util/graphic');
    var zrUtil = require('zrender/lib/core/util');
 
    /**
     * @constructor
     * @extends {module:zrender/graphic/Group}
     * @alias {module:echarts/chart/helper/Polyline}
     */
    function Polyline(lineData, idx, seriesScope) {
        graphic.Group.call(this);
 
        this._createPolyline(lineData, idx, seriesScope);
    }
 
    var polylineProto = Polyline.prototype;
 
    polylineProto._createPolyline = function (lineData, idx, seriesScope) {
        // var seriesModel = lineData.hostModel;
        var points = lineData.getItemLayout(idx);
 
        var line = new graphic.Polyline({
            shape: {
                points: points
            }
        });
 
        this.add(line);
 
        this._updateCommonStl(lineData, idx, seriesScope);
    };
 
    polylineProto.updateData = function (lineData, idx, seriesScope) {
        var seriesModel = lineData.hostModel;
 
        var line = this.childAt(0);
        var target = {
            shape: {
                points: lineData.getItemLayout(idx)
            }
        };
        graphic.updateProps(line, target, seriesModel, idx);
 
        this._updateCommonStl(lineData, idx, seriesScope);
    };
 
    polylineProto._updateCommonStl = function (lineData, idx, seriesScope) {
        var line = this.childAt(0);
        var itemModel = lineData.getItemModel(idx);
 
        var visualColor = lineData.getItemVisual(idx, 'color');
 
        var lineStyle = seriesScope && seriesScope.lineStyle;
        var hoverLineStyle = seriesScope && seriesScope.hoverLineStyle;
 
        if (!seriesScope || lineData.hasItemOption) {
            lineStyle = itemModel.getModel('lineStyle.normal').getLineStyle();
            hoverLineStyle = itemModel.getModel('lineStyle.emphasis').getLineStyle();
        }
        line.useStyle(zrUtil.defaults(
            {
                strokeNoScale: true,
                fill: 'none',
                stroke: visualColor
            },
            lineStyle
        ));
        line.hoverStyle = hoverLineStyle;
 
        graphic.setHoverStyle(this);
    };
 
    polylineProto.updateLayout = function (lineData, idx) {
        var polyline = this.childAt(0);
        polyline.setShape('points', lineData.getItemLayout(idx));
    };
 
    zrUtil.inherits(Polyline, graphic.Group);
 
    module.exports = Polyline;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/Symbol.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/Symbol.js

Statements: 21.31% (26 / 122)      Branches: 0% (0 / 54)      Functions: 0% (0 / 17)      Lines: 21.31% (26 / 122)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301          1 1 1 1   1             1                     1           1   1       1                                                                         1             1               1             1             1               1           1                     1                                           1 1 1 1   1                                                                                                                                                                                                                                                             1                     1   1    
/**
 * @module echarts/chart/helper/Symbol
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
    var symbolUtil = require('../../util/symbol');
    var graphic = require('../../util/graphic');
    var numberUtil = require('../../util/number');
 
    function getSymbolSize(data, idx) {
        var symbolSize = data.getItemVisual(idx, 'symbolSize');
        return symbolSize instanceof Array
            ? symbolSize.slice()
            : [+symbolSize, +symbolSize];
    }
 
    function getScale(symbolSize) {
        return [symbolSize[0] / 2, symbolSize[1] / 2];
    }
 
    /**
     * @constructor
     * @alias {module:echarts/chart/helper/Symbol}
     * @param {module:echarts/data/List} data
     * @param {number} idx
     * @extends {module:zrender/graphic/Group}
     */
    function Symbol(data, idx, seriesScope) {
        graphic.Group.call(this);
 
        this.updateData(data, idx, seriesScope);
    }
 
    var symbolProto = Symbol.prototype;
 
    function driftSymbol(dx, dy) {
        this.parent.drift(dx, dy);
    }
 
    symbolProto._createSymbol = function (symbolType, data, idx, symbolSize) {
        // Remove paths created before
        this.removeAll();
 
        var seriesModel = data.hostModel;
        var color = data.getItemVisual(idx, 'color');
 
        // var symbolPath = symbolUtil.createSymbol(
        //     symbolType, -0.5, -0.5, 1, 1, color
        // );
        // If width/height are set too small (e.g., set to 1) on ios10
        // and macOS Sierra, a circle stroke become a rect, no matter what
        // the scale is set. So we set width/height as 2. See #4150.
        var symbolPath = symbolUtil.createSymbol(
            symbolType, -1, -1, 2, 2, color
        );
 
        symbolPath.attr({
            z2: 100,
            culling: true,
            scale: [0, 0]
        });
        // Rewrite drift method
        symbolPath.drift = driftSymbol;
 
        graphic.initProps(symbolPath, {
            scale: getScale(symbolSize)
        }, seriesModel, idx);
        this._symbolType = symbolType;
 
        this.add(symbolPath);
    };
 
    /**
     * Stop animation
     * @param {boolean} toLastFrame
     */
    symbolProto.stopSymbolAnimation = function (toLastFrame) {
        this.childAt(0).stopAnimation(toLastFrame);
    };
 
    /**
     * Get symbol path element
     */
    symbolProto.getSymbolPath = function () {
        return this.childAt(0);
    };
 
    /**
     * Get scale(aka, current symbol size).
     * Including the change caused by animation
     */
    symbolProto.getScale = function () {
        return this.childAt(0).scale;
    };
 
    /**
     * Highlight symbol
     */
    symbolProto.highlight = function () {
        this.childAt(0).trigger('emphasis');
    };
 
    /**
     * Downplay symbol
     */
    symbolProto.downplay = function () {
        this.childAt(0).trigger('normal');
    };
 
    /**
     * @param {number} zlevel
     * @param {number} z
     */
    symbolProto.setZ = function (zlevel, z) {
        var symbolPath = this.childAt(0);
        symbolPath.zlevel = zlevel;
        symbolPath.z = z;
    };
 
    symbolProto.setDraggable = function (draggable) {
        var symbolPath = this.childAt(0);
        symbolPath.draggable = draggable;
        symbolPath.cursor = draggable ? 'move' : 'pointer';
    };
 
    /**
     * Update symbol properties
     * @param  {module:echarts/data/List} data
     * @param  {number} idx
     */
    symbolProto.updateData = function (data, idx, seriesScope) {
        this.silent = false;
 
        var symbolType = data.getItemVisual(idx, 'symbol') || 'circle';
        var seriesModel = data.hostModel;
        var symbolSize = getSymbolSize(data, idx);
 
        if (symbolType !== this._symbolType) {
            this._createSymbol(symbolType, data, idx, symbolSize);
        }
        else {
            var symbolPath = this.childAt(0);
            symbolPath.silent = false;
            graphic.updateProps(symbolPath, {
                scale: getScale(symbolSize)
            }, seriesModel, idx);
        }
        this._updateCommon(data, idx, symbolSize, seriesScope);
        this._seriesModel = seriesModel;
    };
 
    // Update common properties
    var normalStyleAccessPath = ['itemStyle', 'normal'];
    var emphasisStyleAccessPath = ['itemStyle', 'emphasis'];
    var normalLabelAccessPath = ['label', 'normal'];
    var emphasisLabelAccessPath = ['label', 'emphasis'];
 
    symbolProto._updateCommon = function (data, idx, symbolSize, seriesScope) {
        var symbolPath = this.childAt(0);
        var seriesModel = data.hostModel;
        var color = data.getItemVisual(idx, 'color');
 
        // Reset style
        if (symbolPath.type !== 'image') {
            symbolPath.useStyle({
                strokeNoScale: true
            });
        }
 
        seriesScope = seriesScope || null;
 
        var itemStyle = seriesScope && seriesScope.itemStyle;
        var hoverItemStyle = seriesScope && seriesScope.hoverItemStyle;
        var symbolRotate = seriesScope && seriesScope.symbolRotate;
        var symbolOffset = seriesScope && seriesScope.symbolOffset;
        var labelModel = seriesScope && seriesScope.labelModel;
        var hoverLabelModel = seriesScope && seriesScope.hoverLabelModel;
        var hoverAnimation = seriesScope && seriesScope.hoverAnimation;
 
        if (!seriesScope || data.hasItemOption) {
            var itemModel = data.getItemModel(idx);
 
            // Color must be excluded.
            // Because symbol provide setColor individually to set fill and stroke
            itemStyle = itemModel.getModel(normalStyleAccessPath).getItemStyle(['color']);
            hoverItemStyle = itemModel.getModel(emphasisStyleAccessPath).getItemStyle();
 
            symbolRotate = itemModel.getShallow('symbolRotate');
            symbolOffset = itemModel.getShallow('symbolOffset');
 
            labelModel = itemModel.getModel(normalLabelAccessPath);
            hoverLabelModel = itemModel.getModel(emphasisLabelAccessPath);
            hoverAnimation = itemModel.getShallow('hoverAnimation');
        }
        else {
            hoverItemStyle = zrUtil.extend({}, hoverItemStyle);
        }
 
        var elStyle = symbolPath.style;
 
        symbolPath.attr('rotation', (symbolRotate || 0) * Math.PI / 180 || 0);
 
        if (symbolOffset) {
            symbolPath.attr('position', [
                numberUtil.parsePercent(symbolOffset[0], symbolSize[0]),
                numberUtil.parsePercent(symbolOffset[1], symbolSize[1])
            ]);
        }
 
        // PENDING setColor before setStyle!!!
        symbolPath.setColor(color);
 
        symbolPath.setStyle(itemStyle);
 
        var opacity = data.getItemVisual(idx, 'opacity');
        if (opacity != null) {
            elStyle.opacity = opacity;
        }
 
        // Get last value dim
        var dimensions = data.dimensions.slice();
        var valueDim;
        var dataType;
        while (dimensions.length && (
            valueDim = dimensions.pop(),
            dataType = data.getDimensionInfo(valueDim).type,
            dataType === 'ordinal' || dataType === 'time'
        )) {} // jshint ignore:line
 
        if (valueDim != null && labelModel.getShallow('show')) {
            graphic.setText(elStyle, labelModel, color);
            elStyle.text = zrUtil.retrieve(
                seriesModel.getFormattedLabel(idx, 'normal'),
                data.get(valueDim, idx)
            );
        }
        else {
            elStyle.text = '';
        }
 
        if (valueDim != null && hoverLabelModel.getShallow('show')) {
            graphic.setText(hoverItemStyle, hoverLabelModel, color);
            hoverItemStyle.text = zrUtil.retrieve(
                seriesModel.getFormattedLabel(idx, 'emphasis'),
                data.get(valueDim, idx)
            );
        }
        else {
            hoverItemStyle.text = '';
        }
 
        symbolPath.off('mouseover')
            .off('mouseout')
            .off('emphasis')
            .off('normal');
 
        symbolPath.hoverStyle = hoverItemStyle;
 
        graphic.setHoverStyle(symbolPath);
 
        var scale = getScale(symbolSize);
 
        if (hoverAnimation && seriesModel.isAnimationEnabled()) {
            var onEmphasis = function() {
                var ratio = scale[1] / scale[0];
                this.animateTo({
                    scale: [
                        Math.max(scale[0] * 1.1, scale[0] + 3),
                        Math.max(scale[1] * 1.1, scale[1] + 3 * ratio)
                    ]
                }, 400, 'elasticOut');
            };
            var onNormal = function() {
                this.animateTo({
                    scale: scale
                }, 400, 'elasticOut');
            };
            symbolPath.on('mouseover', onEmphasis)
                .on('mouseout', onNormal)
                .on('emphasis', onEmphasis)
                .on('normal', onNormal);
        }
    };
 
    symbolProto.fadeOut = function (cb) {
        var symbolPath = this.childAt(0);
        // Avoid mistaken hover when fading out
        this.silent = symbolPath.silent = true;
        // Not show text when animating
        symbolPath.style.text = '';
        graphic.updateProps(symbolPath, {
            scale: [0, 0]
        }, this._seriesModel, this.dataIndex, cb);
    };
 
    zrUtil.inherits(Symbol, graphic.Group);
 
    module.exports = Symbol;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/SymbolDraw.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/SymbolDraw.js

Statements: 16.67% (9 / 54)      Branches: 0% (0 / 23)      Functions: 0% (0 / 12)      Lines: 16.67% (9 / 54)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128          1 1             1           1   1                           1                                                                                                                           1                     1                                 1    
/**
 * @module echarts/chart/helper/SymbolDraw
 */
 
 
    var graphic = require('../../util/graphic');
    var Symbol = require('./Symbol');
 
    /**
     * @constructor
     * @alias module:echarts/chart/helper/SymbolDraw
     * @param {module:zrender/graphic/Group} [symbolCtor]
     */
    function SymbolDraw(symbolCtor) {
        this.group = new graphic.Group();
 
        this._symbolCtor = symbolCtor || Symbol;
    }
 
    var symbolDrawProto = SymbolDraw.prototype;
 
    function symbolNeedsDraw(data, idx, isIgnore) {
        var point = data.getItemLayout(idx);
        // Is an object
        // if (point && point.hasOwnProperty('point')) {
        //     point = point.point;
        // }
        return point && !isNaN(point[0]) && !isNaN(point[1]) && !(isIgnore && isIgnore(idx))
                    && data.getItemVisual(idx, 'symbol') !== 'none';
    }
    /**
     * Update symbols draw by new data
     * @param {module:echarts/data/List} data
     * @param {Array.<boolean>} [isIgnore]
     */
    symbolDrawProto.updateData = function (data, isIgnore) {
        var group = this.group;
        var seriesModel = data.hostModel;
        var oldData = this._data;
 
        var SymbolCtor = this._symbolCtor;
 
        var seriesScope = {
            itemStyle: seriesModel.getModel('itemStyle.normal').getItemStyle(['color']),
            hoverItemStyle: seriesModel.getModel('itemStyle.emphasis').getItemStyle(),
            symbolRotate: seriesModel.get('symbolRotate'),
            symbolOffset: seriesModel.get('symbolOffset'),
            hoverAnimation: seriesModel.get('hoverAnimation'),
 
            labelModel: seriesModel.getModel('label.normal'),
            hoverLabelModel: seriesModel.getModel('label.emphasis')
        };
 
        data.diff(oldData)
            .add(function (newIdx) {
                var point = data.getItemLayout(newIdx);
                if (symbolNeedsDraw(data, newIdx, isIgnore)) {
                    var symbolEl = new SymbolCtor(data, newIdx, seriesScope);
                    symbolEl.attr('position', point);
                    data.setItemGraphicEl(newIdx, symbolEl);
                    group.add(symbolEl);
                }
            })
            .update(function (newIdx, oldIdx) {
                var symbolEl = oldData.getItemGraphicEl(oldIdx);
                var point = data.getItemLayout(newIdx);
                if (!symbolNeedsDraw(data, newIdx, isIgnore)) {
                    group.remove(symbolEl);
                    return;
                }
                if (!symbolEl) {
                    symbolEl = new SymbolCtor(data, newIdx);
                    symbolEl.attr('position', point);
                }
                else {
                    symbolEl.updateData(data, newIdx, seriesScope);
                    graphic.updateProps(symbolEl, {
                        position: point
                    }, seriesModel);
                }
 
                // Add back
                group.add(symbolEl);
 
                data.setItemGraphicEl(newIdx, symbolEl);
            })
            .remove(function (oldIdx) {
                var el = oldData.getItemGraphicEl(oldIdx);
                el && el.fadeOut(function () {
                    group.remove(el);
                });
            })
            .execute();
 
        this._data = data;
    };
 
    symbolDrawProto.updateLayout = function () {
        var data = this._data;
        if (data) {
            // Not use animation
            data.eachItemGraphicEl(function (el, idx) {
                var point = data.getItemLayout(idx);
                el.attr('position', point);
            });
        }
    };
 
    symbolDrawProto.remove = function (enableAnimation) {
        var group = this.group;
        var data = this._data;
        if (data) {
            if (enableAnimation) {
                data.eachItemGraphicEl(function (el) {
                    el.fadeOut(function () {
                        group.remove(el);
                    });
                });
            }
            else {
                group.removeAll();
            }
        }
    };
 
    module.exports = SymbolDraw;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/WhiskerBoxDraw.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/WhiskerBoxDraw.js

Statements: 20.51% (16 / 78)      Branches: 0% (0 / 24)      Functions: 0% (0 / 16)      Lines: 20.51% (16 / 78)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216          1 1 1   1                                                   1                                                             1   1                                                         1               1                           1                                       1             1         1           1                                                                                             1                 1    
/**
 * @module echarts/chart/helper/Symbol
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
    var graphic = require('../../util/graphic');
    var Path = require('zrender/lib/graphic/Path');
 
    var WhiskerPath = Path.extend({
 
        type: 'whiskerInBox',
 
        shape: {},
 
        buildPath: function (ctx, shape) {
            for (var i in shape) {
                if (shape.hasOwnProperty(i) && i.indexOf('ends') === 0) {
                    var pts = shape[i];
                    ctx.moveTo(pts[0][0], pts[0][1]);
                    ctx.lineTo(pts[1][0], pts[1][1]);
                }
            }
        }
    });
 
    /**
     * @constructor
     * @alias {module:echarts/chart/helper/WhiskerBox}
     * @param {module:echarts/data/List} data
     * @param {number} idx
     * @param {Function} styleUpdater
     * @param {boolean} isInit
     * @extends {module:zrender/graphic/Group}
     */
    function WhiskerBox(data, idx, styleUpdater, isInit) {
        graphic.Group.call(this);
 
        /**
         * @type {number}
         * @readOnly
         */
        this.bodyIndex;
 
        /**
         * @type {number}
         * @readOnly
         */
        this.whiskerIndex;
 
        /**
         * @type {Function}
         */
        this.styleUpdater = styleUpdater;
 
        this._createContent(data, idx, isInit);
 
        this.updateData(data, idx, isInit);
 
        /**
         * Last series model.
         * @type {module:echarts/model/Series}
         */
        this._seriesModel;
    }
 
    var whiskerBoxProto = WhiskerBox.prototype;
 
    whiskerBoxProto._createContent = function (data, idx, isInit) {
        var itemLayout = data.getItemLayout(idx);
        var constDim = itemLayout.chartLayout === 'horizontal' ? 1 : 0;
        var count = 0;
 
        // Whisker element.
        this.add(new graphic.Polygon({
            shape: {
                points: isInit
                    ? transInit(itemLayout.bodyEnds, constDim, itemLayout)
                    : itemLayout.bodyEnds
            },
            style: {strokeNoScale: true},
            z2: 100
        }));
        this.bodyIndex = count++;
 
        // Box element.
        var whiskerEnds = zrUtil.map(itemLayout.whiskerEnds, function (ends) {
            return isInit ? transInit(ends, constDim, itemLayout) : ends;
        });
        this.add(new WhiskerPath({
            shape: makeWhiskerEndsShape(whiskerEnds),
            style: {strokeNoScale: true},
            z2: 100
        }));
        this.whiskerIndex = count++;
    };
 
    function transInit(points, dim, itemLayout) {
        return zrUtil.map(points, function (point) {
            point = point.slice();
            point[dim] = itemLayout.initBaseline;
            return point;
        });
    }
 
    function makeWhiskerEndsShape(whiskerEnds) {
        // zr animation only support 2-dim array.
        var shape = {};
        zrUtil.each(whiskerEnds, function (ends, i) {
            shape['ends' + i] = ends;
        });
        return shape;
    }
 
    /**
     * Update symbol properties
     * @param  {module:echarts/data/List} data
     * @param  {number} idx
     */
    whiskerBoxProto.updateData = function (data, idx, isInit) {
        var seriesModel = this._seriesModel = data.hostModel;
        var itemLayout = data.getItemLayout(idx);
        var updateMethod = graphic[isInit ? 'initProps' : 'updateProps'];
        // this.childAt(this.bodyIndex).stopAnimation(true);
        // this.childAt(this.whiskerIndex).stopAnimation(true);
        updateMethod(
            this.childAt(this.bodyIndex),
            {shape: {points: itemLayout.bodyEnds}},
            seriesModel, idx
        );
        updateMethod(
            this.childAt(this.whiskerIndex),
            {shape: makeWhiskerEndsShape(itemLayout.whiskerEnds)},
            seriesModel, idx
        );
 
        this.styleUpdater.call(null, this, data, idx);
    };
 
    zrUtil.inherits(WhiskerBox, graphic.Group);
 
 
    /**
     * @constructor
     * @alias module:echarts/chart/helper/WhiskerBoxDraw
     */
    function WhiskerBoxDraw(styleUpdater) {
        this.group = new graphic.Group();
        this.styleUpdater = styleUpdater;
    }
 
    var whiskerBoxDrawProto = WhiskerBoxDraw.prototype;
 
    /**
     * Update symbols draw by new data
     * @param {module:echarts/data/List} data
     */
    whiskerBoxDrawProto.updateData = function (data) {
        var group = this.group;
        var oldData = this._data;
        var styleUpdater = this.styleUpdater;
 
        data.diff(oldData)
            .add(function (newIdx) {
                if (data.hasValue(newIdx)) {
                    var symbolEl = new WhiskerBox(data, newIdx, styleUpdater, true);
                    data.setItemGraphicEl(newIdx, symbolEl);
                    group.add(symbolEl);
                }
            })
            .update(function (newIdx, oldIdx) {
                var symbolEl = oldData.getItemGraphicEl(oldIdx);
 
                // Empty data
                if (!data.hasValue(newIdx)) {
                    group.remove(symbolEl);
                    return;
                }
 
                if (!symbolEl) {
                    symbolEl = new WhiskerBox(data, newIdx, styleUpdater);
                }
                else {
                    symbolEl.updateData(data, newIdx);
                }
 
                // Add back
                group.add(symbolEl);
 
                data.setItemGraphicEl(newIdx, symbolEl);
            })
            .remove(function (oldIdx) {
                var el = oldData.getItemGraphicEl(oldIdx);
                el && group.remove(el);
            })
            .execute();
 
        this._data = data;
    };
 
    /**
     * Remove symbols.
     * @param {module:echarts/data/List} data
     */
    whiskerBoxDrawProto.remove = function () {
        var group = this.group;
        var data = this._data;
        this._data = null;
        data && data.eachItemGraphicEl(function (el) {
            el && group.remove(el);
        });
    };
 
    module.exports = WhiskerBoxDraw;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/createGraphFromNodeEdge.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/createGraphFromNodeEdge.js

Statements: 22.22% (8 / 36)      Branches: 0% (0 / 14)      Functions: 0% (0 / 1)      Lines: 22.22% (8 / 36)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71    1 1 1 1 1 1 1   1                                                                                                                        
 
 
    var List = require('../../data/List');
    var Graph = require('../../data/Graph');
    var linkList = require('../../data/helper/linkList');
    var completeDimensions = require('../../data/helper/completeDimensions');
    var CoordinateSystem = require('../../CoordinateSystem');
    var zrUtil = require('zrender/lib/core/util');
    var createListFromArray = require('./createListFromArray');
 
    module.exports = function (nodes, edges, hostModel, directed, beforeLink) {
        var graph = new Graph(directed);
        for (var i = 0; i < nodes.length; i++) {
            graph.addNode(zrUtil.retrieve(
                // Id, name, dataIndex
                nodes[i].id, nodes[i].name, i
            ), i);
        }
 
        var linkNameList = [];
        var validEdges = [];
        var linkCount = 0;
        for (var i = 0; i < edges.length; i++) {
            var link = edges[i];
            var source = link.source;
            var target = link.target;
            // addEdge may fail when source or target not exists
            if (graph.addEdge(source, target, linkCount)) {
                validEdges.push(link);
                linkNameList.push(zrUtil.retrieve(link.id, source + ' > ' + target));
                linkCount++;
            }
        }
 
        var coordSys = hostModel.get('coordinateSystem');
        var nodeData;
        if (coordSys === 'cartesian2d' || coordSys === 'polar') {
            nodeData = createListFromArray(nodes, hostModel, hostModel.ecModel);
        }
        else {
            // FIXME
            var coordSysCtor = CoordinateSystem.get(coordSys);
            // FIXME
            var dimensionNames = completeDimensions(
                ((coordSysCtor && coordSysCtor.type !== 'view') ? (coordSysCtor.dimensions || []) : []).concat(['value']),
                nodes
            );
            nodeData = new List(dimensionNames, hostModel);
            nodeData.initData(nodes);
        }
 
        var edgeData = new List(['value'], hostModel);
        edgeData.initData(validEdges, linkNameList);
 
        beforeLink && beforeLink(nodeData, edgeData);
 
        linkList({
            mainData: nodeData,
            struct: graph,
            structAttr: 'graph',
            datas: {node: nodeData, edge: edgeData},
            datasAttr: {node: 'data', edge: 'edgeData'}
        });
 
        // Update dataIndex of nodes and edges because invalid edge may be removed
        graph.update();
 
        return graph;
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/createGraphFromNodeMatrix.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/createGraphFromNodeMatrix.js

Statements: 21.05% (8 / 38)      Branches: 0% (0 / 14)      Functions: 0% (0 / 1)      Lines: 21.05% (8 / 38)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93    1 1 1 1 1 1 1                                       1                                                                                                                                
 
 
    var List = require('../../data/List');
    var Graph = require('../../data/Graph');
    var linkList = require('../../data/helper/linkList');
    var completeDimensions = require('../../data/helper/completeDimensions');
    var CoordinateSystem = require('../../CoordinateSystem');
    var zrUtil = require('zrender/lib/core/util');
    var createListFromArray = require('./createListFromArray');
 
    /**
     * 从邻接矩阵生成
     * ```
     *        TARGET
     *    -1--2--3--4--5-
     *  1| x  x  x  x  x
     *  2| x  x  x  x  x
     *  3| x  x  x  x  x  SOURCE
     *  4| x  x  x  x  x
     *  5| x  x  x  x  x
     * ```
     *
     * @param {Array.<Object>} nodes 节点信息
     * @param {Array} matrix 邻接矩阵
     * @param {module:echarts/model/Series}
     * @param {boolean} directed 是否是有向图
     * @return {module:echarts/data/Graph}
     */
    module.exports = function (nodes, matrix, hostModel, directed) {
        var graph = new Graph(directed);
        for (var i = 0; i < nodes.length; i++) {
            graph.addNode(zrUtil.retrieve(
                // Id, name, dataIndex
                nodes[i].id, nodes[i].name, i
            ), i);
        }
 
        var size = matrix.length;
        var links = [];
        var linkCount = 0;
        for (var i = 0; i < size; i++) {
            for (var j = 0; j < size; j++) {
                var val = matrix[i][j];
                if (val === 0) {
                    continue;
                }
                var n1 = graph.nodes[i];
                var n2 = graph.nodes[j];
                var edge = graph.addEdge(n1, n2, linkCount);
                if (edge) {
                    linkCount++;
                    links.push({
                        value: val
                    });
                }
            }
        }
 
        var coordSys = hostModel.get('coordinateSystem');
        var nodeData;
        if (coordSys === 'cartesian2d' || coordSys === 'polar') {
            nodeData = createListFromArray(nodes, hostModel, hostModel.ecModel);
        }
        else {
            // FIXME
            var coordSysCtor = CoordinateSystem.get(coordSys);
            // FIXME
            var dimensionNames = completeDimensions(
                ((coordSysCtor && coordSysCtor.type !== 'view') ? (coordSysCtor.dimensions || []) : []).concat(['value']),
                nodes
            );
            nodeData = new List(dimensionNames, hostModel);
            nodeData.initData(nodes);
        }
        var edgeData = new List(['value'], hostModel);
 
        edgeData.initData(links);
 
        linkList({
            mainData: nodeData,
            struct: graph,
            structAttr: 'graph',
            datas: {node: nodeData, edge: edgeData},
            datasAttr: {node: 'data', edge: 'edgeData'}
        });
 
        // Update dataIndex of nodes and edges because invalid edge may be removed
        graph.update();
 
        return graph;
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/createListFromArray.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/createListFromArray.js

Statements: 11.81% (15 / 127)      Branches: 0% (0 / 105)      Functions: 0% (0 / 13)      Lines: 11.81% (15 / 127)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324      1 1 1 1 1 1 1   1             1                 1                                                                                                                                                       1       1                     1                                                                                                                                                                                                                                                                                                                                                 1                                                                 1      
'use strict';
 
 
    var List = require('../../data/List');
    var completeDimensions = require('../../data/helper/completeDimensions');
    var zrUtil = require('zrender/lib/core/util');
    var modelUtil = require('../../util/model');
    var CoordinateSystem = require('../../CoordinateSystem');
    var getDataItemValue = modelUtil.getDataItemValue;
    var converDataValue = modelUtil.converDataValue;
 
    function firstDataNotNull(data) {
        var i = 0;
        while (i < data.length && data[i] == null) {
            i++;
        }
        return data[i];
    }
    function ifNeedCompleteOrdinalData(data) {
        var sampleItem = firstDataNotNull(data);
        return sampleItem != null
            && !zrUtil.isArray(getDataItemValue(sampleItem));
    }
 
    /**
     * Helper function to create a list from option data
     */
    function createListFromArray(data, seriesModel, ecModel) {
        // If data is undefined
        data = data || [];
 
        if (__DEV__) {
            if (!zrUtil.isArray(data)) {
                throw new Error('Invalid data.');
            }
        }
 
        var coordSysName = seriesModel.get('coordinateSystem');
        var creator = creators[coordSysName];
        var registeredCoordSys = CoordinateSystem.get(coordSysName);
        // FIXME
        var axesInfo = creator && creator(data, seriesModel, ecModel);
        var dimensions = axesInfo && axesInfo.dimensions;
        if (!dimensions) {
            // Get dimensions from registered coordinate system
            dimensions = (registeredCoordSys && (
                registeredCoordSys.getDimensionsInfo
                    ? registeredCoordSys.getDimensionsInfo()
                    : registeredCoordSys.dimensions.slice()
            )) || ['x', 'y'];
            dimensions = completeDimensions(dimensions, data, {defaultNames: dimensions.concat(['value'])});
        }
 
        var categoryIndex = axesInfo ? axesInfo.categoryIndex : -1;
 
        var list = new List(dimensions, seriesModel);
 
        var nameList = createNameList(axesInfo, data);
 
        var categories = {};
        var dimValueGetter = (categoryIndex >= 0 && ifNeedCompleteOrdinalData(data))
            ? function (itemOpt, dimName, dataIndex, dimIndex) {
                // If any dataItem is like { value: 10 }
                if (modelUtil.isDataItemOption(itemOpt)) {
                    list.hasItemOption = true;
                }
 
                // Use dataIndex as ordinal value in categoryAxis
                return dimIndex === categoryIndex
                    ? dataIndex
                    : converDataValue(getDataItemValue(itemOpt), dimensions[dimIndex]);
            }
            : function (itemOpt, dimName, dataIndex, dimIndex) {
                var value = getDataItemValue(itemOpt);
                var val = converDataValue(value && value[dimIndex], dimensions[dimIndex]);
                // If any dataItem is like { value: 10 }
                if (modelUtil.isDataItemOption(itemOpt)) {
                    list.hasItemOption = true;
                }
 
                var categoryAxesModels = axesInfo && axesInfo.categoryAxesModels;
                if (categoryAxesModels && categoryAxesModels[dimName]) {
                    // If given value is a category string
                    if (typeof val === 'string') {
                        // Lazy get categories
                        categories[dimName] = categories[dimName]
                            || categoryAxesModels[dimName].getCategories();
                        val = zrUtil.indexOf(categories[dimName], val);
                        if (val < 0 && !isNaN(val)) {
                            // In case some one write '1', '2' istead of 1, 2
                            val = +val;
                        }
                    }
                }
                return val;
            };
 
        list.hasItemOption = false;
        list.initData(data, nameList, dimValueGetter);
 
        return list;
    }
 
    function isStackable(axisType) {
        return axisType !== 'category' && axisType !== 'time';
    }
 
    function getDimTypeByAxis(axisType) {
        return axisType === 'category'
            ? 'ordinal'
            : axisType === 'time'
            ? 'time'
            : 'float';
    }
 
    /**
     * Creaters for each coord system.
     */
    var creators = {
 
        cartesian2d: function (data, seriesModel, ecModel) {
 
            var axesModels = zrUtil.map(['xAxis', 'yAxis'], function (name) {
                return ecModel.queryComponents({
                    mainType: name,
                    index: seriesModel.get(name + 'Index'),
                    id: seriesModel.get(name + 'Id')
                })[0];
            });
            var xAxisModel = axesModels[0];
            var yAxisModel = axesModels[1];
 
            if (__DEV__) {
                if (!xAxisModel) {
                    throw new Error('xAxis "' + zrUtil.retrieve(
                        seriesModel.get('xAxisIndex'),
                        seriesModel.get('xAxisId'),
                        0
                    ) + '" not found');
                }
                if (!yAxisModel) {
                    throw new Error('yAxis "' + zrUtil.retrieve(
                        seriesModel.get('xAxisIndex'),
                        seriesModel.get('yAxisId'),
                        0
                    ) + '" not found');
                }
            }
 
            var xAxisType = xAxisModel.get('type');
            var yAxisType = yAxisModel.get('type');
 
            var dimensions = [
                {
                    name: 'x',
                    type: getDimTypeByAxis(xAxisType),
                    stackable: isStackable(xAxisType)
                },
                {
                    name: 'y',
                    // If two category axes
                    type: getDimTypeByAxis(yAxisType),
                    stackable: isStackable(yAxisType)
                }
            ];
 
            var isXAxisCateogry = xAxisType === 'category';
            var isYAxisCategory = yAxisType === 'category';
 
            completeDimensions(dimensions, data, {defaultNames: ['x', 'y', 'z']});
 
            var categoryAxesModels = {};
            if (isXAxisCateogry) {
                categoryAxesModels.x = xAxisModel;
            }
            if (isYAxisCategory) {
                categoryAxesModels.y = yAxisModel;
            }
            return {
                dimensions: dimensions,
                categoryIndex: isXAxisCateogry ? 0 : (isYAxisCategory ? 1 : -1),
                categoryAxesModels: categoryAxesModels
            };
        },
 
        singleAxis: function (data, seriesModel, ecModel) {
 
            var singleAxisModel = ecModel.queryComponents({
                mainType: 'singleAxis',
                index: seriesModel.get('singleAxisIndex'),
                id: seriesModel.get('singleAxisId')
            })[0];
 
            if (__DEV__) {
                if (!singleAxisModel) {
                    throw new Error('singleAxis should be specified.');
                }
            }
 
            var singleAxisType = singleAxisModel.get('type');
            var isCategory = singleAxisType === 'category';
 
            var dimensions = [{
                name: 'single',
                type: getDimTypeByAxis(singleAxisType),
                stackable: isStackable(singleAxisType)
            }];
 
            completeDimensions(dimensions, data);
 
            var categoryAxesModels = {};
            if (isCategory) {
                categoryAxesModels.single = singleAxisModel;
            }
 
            return {
                dimensions: dimensions,
                categoryIndex: isCategory ? 0 : -1,
                categoryAxesModels: categoryAxesModels
            };
        },
 
        polar: function (data, seriesModel, ecModel) {
            var polarModel = ecModel.queryComponents({
                mainType: 'polar',
                index: seriesModel.get('polarIndex'),
                id: seriesModel.get('polarId')
            })[0];
 
            var angleAxisModel = polarModel.findAxisModel('angleAxis');
            var radiusAxisModel = polarModel.findAxisModel('radiusAxis');
 
            if (__DEV__) {
                if (!angleAxisModel) {
                    throw new Error('angleAxis option not found');
                }
                if (!radiusAxisModel) {
                    throw new Error('radiusAxis option not found');
                }
            }
 
            var radiusAxisType = radiusAxisModel.get('type');
            var angleAxisType = angleAxisModel.get('type');
 
            var dimensions = [
                {
                    name: 'radius',
                    type: getDimTypeByAxis(radiusAxisType),
                    stackable: isStackable(radiusAxisType)
                },
                {
                    name: 'angle',
                    type: getDimTypeByAxis(angleAxisType),
                    stackable: isStackable(angleAxisType)
                }
            ];
            var isAngleAxisCateogry = angleAxisType === 'category';
            var isRadiusAxisCateogry = radiusAxisType === 'category';
 
            completeDimensions(dimensions, data, {defaultNames: ['radius', 'angle', 'value']});
 
            var categoryAxesModels = {};
            if (isRadiusAxisCateogry) {
                categoryAxesModels.radius = radiusAxisModel;
            }
            if (isAngleAxisCateogry) {
                categoryAxesModels.angle = angleAxisModel;
            }
            return {
                dimensions: dimensions,
                categoryIndex: isAngleAxisCateogry ? 1 : (isRadiusAxisCateogry ? 0 : -1),
                categoryAxesModels: categoryAxesModels
            };
        },
 
        geo: function (data, seriesModel, ecModel) {
            // TODO Region
            // 多个散点图系列在同一个地区的时候
            return {
                dimensions: completeDimensions([
                    {name: 'lng'},
                    {name: 'lat'}
                ], data, {defaultNames: ['lng', 'lat', 'value']})
            };
        }
    };
 
    function createNameList(result, data) {
        var nameList = [];
 
        var categoryDim = result && result.dimensions[result.categoryIndex];
        var categoryAxisModel;
        if (categoryDim) {
            categoryAxisModel = result.categoryAxesModels[categoryDim.name];
        }
 
        if (categoryAxisModel) {
            // FIXME Two category axis
            var categories = categoryAxisModel.getCategories();
            if (categories) {
                var dataLen = data.length;
                // Ordered data is given explicitly like
                // [[3, 0.2], [1, 0.3], [2, 0.15]]
                // or given scatter data,
                // pick the category
                if (zrUtil.isArray(data[0]) && data[0].length > 1) {
                    nameList = [];
                    for (var i = 0; i < dataLen; i++) {
                        nameList[i] = categories[data[i][result.categoryIndex || 0]];
                    }
                }
                else {
                    nameList = categories.slice(0);
                }
            }
        }
 
        return nameList;
    }
 
    module.exports = createListFromArray;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/whiskerBoxCommon.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/helper/whiskerBoxCommon.js

Statements: 16.33% (8 / 49)      Branches: 0% (0 / 18)      Functions: 0% (0 / 10)      Lines: 16.33% (8 / 49)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140      1 1 1 1   1       1                                                                                                                                                                                                     1                                             1          
'use strict';
 
 
    var List = require('../../data/List');
    var completeDimensions = require('../../data/helper/completeDimensions');
    var WhiskerBoxDraw = require('../helper/WhiskerBoxDraw');
    var zrUtil = require('zrender/lib/core/util');
 
    function getItemValue(item) {
        return item.value == null ? item : item.value;
    }
 
    var seriesModelMixin = {
 
        /**
         * @private
         * @type {string}
         */
        _baseAxisDim: null,
 
        /**
         * @override
         */
        getInitialData: function (option, ecModel) {
            // When both types of xAxis and yAxis are 'value', layout is
            // needed to be specified by user. Otherwise, layout can be
            // judged by which axis is category.
 
            var categories;
 
            var xAxisModel = ecModel.getComponent('xAxis', this.get('xAxisIndex'));
            var yAxisModel = ecModel.getComponent('yAxis', this.get('yAxisIndex'));
            var xAxisType = xAxisModel.get('type');
            var yAxisType = yAxisModel.get('type');
            var addOrdinal;
 
            // FIXME
            // 考虑时间轴
 
            if (xAxisType === 'category') {
                option.layout = 'horizontal';
                categories = xAxisModel.getCategories();
                addOrdinal = true;
            }
            else if (yAxisType  === 'category') {
                option.layout = 'vertical';
                categories = yAxisModel.getCategories();
                addOrdinal = true;
            }
            else {
                option.layout = option.layout || 'horizontal';
            }
 
            this._baseAxisDim = option.layout === 'horizontal' ? 'x' : 'y';
 
            var data = option.data;
            var dimensions = this.dimensions = ['base'].concat(this.valueDimensions);
            completeDimensions(dimensions, data);
 
            var list = new List(dimensions, this);
            list.initData(data, categories ? categories.slice() : null, function (dataItem, dimName, idx, dimIdx) {
                var value = getItemValue(dataItem);
                return addOrdinal ? (dimName === 'base' ? idx : value[dimIdx - 1]) : value[dimIdx];
            });
 
            return list;
        },
 
        /**
         * Used by Gird.
         * @param {string} axisDim 'x' or 'y'
         * @return {Array.<string>} dimensions on the axis.
         */
        coordDimToDataDim: function (axisDim) {
            var dims = this.valueDimensions.slice();
            var baseDim = ['base'];
            var map = {
                horizontal: {x: baseDim, y: dims},
                vertical: {x: dims, y: baseDim}
            };
            return map[this.get('layout')][axisDim];
        },
 
        /**
         * @override
         * @param {string|number} dataDim
         * @return {string} coord dimension
         */
        dataDimToCoordDim: function (dataDim) {
            var dim;
 
            zrUtil.each(['x', 'y'], function (coordDim, index) {
                var dataDims = this.coordDimToDataDim(coordDim);
                if (zrUtil.indexOf(dataDims, dataDim) >= 0) {
                    dim = coordDim;
                }
            }, this);
 
            return dim;
        },
 
        /**
         * If horizontal, base axis is x, otherwise y.
         * @override
         */
        getBaseAxis: function () {
            var dim = this._baseAxisDim;
            return this.ecModel.getComponent(dim + 'Axis', this.get(dim + 'AxisIndex')).axis;
        }
    };
 
    var viewMixin = {
 
        init: function () {
            /**
             * Old data.
             * @private
             * @type {module:echarts/chart/helper/WhiskerBoxDraw}
             */
            var whiskerBoxDraw = this._whiskerBoxDraw = new WhiskerBoxDraw(
                this.getStyleUpdater()
            );
            this.group.add(whiskerBoxDraw.group);
        },
 
        render: function (seriesModel, ecModel, api) {
            this._whiskerBoxDraw.updateData(seriesModel.getData());
        },
 
        remove: function (ecModel) {
            this._whiskerBoxDraw.remove();
        }
    };
 
    module.exports = {
        seriesModelMixin: seriesModelMixin,
        viewMixin: viewMixin
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/line/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/line/

Statements: 7.74% (39 / 504)      Branches: 0% (0 / 257)      Functions: 0% (0 / 41)      Lines: 7.8% (39 / 500)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/chart/line/
File Statements Branches Functions Lines
LineSeries.js 37.5% (3 / 8) 0% (0 / 6) 0% (0 / 1) 37.5% (3 / 8)
LineView.js 6.25% (19 / 304) 0% (0 / 168) 0% (0 / 27) 6.25% (19 / 304)
lineAnimationDiff.js 4.82% (4 / 83) 0% (0 / 23) 0% (0 / 8) 4.82% (4 / 83)
poly.js 11.93% (13 / 109) 0% (0 / 60) 0% (0 / 5) 12.38% (13 / 105)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/line/LineSeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/line/LineSeries.js

Statements: 37.5% (3 / 8)      Branches: 0% (0 / 6)      Functions: 0% (0 / 1)      Lines: 37.5% (3 / 8)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87      1 1   1                                                                                                                                                                
'use strict';
 
 
    var createListFromArray = require('../helper/createListFromArray');
    var SeriesModel = require('../../model/Series');
 
    module.exports = SeriesModel.extend({
 
        type: 'series.line',
 
        dependencies: ['grid', 'polar'],
 
        getInitialData: function (option, ecModel) {
            if (__DEV__) {
                var coordSys = option.coordinateSystem;
                if (coordSys !== 'polar' && coordSys !== 'cartesian2d') {
                    throw new Error('Line not support coordinateSystem besides cartesian and polar');
                }
            }
            return createListFromArray(option.data, this, ecModel);
        },
 
        defaultOption: {
            zlevel: 0,                  // 一级层叠
            z: 2,                       // 二级层叠
            coordinateSystem: 'cartesian2d',
            legendHoverLink: true,
 
            hoverAnimation: true,
            // stack: null
            // xAxisIndex: 0,
            // yAxisIndex: 0,
 
            // polarIndex: 0,
 
            // If clip the overflow value
            clipOverflow: true,
 
            label: {
                normal: {
                    position: 'top'
                }
            },
            // itemStyle: {
            //     normal: {},
            //     emphasis: {}
            // },
            lineStyle: {
                normal: {
                    width: 2,
                    type: 'solid'
                }
            },
            // areaStyle: {},
            // false, 'start', 'end', 'middle'
            step: false,
 
            // Disabled if step is true
            smooth: false,
            smoothMonotone: null,
            // 拐点图形类型
            symbol: 'emptyCircle',
            // 拐点图形大小
            symbolSize: 4,
            // 拐点图形旋转控制
            symbolRotate: null,
 
            // 是否显示 symbol, 只有在 tooltip hover 的时候显示
            showSymbol: true,
            // 标志图形默认只有主轴显示(随主轴标签间隔隐藏策略)
            showAllSymbol: false,
 
            // 是否连接断点
            connectNulls: false,
 
            // 数据过滤,'average', 'max', 'min', 'sum'
            sampling: 'none',
 
            animationEasing: 'linear',
 
            // Disable progressive
            progressive: 0,
            hoverLayerThreshold: Infinity
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/line/LineView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/line/LineView.js

Statements: 6.25% (19 / 304)      Branches: 0% (0 / 168)      Functions: 0% (0 / 27)      Lines: 6.25% (19 / 304)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704        1 1 1 1 1 1 1 1   1                           1       1                       1                 1                                                         1                                                                                     1                                                                 1           1                                                                               1                                                                                                                                                                 1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
'use strict';
// FIXME step not support polar
 
 
    var zrUtil = require('zrender/lib/core/util');
    var SymbolDraw = require('../helper/SymbolDraw');
    var Symbol = require('../helper/Symbol');
    var lineAnimationDiff = require('./lineAnimationDiff');
    var graphic = require('../../util/graphic');
    var modelUtil = require('../../util/model');
    var polyHelper = require('./poly');
    var ChartView = require('../../view/Chart');
 
    function isPointsSame(points1, points2) {
        if (points1.length !== points2.length) {
            return;
        }
        for (var i = 0; i < points1.length; i++) {
            var p1 = points1[i];
            var p2 = points2[i];
            if (p1[0] !== p2[0] || p1[1] !== p2[1]) {
                return;
            }
        }
        return true;
    }
 
    function getSmooth(smooth) {
        return typeof (smooth) === 'number' ? smooth : (smooth ? 0.3 : 0);
    }
 
    function getAxisExtentWithGap(axis) {
        var extent = axis.getGlobalExtent();
        if (axis.onBand) {
            // Remove extra 1px to avoid line miter in clipped edge
            var halfBandWidth = axis.getBandWidth() / 2 - 1;
            var dir = extent[1] > extent[0] ? 1 : -1;
            extent[0] += dir * halfBandWidth;
            extent[1] -= dir * halfBandWidth;
        }
        return extent;
    }
 
    function sign(val) {
        return val >= 0 ? 1 : -1;
    }
    /**
     * @param {module:echarts/coord/cartesian/Cartesian2D|module:echarts/coord/polar/Polar} coordSys
     * @param {module:echarts/data/List} data
     * @param {Array.<Array.<number>>} points
     * @private
     */
    function getStackedOnPoints(coordSys, data) {
        var baseAxis = coordSys.getBaseAxis();
        var valueAxis = coordSys.getOtherAxis(baseAxis);
        var valueStart = baseAxis.onZero
            ? 0 : valueAxis.scale.getExtent()[0];
 
        var valueDim = valueAxis.dim;
 
        var baseDataOffset = valueDim === 'x' || valueDim === 'radius' ? 1 : 0;
 
        return data.mapArray([valueDim], function (val, idx) {
            var stackedOnSameSign;
            var stackedOn = data.stackedOn;
            // Find first stacked value with same sign
            while (stackedOn &&
                sign(stackedOn.get(valueDim, idx)) === sign(val)
            ) {
                stackedOnSameSign = stackedOn;
                break;
            }
            var stackedData = [];
            stackedData[baseDataOffset] = data.get(baseAxis.dim, idx);
            stackedData[1 - baseDataOffset] = stackedOnSameSign
                ? stackedOnSameSign.get(valueDim, idx, true) : valueStart;
 
            return coordSys.dataToPoint(stackedData);
        }, true);
    }
 
    function createGridClipShape(cartesian, hasAnimation, seriesModel) {
        var xExtent = getAxisExtentWithGap(cartesian.getAxis('x'));
        var yExtent = getAxisExtentWithGap(cartesian.getAxis('y'));
        var isHorizontal = cartesian.getBaseAxis().isHorizontal();
 
        var x = Math.min(xExtent[0], xExtent[1]);
        var y = Math.min(yExtent[0], yExtent[1]);
        var width = Math.max(xExtent[0], xExtent[1]) - x;
        var height = Math.max(yExtent[0], yExtent[1]) - y;
        var lineWidth = seriesModel.get('lineStyle.normal.width') || 2;
        // Expand clip shape to avoid clipping when line value exceeds axis
        var expandSize = seriesModel.get('clipOverflow') ? lineWidth / 2 : Math.max(width, height);
        if (isHorizontal) {
            y -= expandSize;
            height += expandSize * 2;
        }
        else {
            x -= expandSize;
            width += expandSize * 2;
        }
 
        var clipPath = new graphic.Rect({
            shape: {
                x: x,
                y: y,
                width: width,
                height: height
            }
        });
 
        if (hasAnimation) {
            clipPath.shape[isHorizontal ? 'width' : 'height'] = 0;
            graphic.initProps(clipPath, {
                shape: {
                    width: width,
                    height: height
                }
            }, seriesModel);
        }
 
        return clipPath;
    }
 
    function createPolarClipShape(polar, hasAnimation, seriesModel) {
        var angleAxis = polar.getAngleAxis();
        var radiusAxis = polar.getRadiusAxis();
 
        var radiusExtent = radiusAxis.getExtent();
        var angleExtent = angleAxis.getExtent();
 
        var RADIAN = Math.PI / 180;
 
        var clipPath = new graphic.Sector({
            shape: {
                cx: polar.cx,
                cy: polar.cy,
                r0: radiusExtent[0],
                r: radiusExtent[1],
                startAngle: -angleExtent[0] * RADIAN,
                endAngle: -angleExtent[1] * RADIAN,
                clockwise: angleAxis.inverse
            }
        });
 
        if (hasAnimation) {
            clipPath.shape.endAngle = -angleExtent[0] * RADIAN;
            graphic.initProps(clipPath, {
                shape: {
                    endAngle: -angleExtent[1] * RADIAN
                }
            }, seriesModel);
        }
 
        return clipPath;
    }
 
    function createClipShape(coordSys, hasAnimation, seriesModel) {
        return coordSys.type === 'polar'
            ? createPolarClipShape(coordSys, hasAnimation, seriesModel)
            : createGridClipShape(coordSys, hasAnimation, seriesModel);
    }
 
    function turnPointsIntoStep(points, coordSys, stepTurnAt) {
        var baseAxis = coordSys.getBaseAxis();
        var baseIndex = baseAxis.dim === 'x' || baseAxis.dim === 'radius' ? 0 : 1;
 
        var stepPoints = [];
        for (var i = 0; i < points.length - 1; i++) {
            var nextPt = points[i + 1];
            var pt = points[i];
            stepPoints.push(pt);
 
            var stepPt = [];
            switch (stepTurnAt) {
                case 'end':
                    stepPt[baseIndex] = nextPt[baseIndex];
                    stepPt[1 - baseIndex] = pt[1 - baseIndex];
                    // default is start
                    stepPoints.push(stepPt);
                    break;
                case 'middle':
                    // default is start
                    var middle = (pt[baseIndex] + nextPt[baseIndex]) / 2;
                    var stepPt2 = [];
                    stepPt[baseIndex] = stepPt2[baseIndex] = middle;
                    stepPt[1 - baseIndex] = pt[1 - baseIndex];
                    stepPt2[1 - baseIndex] = nextPt[1 - baseIndex];
                    stepPoints.push(stepPt);
                    stepPoints.push(stepPt2);
                    break;
                default:
                    stepPt[baseIndex] = pt[baseIndex];
                    stepPt[1 - baseIndex] = nextPt[1 - baseIndex];
                    // default is start
                    stepPoints.push(stepPt);
            }
        }
        // Last points
        points[i] && stepPoints.push(points[i]);
        return stepPoints;
    }
 
    function getVisualGradient(data, coordSys) {
        var visualMetaList = data.getVisual('visualMeta');
        if (!visualMetaList || !visualMetaList.length || !data.count()) {
            // When data.count() is 0, gradient range can not be calculated.
            return;
        }
 
        var visualMeta;
        for (var i = visualMetaList.length - 1; i >= 0; i--) {
            // Can only be x or y
            if (visualMetaList[i].dimension < 2) {
                visualMeta = visualMetaList[i];
                break;
            }
        }
        if (!visualMeta || coordSys.type !== 'cartesian2d') {
            if (__DEV__) {
                console.warn('Visual map on line style only support x or y dimension.');
            }
            return;
        }
 
        // If the area to be rendered is bigger than area defined by LinearGradient,
        // the canvas spec prescribes that the color of the first stop and the last
        // stop should be used. But if two stops are added at offset 0, in effect
        // browsers use the color of the second stop to render area outside
        // LinearGradient. So we can only infinitesimally extend area defined in
        // LinearGradient to render `outerColors`.
 
        var dimension = visualMeta.dimension;
        var dimName = data.dimensions[dimension];
        var axis = coordSys.getAxis(dimName);
 
        // dataToCoor mapping may not be linear, but must be monotonic.
        var colorStops = zrUtil.map(visualMeta.stops, function (stop) {
            return {
                coord: axis.toGlobalCoord(axis.dataToCoord(stop.value)),
                color: stop.color
            };
        });
        var stopLen = colorStops.length;
        var outerColors = visualMeta.outerColors.slice();
 
        if (stopLen && colorStops[0].coord > colorStops[stopLen - 1].coord) {
            colorStops.reverse();
            outerColors.reverse();
        }
 
        var tinyExtent = 10; // Arbitrary value: 10px
        var minCoord = colorStops[0].coord - tinyExtent;
        var maxCoord = colorStops[stopLen - 1].coord + tinyExtent;
        var coordSpan = maxCoord - minCoord;
 
        if (coordSpan < 1e-3) {
            return 'transparent';
        }
 
        zrUtil.each(colorStops, function (stop) {
            stop.offset = (stop.coord - minCoord) / coordSpan;
        });
        colorStops.push({
            offset: stopLen ? colorStops[stopLen - 1].offset : 0.5,
            color: outerColors[1] || 'transparent'
        });
        colorStops.unshift({ // notice colorStops.length have been changed.
            offset: stopLen ? colorStops[0].offset : 0.5,
            color: outerColors[0] || 'transparent'
        });
 
        // zrUtil.each(colorStops, function (colorStop) {
        //     // Make sure each offset has rounded px to avoid not sharp edge
        //     colorStop.offset = (Math.round(colorStop.offset * (end - start) + start) - start) / (end - start);
        // });
 
        var gradient = new graphic.LinearGradient(0, 0, 0, 0, colorStops, true);
        gradient[dimName] = minCoord;
        gradient[dimName + '2'] = maxCoord;
 
        return gradient;
    }
 
    module.exports = ChartView.extend({
 
        type: 'line',
 
        init: function () {
            var lineGroup = new graphic.Group();
 
            var symbolDraw = new SymbolDraw();
            this.group.add(symbolDraw.group);
 
            this._symbolDraw = symbolDraw;
            this._lineGroup = lineGroup;
        },
 
        render: function (seriesModel, ecModel, api) {
            var coordSys = seriesModel.coordinateSystem;
            var group = this.group;
            var data = seriesModel.getData();
            var lineStyleModel = seriesModel.getModel('lineStyle.normal');
            var areaStyleModel = seriesModel.getModel('areaStyle.normal');
 
            var points = data.mapArray(data.getItemLayout, true);
 
            var isCoordSysPolar = coordSys.type === 'polar';
            var prevCoordSys = this._coordSys;
 
            var symbolDraw = this._symbolDraw;
            var polyline = this._polyline;
            var polygon = this._polygon;
 
            var lineGroup = this._lineGroup;
 
            var hasAnimation = seriesModel.get('animation');
 
            var isAreaChart = !areaStyleModel.isEmpty();
            var stackedOnPoints = getStackedOnPoints(coordSys, data);
 
            var showSymbol = seriesModel.get('showSymbol');
 
            var isSymbolIgnore = showSymbol && !isCoordSysPolar && !seriesModel.get('showAllSymbol')
                && this._getSymbolIgnoreFunc(data, coordSys);
 
            // Remove temporary symbols
            var oldData = this._data;
            oldData && oldData.eachItemGraphicEl(function (el, idx) {
                if (el.__temp) {
                    group.remove(el);
                    oldData.setItemGraphicEl(idx, null);
                }
            });
 
            // Remove previous created symbols if showSymbol changed to false
            if (!showSymbol) {
                symbolDraw.remove();
            }
 
            group.add(lineGroup);
 
            // FIXME step not support polar
            var step = !isCoordSysPolar && seriesModel.get('step');
            // Initialization animation or coordinate system changed
            if (
                !(polyline && prevCoordSys.type === coordSys.type && step === this._step)
            ) {
                showSymbol && symbolDraw.updateData(data, isSymbolIgnore);
 
                if (step) {
                    // TODO If stacked series is not step
                    points = turnPointsIntoStep(points, coordSys, step);
                    stackedOnPoints = turnPointsIntoStep(stackedOnPoints, coordSys, step);
                }
 
                polyline = this._newPolyline(points, coordSys, hasAnimation);
                if (isAreaChart) {
                    polygon = this._newPolygon(
                        points, stackedOnPoints,
                        coordSys, hasAnimation
                    );
                }
                lineGroup.setClipPath(createClipShape(coordSys, true, seriesModel));
            }
            else {
                if (isAreaChart && !polygon) {
                    // If areaStyle is added
                    polygon = this._newPolygon(
                        points, stackedOnPoints,
                        coordSys, hasAnimation
                    );
                }
                else if (polygon && !isAreaChart) {
                    // If areaStyle is removed
                    lineGroup.remove(polygon);
                    polygon = this._polygon = null;
                }
 
                // Update clipPath
                lineGroup.setClipPath(createClipShape(coordSys, false, seriesModel));
 
                // Always update, or it is wrong in the case turning on legend
                // because points are not changed
                showSymbol && symbolDraw.updateData(data, isSymbolIgnore);
 
                // Stop symbol animation and sync with line points
                // FIXME performance?
                data.eachItemGraphicEl(function (el) {
                    el.stopAnimation(true);
                });
 
                // In the case data zoom triggerred refreshing frequently
                // Data may not change if line has a category axis. So it should animate nothing
                if (!isPointsSame(this._stackedOnPoints, stackedOnPoints)
                    || !isPointsSame(this._points, points)
                ) {
                    if (hasAnimation) {
                        this._updateAnimation(
                            data, stackedOnPoints, coordSys, api, step
                        );
                    }
                    else {
                        // Not do it in update with animation
                        if (step) {
                            // TODO If stacked series is not step
                            points = turnPointsIntoStep(points, coordSys, step);
                            stackedOnPoints = turnPointsIntoStep(stackedOnPoints, coordSys, step);
                        }
 
                        polyline.setShape({
                            points: points
                        });
                        polygon && polygon.setShape({
                            points: points,
                            stackedOnPoints: stackedOnPoints
                        });
                    }
                }
            }
 
            var visualColor = getVisualGradient(data, coordSys) || data.getVisual('color');
 
            polyline.useStyle(zrUtil.defaults(
                // Use color in lineStyle first
                lineStyleModel.getLineStyle(),
                {
                    fill: 'none',
                    stroke: visualColor,
                    lineJoin: 'bevel'
                }
            ));
 
            var smooth = seriesModel.get('smooth');
            smooth = getSmooth(seriesModel.get('smooth'));
            polyline.setShape({
                smooth: smooth,
                smoothMonotone: seriesModel.get('smoothMonotone'),
                connectNulls: seriesModel.get('connectNulls')
            });
 
            if (polygon) {
                var stackedOn = data.stackedOn;
                var stackedOnSmooth = 0;
 
                polygon.useStyle(zrUtil.defaults(
                    areaStyleModel.getAreaStyle(),
                    {
                        fill: visualColor,
                        opacity: 0.7,
                        lineJoin: 'bevel'
                    }
                ));
 
                if (stackedOn) {
                    var stackedOnSeries = stackedOn.hostModel;
                    stackedOnSmooth = getSmooth(stackedOnSeries.get('smooth'));
                }
 
                polygon.setShape({
                    smooth: smooth,
                    stackedOnSmooth: stackedOnSmooth,
                    smoothMonotone: seriesModel.get('smoothMonotone'),
                    connectNulls: seriesModel.get('connectNulls')
                });
            }
 
            this._data = data;
            // Save the coordinate system for transition animation when data changed
            this._coordSys = coordSys;
            this._stackedOnPoints = stackedOnPoints;
            this._points = points;
            this._step = step;
        },
 
        dispose: function () {},
 
        highlight: function (seriesModel, ecModel, api, payload) {
            var data = seriesModel.getData();
            var dataIndex = modelUtil.queryDataIndex(data, payload);
 
            if (!(dataIndex instanceof Array) && dataIndex != null && dataIndex >= 0) {
                var symbol = data.getItemGraphicEl(dataIndex);
                if (!symbol) {
                    // Create a temporary symbol if it is not exists
                    var pt = data.getItemLayout(dataIndex);
                    if (!pt) {
                        // Null data
                        return;
                    }
                    symbol = new Symbol(data, dataIndex);
                    symbol.position = pt;
                    symbol.setZ(
                        seriesModel.get('zlevel'),
                        seriesModel.get('z')
                    );
                    symbol.ignore = isNaN(pt[0]) || isNaN(pt[1]);
                    symbol.__temp = true;
                    data.setItemGraphicEl(dataIndex, symbol);
 
                    // Stop scale animation
                    symbol.stopSymbolAnimation(true);
 
                    this.group.add(symbol);
                }
                symbol.highlight();
            }
            else {
                // Highlight whole series
                ChartView.prototype.highlight.call(
                    this, seriesModel, ecModel, api, payload
                );
            }
        },
 
        downplay: function (seriesModel, ecModel, api, payload) {
            var data = seriesModel.getData();
            var dataIndex = modelUtil.queryDataIndex(data, payload);
            if (dataIndex != null && dataIndex >= 0) {
                var symbol = data.getItemGraphicEl(dataIndex);
                if (symbol) {
                    if (symbol.__temp) {
                        data.setItemGraphicEl(dataIndex, null);
                        this.group.remove(symbol);
                    }
                    else {
                        symbol.downplay();
                    }
                }
            }
            else {
                // FIXME
                // can not downplay completely.
                // Downplay whole series
                ChartView.prototype.downplay.call(
                    this, seriesModel, ecModel, api, payload
                );
            }
        },
 
        /**
         * @param {module:zrender/container/Group} group
         * @param {Array.<Array.<number>>} points
         * @private
         */
        _newPolyline: function (points) {
            var polyline = this._polyline;
            // Remove previous created polyline
            if (polyline) {
                this._lineGroup.remove(polyline);
            }
 
            polyline = new polyHelper.Polyline({
                shape: {
                    points: points
                },
                silent: true,
                z2: 10
            });
 
            this._lineGroup.add(polyline);
 
            this._polyline = polyline;
 
            return polyline;
        },
 
        /**
         * @param {module:zrender/container/Group} group
         * @param {Array.<Array.<number>>} stackedOnPoints
         * @param {Array.<Array.<number>>} points
         * @private
         */
        _newPolygon: function (points, stackedOnPoints) {
            var polygon = this._polygon;
            // Remove previous created polygon
            if (polygon) {
                this._lineGroup.remove(polygon);
            }
 
            polygon = new polyHelper.Polygon({
                shape: {
                    points: points,
                    stackedOnPoints: stackedOnPoints
                },
                silent: true
            });
 
            this._lineGroup.add(polygon);
 
            this._polygon = polygon;
            return polygon;
        },
        /**
         * @private
         */
        _getSymbolIgnoreFunc: function (data, coordSys) {
            var categoryAxis = coordSys.getAxesByScale('ordinal')[0];
            // `getLabelInterval` is provided by echarts/component/axis
            if (categoryAxis && categoryAxis.isLabelIgnored) {
                return zrUtil.bind(categoryAxis.isLabelIgnored, categoryAxis);
            }
        },
 
        /**
         * @private
         */
        // FIXME Two value axis
        _updateAnimation: function (data, stackedOnPoints, coordSys, api, step) {
            var polyline = this._polyline;
            var polygon = this._polygon;
            var seriesModel = data.hostModel;
 
            var diff = lineAnimationDiff(
                this._data, data,
                this._stackedOnPoints, stackedOnPoints,
                this._coordSys, coordSys
            );
 
            var current = diff.current;
            var stackedOnCurrent = diff.stackedOnCurrent;
            var next = diff.next;
            var stackedOnNext = diff.stackedOnNext;
            if (step) {
                // TODO If stacked series is not step
                current = turnPointsIntoStep(diff.current, coordSys, step);
                stackedOnCurrent = turnPointsIntoStep(diff.stackedOnCurrent, coordSys, step);
                next = turnPointsIntoStep(diff.next, coordSys, step);
                stackedOnNext = turnPointsIntoStep(diff.stackedOnNext, coordSys, step);
            }
            // `diff.current` is subset of `current` (which should be ensured by
            // turnPointsIntoStep), so points in `__points` can be updated when
            // points in `current` are update during animation.
            polyline.shape.__points = diff.current;
            polyline.shape.points = current;
 
            graphic.updateProps(polyline, {
                shape: {
                    points: next
                }
            }, seriesModel);
 
            if (polygon) {
                polygon.setShape({
                    points: current,
                    stackedOnPoints: stackedOnCurrent
                });
                graphic.updateProps(polygon, {
                    shape: {
                        points: next,
                        stackedOnPoints: stackedOnNext
                    }
                }, seriesModel);
            }
 
            var updatedDataInfo = [];
            var diffStatus = diff.status;
 
            for (var i = 0; i < diffStatus.length; i++) {
                var cmd = diffStatus[i].cmd;
                if (cmd === '=') {
                    var el = data.getItemGraphicEl(diffStatus[i].idx1);
                    if (el) {
                        updatedDataInfo.push({
                            el: el,
                            ptIdx: i    // Index of points
                        });
                    }
                }
            }
 
            if (polyline.animators && polyline.animators.length) {
                polyline.animators[0].during(function () {
                    for (var i = 0; i < updatedDataInfo.length; i++) {
                        var el = updatedDataInfo[i].el;
                        el.attr('position', polyline.shape.__points[updatedDataInfo[i].ptIdx]);
                    }
                });
            }
        },
 
        remove: function (ecModel) {
            var group = this.group;
            var oldData = this._data;
            this._lineGroup.removeAll();
            this._symbolDraw.remove(true);
            // Remove temporary created elements when highlighting
            oldData && oldData.eachItemGraphicEl(function (el, idx) {
                if (el.__temp) {
                    group.remove(el);
                    oldData.setItemGraphicEl(idx, null);
                }
            });
 
            this._polyline =
            this._polygon =
            this._coordSys =
            this._points =
            this._stackedOnPoints =
            this._data = null;
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/line/lineAnimationDiff.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/line/lineAnimationDiff.js

Statements: 4.82% (4 / 83)      Branches: 0% (0 / 23)      Functions: 0% (0 / 8)      Lines: 4.82% (4 / 83)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210            1       1                                                                                                   1                                   1                                                                                                                                                                                                                                                                      
 
 
    // var arrayDiff = require('zrender/lib/core/arrayDiff');
    // 'zrender/core/arrayDiff' has been used before, but it did
    // not do well in performance when roam with fixed dataZoom window.
 
    function sign(val) {
        return val >= 0 ? 1 : -1;
    }
 
    function getStackedOnPoint(coordSys, data, idx) {
        var baseAxis = coordSys.getBaseAxis();
        var valueAxis = coordSys.getOtherAxis(baseAxis);
        var valueStart = baseAxis.onZero
            ? 0 : valueAxis.scale.getExtent()[0];
 
        var valueDim = valueAxis.dim;
        var baseDataOffset = valueDim === 'x' || valueDim === 'radius' ? 1 : 0;
 
        var stackedOnSameSign;
        var stackedOn = data.stackedOn;
        var val = data.get(valueDim, idx);
        // Find first stacked value with same sign
        while (stackedOn &&
            sign(stackedOn.get(valueDim, idx)) === sign(val)
        ) {
            stackedOnSameSign = stackedOn;
            break;
        }
        var stackedData = [];
        stackedData[baseDataOffset] = data.get(baseAxis.dim, idx);
        stackedData[1 - baseDataOffset] = stackedOnSameSign
            ? stackedOnSameSign.get(valueDim, idx, true) : valueStart;
 
        return coordSys.dataToPoint(stackedData);
    }
 
    // function convertToIntId(newIdList, oldIdList) {
    //     // Generate int id instead of string id.
    //     // Compare string maybe slow in score function of arrDiff
 
    //     // Assume id in idList are all unique
    //     var idIndicesMap = {};
    //     var idx = 0;
    //     for (var i = 0; i < newIdList.length; i++) {
    //         idIndicesMap[newIdList[i]] = idx;
    //         newIdList[i] = idx++;
    //     }
    //     for (var i = 0; i < oldIdList.length; i++) {
    //         var oldId = oldIdList[i];
    //         // Same with newIdList
    //         if (idIndicesMap[oldId]) {
    //             oldIdList[i] = idIndicesMap[oldId];
    //         }
    //         else {
    //             oldIdList[i] = idx++;
    //         }
    //     }
    // }
 
    function diffData(oldData, newData) {
        var diffResult = [];
 
        newData.diff(oldData)
            .add(function (idx) {
                diffResult.push({cmd: '+', idx: idx});
            })
            .update(function (newIdx, oldIdx) {
                diffResult.push({cmd: '=', idx: oldIdx, idx1: newIdx});
            })
            .remove(function (idx) {
                diffResult.push({cmd: '-', idx: idx});
            })
            .execute();
 
        return diffResult;
    }
 
    module.exports = function (
        oldData, newData,
        oldStackedOnPoints, newStackedOnPoints,
        oldCoordSys, newCoordSys
    ) {
        var diff = diffData(oldData, newData);
 
        // var newIdList = newData.mapArray(newData.getId);
        // var oldIdList = oldData.mapArray(oldData.getId);
 
        // convertToIntId(newIdList, oldIdList);
 
        // // FIXME One data ?
        // diff = arrayDiff(oldIdList, newIdList);
 
        var currPoints = [];
        var nextPoints = [];
        // Points for stacking base line
        var currStackedPoints = [];
        var nextStackedPoints = [];
 
        var status = [];
        var sortedIndices = [];
        var rawIndices = [];
        var dims = newCoordSys.dimensions;
        for (var i = 0; i < diff.length; i++) {
            var diffItem = diff[i];
            var pointAdded = true;
 
            // FIXME, animation is not so perfect when dataZoom window moves fast
            // Which is in case remvoing or add more than one data in the tail or head
            switch (diffItem.cmd) {
                case '=':
                    var currentPt = oldData.getItemLayout(diffItem.idx);
                    var nextPt = newData.getItemLayout(diffItem.idx1);
                    // If previous data is NaN, use next point directly
                    if (isNaN(currentPt[0]) || isNaN(currentPt[1])) {
                        currentPt = nextPt.slice();
                    }
                    currPoints.push(currentPt);
                    nextPoints.push(nextPt);
 
                    currStackedPoints.push(oldStackedOnPoints[diffItem.idx]);
                    nextStackedPoints.push(newStackedOnPoints[diffItem.idx1]);
 
                    rawIndices.push(newData.getRawIndex(diffItem.idx1));
                    break;
                case '+':
                    var idx = diffItem.idx;
                    currPoints.push(
                        oldCoordSys.dataToPoint([
                            newData.get(dims[0], idx, true), newData.get(dims[1], idx, true)
                        ])
                    );
 
                    nextPoints.push(newData.getItemLayout(idx).slice());
 
                    currStackedPoints.push(
                        getStackedOnPoint(oldCoordSys, newData, idx)
                    );
                    nextStackedPoints.push(newStackedOnPoints[idx]);
 
                    rawIndices.push(newData.getRawIndex(idx));
                    break;
                case '-':
                    var idx = diffItem.idx;
                    var rawIndex = oldData.getRawIndex(idx);
                    // Data is replaced. In the case of dynamic data queue
                    // FIXME FIXME FIXME
                    if (rawIndex !== idx) {
                        currPoints.push(oldData.getItemLayout(idx));
                        nextPoints.push(newCoordSys.dataToPoint([
                            oldData.get(dims[0], idx, true), oldData.get(dims[1], idx, true)
                        ]));
 
                        currStackedPoints.push(oldStackedOnPoints[idx]);
                        nextStackedPoints.push(
                            getStackedOnPoint(
                                newCoordSys, oldData, idx
                            )
                        );
 
                        rawIndices.push(rawIndex);
                    }
                    else {
                        pointAdded = false;
                    }
            }
 
            // Original indices
            if (pointAdded) {
                status.push(diffItem);
                sortedIndices.push(sortedIndices.length);
            }
        }
 
        // Diff result may be crossed if all items are changed
        // Sort by data index
        sortedIndices.sort(function (a, b) {
            return rawIndices[a] - rawIndices[b];
        });
 
        var sortedCurrPoints = [];
        var sortedNextPoints = [];
 
        var sortedCurrStackedPoints = [];
        var sortedNextStackedPoints = [];
 
        var sortedStatus = [];
        for (var i = 0; i < sortedIndices.length; i++) {
            var idx = sortedIndices[i];
            sortedCurrPoints[i] = currPoints[idx];
            sortedNextPoints[i] = nextPoints[idx];
 
            sortedCurrStackedPoints[i] = currStackedPoints[idx];
            sortedNextStackedPoints[i] = nextStackedPoints[idx];
 
            sortedStatus[i] = status[idx];
        }
 
        return {
            current: sortedCurrPoints,
            next: sortedNextPoints,
 
            stackedOnCurrent: sortedCurrStackedPoints,
            stackedOnNext: sortedNextStackedPoints,
 
            status: sortedStatus
        };
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/line/poly.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/line/poly.js

Statements: 11.93% (13 / 109)      Branches: 0% (0 / 60)      Functions: 0% (0 / 5)      Lines: 12.38% (13 / 105)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251      1 1   1 1   1 1     1 1 1   1       1                                                                                                                                                                                         1                                   1                                                                                                                                                                                                                                            
// Poly path support NaN point
 
 
    var Path = require('zrender/lib/graphic/Path');
    var vec2 = require('zrender/lib/core/vector');
 
    var vec2Min = vec2.min;
    var vec2Max = vec2.max;
 
    var scaleAndAdd = vec2.scaleAndAdd;
    var v2Copy = vec2.copy;
 
    // Temporary variable
    var v = [];
    var cp0 = [];
    var cp1 = [];
 
    function isPointNull(p) {
        return isNaN(p[0]) || isNaN(p[1]);
    }
 
    function drawSegment(
        ctx, points, start, segLen, allLen,
        dir, smoothMin, smoothMax, smooth, smoothMonotone, connectNulls
    ) {
        var prevIdx = 0;
        var idx = start;
        for (var k = 0; k < segLen; k++) {
            var p = points[idx];
            if (idx >= allLen || idx < 0) {
                break;
            }
            if (isPointNull(p)) {
                if (connectNulls) {
                    idx += dir;
                    continue;
                }
                break;
            }
 
            if (idx === start) {
                ctx[dir > 0 ? 'moveTo' : 'lineTo'](p[0], p[1]);
                v2Copy(cp0, p);
            }
            else {
                if (smooth > 0) {
                    var nextIdx = idx + dir;
                    var nextP = points[nextIdx];
                    if (connectNulls) {
                        // Find next point not null
                        while (nextP && isPointNull(points[nextIdx])) {
                            nextIdx += dir;
                            nextP = points[nextIdx];
                        }
                    }
 
                    var ratioNextSeg = 0.5;
                    var prevP = points[prevIdx];
                    var nextP = points[nextIdx];
                    // Last point
                    if (!nextP || isPointNull(nextP)) {
                        v2Copy(cp1, p);
                    }
                    else {
                        // If next data is null in not connect case
                        if (isPointNull(nextP) && !connectNulls) {
                            nextP = p;
                        }
 
                        vec2.sub(v, nextP, prevP);
 
                        var lenPrevSeg;
                        var lenNextSeg;
                        if (smoothMonotone === 'x' || smoothMonotone === 'y') {
                            var dim = smoothMonotone === 'x' ? 0 : 1;
                            lenPrevSeg = Math.abs(p[dim] - prevP[dim]);
                            lenNextSeg = Math.abs(p[dim] - nextP[dim]);
                        }
                        else {
                            lenPrevSeg = vec2.dist(p, prevP);
                            lenNextSeg = vec2.dist(p, nextP);
                        }
 
                        // Use ratio of seg length
                        ratioNextSeg = lenNextSeg / (lenNextSeg + lenPrevSeg);
 
                        scaleAndAdd(cp1, p, v, -smooth * (1 - ratioNextSeg));
                    }
                    // Smooth constraint
                    vec2Min(cp0, cp0, smoothMax);
                    vec2Max(cp0, cp0, smoothMin);
                    vec2Min(cp1, cp1, smoothMax);
                    vec2Max(cp1, cp1, smoothMin);
 
                    ctx.bezierCurveTo(
                        cp0[0], cp0[1],
                        cp1[0], cp1[1],
                        p[0], p[1]
                    );
                    // cp0 of next segment
                    scaleAndAdd(cp0, p, v, smooth * ratioNextSeg);
                }
                else {
                    ctx.lineTo(p[0], p[1]);
                }
            }
 
            prevIdx = idx;
            idx += dir;
        }
 
        return k;
    }
 
    function getBoundingBox(points, smoothConstraint) {
        var ptMin = [Infinity, Infinity];
        var ptMax = [-Infinity, -Infinity];
        if (smoothConstraint) {
            for (var i = 0; i < points.length; i++) {
                var pt = points[i];
                if (pt[0] < ptMin[0]) { ptMin[0] = pt[0]; }
                if (pt[1] < ptMin[1]) { ptMin[1] = pt[1]; }
                if (pt[0] > ptMax[0]) { ptMax[0] = pt[0]; }
                if (pt[1] > ptMax[1]) { ptMax[1] = pt[1]; }
            }
        }
        return {
            min: smoothConstraint ? ptMin : ptMax,
            max: smoothConstraint ? ptMax : ptMin
        };
    }
 
    module.exports = {
 
        Polyline: Path.extend({
 
            type: 'ec-polyline',
 
            shape: {
                points: [],
 
                smooth: 0,
 
                smoothConstraint: true,
 
                smoothMonotone: null,
 
                connectNulls: false
            },
 
            style: {
                fill: null,
 
                stroke: '#000'
            },
 
            buildPath: function (ctx, shape) {
                var points = shape.points;
 
                var i = 0;
                var len = points.length;
 
                var result = getBoundingBox(points, shape.smoothConstraint);
 
                if (shape.connectNulls) {
                    // Must remove first and last null values avoid draw error in polygon
                    for (; len > 0; len--) {
                        if (!isPointNull(points[len - 1])) {
                            break;
                        }
                    }
                    for (; i < len; i++) {
                        if (!isPointNull(points[i])) {
                            break;
                        }
                    }
                }
                while (i < len) {
                    i += drawSegment(
                        ctx, points, i, len, len,
                        1, result.min, result.max, shape.smooth,
                        shape.smoothMonotone, shape.connectNulls
                    ) + 1;
                }
            }
        }),
 
        Polygon: Path.extend({
 
            type: 'ec-polygon',
 
            shape: {
                points: [],
 
                // Offset between stacked base points and points
                stackedOnPoints: [],
 
                smooth: 0,
 
                stackedOnSmooth: 0,
 
                smoothConstraint: true,
 
                smoothMonotone: null,
 
                connectNulls: false
            },
 
            buildPath: function (ctx, shape) {
                var points = shape.points;
                var stackedOnPoints = shape.stackedOnPoints;
 
                var i = 0;
                var len = points.length;
                var smoothMonotone = shape.smoothMonotone;
                var bbox = getBoundingBox(points, shape.smoothConstraint);
                var stackedOnBBox = getBoundingBox(stackedOnPoints, shape.smoothConstraint);
 
                if (shape.connectNulls) {
                    // Must remove first and last null values avoid draw error in polygon
                    for (; len > 0; len--) {
                        if (!isPointNull(points[len - 1])) {
                            break;
                        }
                    }
                    for (; i < len; i++) {
                        if (!isPointNull(points[i])) {
                            break;
                        }
                    }
                }
                while (i < len) {
                    var k = drawSegment(
                        ctx, points, i, len, len,
                        1, bbox.min, bbox.max, shape.smooth,
                        smoothMonotone, shape.connectNulls
                    );
                    drawSegment(
                        ctx, stackedOnPoints, i + k - 1, k, len,
                        -1, stackedOnBBox.min, stackedOnBBox.max, shape.stackedOnSmooth,
                        smoothMonotone, shape.connectNulls
                    );
                    i += k + 1;
 
                    ctx.closePath();
                }
            }
        })
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/lines/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/lines/

Statements: 12.5% (17 / 136)      Branches: 0% (0 / 98)      Functions: 0% (0 / 20)      Lines: 12.5% (17 / 136)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/chart/lines/
File Statements Branches Functions Lines
LinesSeries.js 14.58% (7 / 48) 0% (0 / 28) 0% (0 / 7) 14.58% (7 / 48)
LinesView.js 16.28% (7 / 43) 0% (0 / 39) 0% (0 / 6) 16.28% (7 / 43)
linesLayout.js 5% (1 / 20) 0% (0 / 13) 0% (0 / 3) 5% (1 / 20)
linesVisual.js 8% (2 / 25) 0% (0 / 18) 0% (0 / 4) 8% (2 / 25)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/lines/LinesSeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/lines/LinesSeries.js

Statements: 14.58% (7 / 48)      Branches: 0% (0 / 28)      Functions: 0% (0 / 7)      Lines: 14.58% (7 / 48)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159      1 1 1 1 1       1                                                 1                                                                                                                                                                                                                                                    
'use strict';
 
 
    var SeriesModel = require('../../model/Series');
    var List = require('../../data/List');
    var zrUtil = require('zrender/lib/core/util');
    var formatUtil = require('../../util/format');
    var CoordinateSystem = require('../../CoordinateSystem');
 
    // Convert [ [{coord: []}, {coord: []}] ]
    // to [ { coords: [[]] } ]
    function preprocessOption (seriesOpt) {
        var data = seriesOpt.data;
        if (data && data[0] && data[0][0] && data[0][0].coord) {
            if (__DEV__) {
                console.warn('Lines data configuration has been changed to'
                    + ' { coords:[[1,2],[2,3]] }');
            }
            seriesOpt.data = zrUtil.map(data, function (itemOpt) {
                var coords = [
                    itemOpt[0].coord, itemOpt[1].coord
                ];
                var target = {
                    coords: coords
                };
                if (itemOpt[0].name) {
                    target.fromName = itemOpt[0].name;
                }
                if (itemOpt[1].name) {
                    target.toName = itemOpt[1].name;
                }
                return zrUtil.mergeAll([target, itemOpt[0], itemOpt[1]]);
            });
        }
    }
 
    var LinesSeries = SeriesModel.extend({
 
        type: 'series.lines',
 
        dependencies: ['grid', 'polar'],
 
        visualColorAccessPath: 'lineStyle.normal.color',
 
        init: function (option) {
            // Not using preprocessor because mergeOption may not have series.type
            preprocessOption(option);
 
            LinesSeries.superApply(this, 'init', arguments);
        },
 
        mergeOption: function (option) {
            preprocessOption(option);
 
            LinesSeries.superApply(this, 'mergeOption', arguments);
        },
 
        getInitialData: function (option, ecModel) {
            if (__DEV__) {
                var CoordSys = CoordinateSystem.get(option.coordinateSystem);
                if (!CoordSys) {
                    throw new Error('Unkown coordinate system ' + option.coordinateSystem);
                }
            }
 
            var lineData = new List(['value'], this);
            lineData.hasItemOption = false;
            lineData.initData(option.data, [], function (dataItem, dimName, dataIndex, dimIndex) {
                // dataItem is simply coords
                if (dataItem instanceof Array) {
                    return NaN;
                }
                else {
                    lineData.hasItemOption = true;
                    var value = dataItem.value;
                    if (value != null) {
                        return value instanceof Array ? value[dimIndex] : value;
                    }
                }
            });
 
            return lineData;
        },
 
        formatTooltip: function (dataIndex) {
            var data = this.getData();
            var itemModel = data.getItemModel(dataIndex);
            var name = itemModel.get('name');
            if (name) {
                return name;
            }
            var fromName = itemModel.get('fromName');
            var toName = itemModel.get('toName');
            var html = [];
            fromName != null && html.push(fromName);
            toName != null && html.push(toName);
 
            return formatUtil.encodeHTML(html.join(' > '));
        },
 
        defaultOption: {
            coordinateSystem: 'geo',
            zlevel: 0,
            z: 2,
            legendHoverLink: true,
 
            hoverAnimation: true,
            // Cartesian coordinate system
            xAxisIndex: 0,
            yAxisIndex: 0,
 
            symbol: ['none', 'none'],
            symbolSize: [10, 10],
            // Geo coordinate system
            geoIndex: 0,
 
            effect: {
                show: false,
                period: 4,
                // Animation delay. support callback
                // delay: 0,
                // If move with constant speed px/sec
                // period will be ignored if this property is > 0,
                constantSpeed: 0,
                symbol: 'circle',
                symbolSize: 3,
                loop: true,
                // Length of trail, 0 - 1
                trailLength: 0.2
                // Same with lineStyle.normal.color
                // color
            },
 
            large: false,
            // Available when large is true
            largeThreshold: 2000,
 
            // If lines are polyline
            // polyline not support curveness, label, animation
            polyline: false,
 
            label: {
                normal: {
                    show: false,
                    position: 'end'
                    // distance: 5,
                    // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调
                }
            },
 
            lineStyle: {
                normal: {
                    opacity: 0.5
                }
            }
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/lines/LinesView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/lines/LinesView.js

Statements: 16.28% (7 / 43)      Branches: 0% (0 / 39)      Functions: 0% (0 / 6)      Lines: 16.28% (7 / 43)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96    1 1 1 1 1 1   1                                                                                                                                                                            
 
 
    var LineDraw = require('../helper/LineDraw');
    var EffectLine = require('../helper/EffectLine');
    var Line = require('../helper/Line');
    var Polyline = require('../helper/Polyline');
    var EffectPolyline = require('../helper/EffectPolyline');
    var LargeLineDraw = require('../helper/LargeLineDraw');
 
    require('../../echarts').extendChartView({
 
        type: 'lines',
 
        init: function () {},
 
        render: function (seriesModel, ecModel, api) {
            var data = seriesModel.getData();
            var lineDraw = this._lineDraw;
 
            var hasEffect = seriesModel.get('effect.show');
            var isPolyline = seriesModel.get('polyline');
            var isLarge = seriesModel.get('large') && data.count() >= seriesModel.get('largeThreshold');
 
            if (__DEV__) {
                if (hasEffect && isLarge) {
                    console.warn('Large lines not support effect');
                }
            }
            if (hasEffect !== this._hasEffet || isPolyline !== this._isPolyline || isLarge !== this._isLarge) {
                if (lineDraw) {
                    lineDraw.remove();
                }
                lineDraw = this._lineDraw = isLarge
                    ? new LargeLineDraw()
                    : new LineDraw(
                        isPolyline
                            ? (hasEffect ? EffectPolyline : Polyline)
                            : (hasEffect ? EffectLine : Line)
                    );
                this._hasEffet = hasEffect;
                this._isPolyline = isPolyline;
                this._isLarge = isLarge;
            }
 
            var zlevel = seriesModel.get('zlevel');
            var trailLength = seriesModel.get('effect.trailLength');
 
            var zr = api.getZr();
            // Avoid the drag cause ghost shadow
            // FIXME Better way ?
            zr.painter.getLayer(zlevel).clear(true);
            // Config layer with motion blur
            if (this._lastZlevel != null) {
                zr.configLayer(this._lastZlevel, {
                    motionBlur: false
                });
            }
            if (hasEffect && trailLength) {
                if (__DEV__) {
                    var notInIndividual = false;
                    ecModel.eachSeries(function (otherSeriesModel) {
                        if (otherSeriesModel !== seriesModel && otherSeriesModel.get('zlevel') === zlevel) {
                            notInIndividual = true;
                        }
                    });
                    notInIndividual && console.warn('Lines with trail effect should have an individual zlevel');
                }
 
                zr.configLayer(zlevel, {
                    motionBlur: true,
                    lastFrameAlpha: Math.max(Math.min(trailLength / 10 + 0.9, 1), 0)
                });
            }
 
            this.group.add(lineDraw.group);
 
            lineDraw.updateData(data);
 
            this._lastZlevel = zlevel;
        },
 
        updateLayout: function (seriesModel, ecModel, api) {
            this._lineDraw.updateLayout(seriesModel);
            // Not use motion when dragging or zooming
            var zr = api.getZr();
            zr.painter.getLayer(this._lastZlevel).clear(true);
        },
 
        remove: function (ecModel, api) {
            this._lineDraw && this._lineDraw.remove(api, true);
        },
 
        dispose: function () {}
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/lines/linesLayout.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/lines/linesLayout.js

Statements: 5% (1 / 20)      Branches: 0% (0 / 13)      Functions: 0% (0 / 3)      Lines: 5% (1 / 20)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44    1                                                                                  
 
 
    module.exports = function (ecModel) {
        ecModel.eachSeriesByType('lines', function (seriesModel) {
            var coordSys = seriesModel.coordinateSystem;
            var lineData = seriesModel.getData();
 
            // FIXME Use data dimensions ?
            lineData.each(function (idx) {
                var itemModel = lineData.getItemModel(idx);
 
                var coords = (itemModel.option instanceof Array) ?
                    itemModel.option : itemModel.get('coords');
 
                if (__DEV__) {
                    if (!(coords instanceof Array && coords.length > 0 && coords[0] instanceof Array)) {
                        throw new Error('Invalid coords ' + JSON.stringify(coords) + '. Lines must have 2d coords array in data item.');
                    }
                }
                var pts = [];
 
                if (seriesModel.get('polyline')) {
                    for (var i = 0; i < coords.length; i++) {
                        pts.push(coordSys.dataToPoint(coords[i]));
                    }
                }
                else {
                    pts[0] = coordSys.dataToPoint(coords[0]);
                    pts[1] = coordSys.dataToPoint(coords[1]);
 
                    var curveness = itemModel.get('lineStyle.normal.curveness');
                    if (+curveness) {
                        pts[2] = [
                            (pts[0][0] + pts[1][0]) / 2 - (pts[0][1] - pts[1][1]) * curveness,
                            (pts[0][1] + pts[1][1]) / 2 - (pts[1][0] - pts[0][0]) * curveness
                        ];
                    }
                }
                lineData.setItemLayout(idx, pts);
            });
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/lines/linesVisual.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/lines/linesVisual.js

Statements: 8% (2 / 25)      Branches: 0% (0 / 18)      Functions: 0% (0 / 4)      Lines: 8% (2 / 25)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39    1           1                                                            
 
 
    function normalize(a) {
        if (!(a instanceof Array)) {
            a = [a, a];
        }
        return a;
    }
    module.exports = function (ecModel) {
        ecModel.eachSeriesByType('lines', function (seriesModel) {
            var data = seriesModel.getData();
            var symbolType = normalize(seriesModel.get('symbol'));
            var symbolSize = normalize(seriesModel.get('symbolSize'));
 
            var opacityQuery = 'lineStyle.normal.opacity'.split('.');
 
            data.setVisual('fromSymbol', symbolType && symbolType[0]);
            data.setVisual('toSymbol', symbolType && symbolType[1]);
            data.setVisual('fromSymbolSize', symbolSize && symbolSize[0]);
            data.setVisual('toSymbolSize', symbolSize && symbolSize[1]);
            data.setVisual('opacity', seriesModel.get(opacityQuery));
 
            data.each(function (idx) {
                var itemModel = data.getItemModel(idx);
                var symbolType = normalize(itemModel.getShallow('symbol', true));
                var symbolSize = normalize(itemModel.getShallow('symbolSize', true));
                var opacity = itemModel.get(opacityQuery);
 
                symbolType[0] && data.setItemVisual(idx, 'fromSymbol', symbolType[0]);
                symbolType[1] && data.setItemVisual(idx, 'toSymbol', symbolType[1]);
                symbolSize[0] && data.setItemVisual(idx, 'fromSymbolSize', symbolSize[0]);
                symbolSize[1] && data.setItemVisual(idx, 'toSymbolSize', symbolSize[1]);
 
                data.setItemVisual(idx, 'opacity', opacity);
            });
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/map/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/map/

Statements: 11.86% (23 / 194)      Branches: 0% (0 / 94)      Functions: 0% (0 / 37)      Lines: 11.86% (23 / 194)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/chart/map/
File Statements Branches Functions Lines
MapSeries.js 24% (12 / 50) 0% (0 / 14) 0% (0 / 12) 24% (12 / 50)
MapView.js 5.45% (3 / 55) 0% (0 / 40) 0% (0 / 7) 5.45% (3 / 55)
backwardCompat.js 22.22% (2 / 9) 0% (0 / 4) 0% (0 / 3) 22.22% (2 / 9)
mapDataStatistic.js 6.67% (3 / 45) 0% (0 / 18) 0% (0 / 8) 6.67% (3 / 45)
mapSymbolLayout.js 7.14% (2 / 28) 0% (0 / 16) 0% (0 / 5) 7.14% (2 / 28)
mapVisual.js 14.29% (1 / 7) 0% (0 / 2) 0% (0 / 2) 14.29% (1 / 7)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/map/MapSeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/map/MapSeries.js

Statements: 24% (12 / 50)      Branches: 0% (0 / 14)      Functions: 0% (0 / 12)      Lines: 24% (12 / 50)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251    1 1 1 1   1 1 1   1   1   1                                                                                                                                                                                                                                                                                                                                                                                                                                                                             1   1    
 
 
    var List = require('../../data/List');
    var SeriesModel = require('../../model/Series');
    var zrUtil = require('zrender/lib/core/util');
    var completeDimensions = require('../../data/helper/completeDimensions');
 
    var formatUtil = require('../../util/format');
    var encodeHTML = formatUtil.encodeHTML;
    var addCommas = formatUtil.addCommas;
 
    var dataSelectableMixin = require('../../component/helper/selectableMixin');
 
    var geoCreator = require('../../coord/geo/geoCreator');
 
    var MapSeries = SeriesModel.extend({
 
        type: 'series.map',
 
        dependencies: ['geo'],
 
        layoutMode: 'box',
 
        /**
         * Only first map series of same mapType will drawMap
         * @type {boolean}
         */
        needsDrawMap: false,
 
        /**
         * Group of all map series with same mapType
         * @type {boolean}
         */
        seriesGroup: [],
 
        init: function (option) {
 
            option = this._fillOption(option, this.getMapType());
            this.option = option;
 
            MapSeries.superApply(this, 'init', arguments);
 
            this.updateSelectedMap(option.data);
        },
 
        getInitialData: function (option) {
            var dimensions = completeDimensions(['value'], option.data || []);
 
            var list = new List(dimensions, this);
 
            list.initData(option.data);
 
            return list;
        },
 
        mergeOption: function (newOption) {
            if (newOption.data) {
                newOption = this._fillOption(newOption, this.getMapType());
            }
 
            MapSeries.superCall(this, 'mergeOption', newOption);
 
            this.updateSelectedMap(this.option.data);
        },
 
        /**
         * If no host geo model, return null, which means using a
         * inner exclusive geo model.
         */
        getHostGeoModel: function () {
            var geoIndex = this.option.geoIndex;
            return geoIndex != null
                ? this.dependentModels.geo[geoIndex]
                : null;
        },
 
        getMapType: function () {
            return (this.getHostGeoModel() || this).option.map;
        },
 
        _fillOption: function (option, mapName) {
            // Shallow clone
            option = zrUtil.extend({}, option);
 
            option.data = geoCreator.getFilledRegions(option.data, mapName);
 
            return option;
        },
 
        getRawValue: function (dataIndex) {
            // Use value stored in data instead because it is calculated from multiple series
            // FIXME Provide all value of multiple series ?
            return this.getData().get('value', dataIndex);
        },
 
        /**
         * Get model of region
         * @param  {string} name
         * @return {module:echarts/model/Model}
         */
        getRegionModel: function (regionName) {
            var data = this.getData();
            return data.getItemModel(data.indexOfName(regionName));
        },
 
        /**
         * Map tooltip formatter
         *
         * @param {number} dataIndex
         */
        formatTooltip: function (dataIndex) {
            // FIXME orignalData and data is a bit confusing
            var data = this.getData();
            var formattedValue = addCommas(this.getRawValue(dataIndex));
            var name = data.getName(dataIndex);
 
            var seriesGroup = this.seriesGroup;
            var seriesNames = [];
            for (var i = 0; i < seriesGroup.length; i++) {
                var otherIndex = seriesGroup[i].originalData.indexOfName(name);
                if (!isNaN(seriesGroup[i].originalData.get('value', otherIndex))) {
                    seriesNames.push(
                        encodeHTML(seriesGroup[i].name)
                    );
                }
            }
 
            return seriesNames.join(', ') + '<br />'
                + encodeHTML(name + ' : ' + formattedValue);
        },
 
        /**
         * @implement
         */
        getTooltipPosition: function (dataIndex) {
            if (dataIndex != null) {
                var name = this.getData().getName(dataIndex);
                var geo = this.coordinateSystem;
                var region = geo.getRegion(name);
 
                return region && geo.dataToPoint(region.center);
            }
        },
 
        setZoom: function (zoom) {
            this.option.zoom = zoom;
        },
 
        setCenter: function (center) {
            this.option.center = center;
        },
 
        defaultOption: {
            // 一级层叠
            zlevel: 0,
            // 二级层叠
            z: 2,
 
            coordinateSystem: 'geo',
 
            // map should be explicitly specified since ec3.
            map: '',
 
            // If `geoIndex` is not specified, a exclusive geo will be
            // created. Otherwise use the specified geo component, and
            // `map` and `mapType` are ignored.
            // geoIndex: 0,
 
            // 'center' | 'left' | 'right' | 'x%' | {number}
            left: 'center',
            // 'center' | 'top' | 'bottom' | 'x%' | {number}
            top: 'center',
            // right
            // bottom
            // width:
            // height
 
            // Aspect is width / height. Inited to be geoJson bbox aspect
            // This parameter is used for scale this aspect
            aspectScale: 0.75,
 
            ///// Layout with center and size
            // If you wan't to put map in a fixed size box with right aspect ratio
            // This two properties may more conveninet
            // layoutCenter: [50%, 50%]
            // layoutSize: 100
 
 
            // 数值合并方式,默认加和,可选为:
            // 'sum' | 'average' | 'max' | 'min'
            // mapValueCalculation: 'sum',
            // 地图数值计算结果小数精度
            // mapValuePrecision: 0,
 
 
            // 显示图例颜色标识(系列标识的小圆点),图例开启时有效
            showLegendSymbol: true,
            // 选择模式,默认关闭,可选single,multiple
            // selectedMode: false,
            dataRangeHoverLink: true,
            // 是否开启缩放及漫游模式
            // roam: false,
 
            // Define left-top, right-bottom coords to control view
            // For example, [ [180, 90], [-180, -90] ],
            // higher priority than center and zoom
            boundingCoords: null,
 
            // Default on center of map
            center: null,
 
            zoom: 1,
 
            scaleLimit: null,
 
            label: {
                normal: {
                    show: false,
                    textStyle: {
                        color: '#000'
                    }
                },
                emphasis: {
                    show: true,
                    textStyle: {
                        color: 'rgb(100,0,0)'
                    }
                }
            },
            // scaleLimit: null,
            itemStyle: {
                normal: {
                    // color: 各异,
                    borderWidth: 0.5,
                    borderColor: '#444',
                    areaColor: '#eee'
                },
                // 也是选中样式
                emphasis: {
                    areaColor: 'rgba(255,215,0,0.8)'
                }
            }
        }
 
    });
 
    zrUtil.mixin(MapSeries, dataSelectableMixin);
 
    module.exports = MapSeries;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/map/MapView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/map/MapView.js

Statements: 5.45% (3 / 55)      Branches: 0% (0 / 40)      Functions: 0% (0 / 7)      Lines: 5.45% (3 / 55)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152      1   1   1                                                                                                                                                                                                                                                                                                
 
 
    // var zrUtil = require('zrender/lib/core/util');
    var graphic = require('../../util/graphic');
 
    var MapDraw = require('../../component/helper/MapDraw');
 
    require('../../echarts').extendChartView({
 
        type: 'map',
 
        render: function (mapModel, ecModel, api, payload) {
            // Not render if it is an toggleSelect action from self
            if (payload && payload.type === 'mapToggleSelect'
                && payload.from === this.uid
            ) {
                return;
            }
 
            var group = this.group;
            group.removeAll();
 
            if (mapModel.getHostGeoModel()) {
                return;
            }
 
            // Not update map if it is an roam action from self
            if (!(payload && payload.type === 'geoRoam'
                    && payload.componentType === 'series'
                    && payload.seriesId === mapModel.id
                )
            ) {
                if (mapModel.needsDrawMap) {
                    var mapDraw = this._mapDraw || new MapDraw(api, true);
                    group.add(mapDraw.group);
 
                    mapDraw.draw(mapModel, ecModel, api, this, payload);
 
                    this._mapDraw = mapDraw;
                }
                else {
                    // Remove drawed map
                    this._mapDraw && this._mapDraw.remove();
                    this._mapDraw = null;
                }
            }
            else {
                var mapDraw = this._mapDraw;
                mapDraw && group.add(mapDraw.group);
            }
 
            mapModel.get('showLegendSymbol') && ecModel.getComponent('legend')
                && this._renderSymbols(mapModel, ecModel, api);
        },
 
        remove: function () {
            this._mapDraw && this._mapDraw.remove();
            this._mapDraw = null;
            this.group.removeAll();
        },
 
        dispose: function () {
            this._mapDraw && this._mapDraw.remove();
            this._mapDraw = null;
        },
 
        _renderSymbols: function (mapModel, ecModel, api) {
            var originalData = mapModel.originalData;
            var group = this.group;
 
            originalData.each('value', function (value, idx) {
                if (isNaN(value)) {
                    return;
                }
 
                var layout = originalData.getItemLayout(idx);
 
                if (!layout || !layout.point) {
                    // Not exists in map
                    return;
                }
 
                var point = layout.point;
                var offset = layout.offset;
 
                var circle = new graphic.Circle({
                    style: {
                        // Because the special of map draw.
                        // Which needs statistic of multiple series and draw on one map.
                        // And each series also need a symbol with legend color
                        //
                        // Layout and visual are put one the different data
                        fill: mapModel.getData().getVisual('color')
                    },
                    shape: {
                        cx: point[0] + offset * 9,
                        cy: point[1],
                        r: 3
                    },
                    silent: true,
                    z2: 10
                });
 
                // First data on the same region
                if (!offset) {
                    var fullData = mapModel.mainSeries.getData();
                    var name = originalData.getName(idx);
                    var labelText = name;
                    var fullIndex = fullData.indexOfName(name);
 
                    var itemModel = originalData.getItemModel(idx);
                    var labelModel = itemModel.getModel('label.normal');
                    var hoverLabelModel = itemModel.getModel('label.emphasis');
 
                    var textStyleModel = labelModel.getModel('textStyle');
                    var hoverTextStyleModel = hoverLabelModel.getModel('textStyle');
 
                    var polygonGroups = fullData.getItemGraphicEl(fullIndex);
                    circle.setStyle({
                        textPosition: 'bottom'
                    });
 
                    var onEmphasis = function () {
                        circle.setStyle({
                            text: hoverLabelModel.get('show') ? labelText : '',
                            textFill: hoverTextStyleModel.getTextColor(),
                            textFont: hoverTextStyleModel.getFont()
                        });
                    };
 
                    var onNormal = function () {
                        circle.setStyle({
                            text: labelModel.get('show') ? labelText : '',
                            textFill: textStyleModel.getTextColor(),
                            textFont: textStyleModel.getFont()
                        });
                    };
 
                    polygonGroups.on('mouseover', onEmphasis)
                        .on('mouseout', onNormal)
                        .on('emphasis', onEmphasis)
                        .on('normal', onNormal);
 
                    onNormal();
                }
 
                group.add(circle);
            });
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/map/backwardCompat.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/map/backwardCompat.js

Statements: 22.22% (2 / 9)      Branches: 0% (0 / 4)      Functions: 0% (0 / 3)      Lines: 22.22% (2 / 9)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21    1   1                                
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    module.exports = function (option) {
        // Save geoCoord
        var mapSeries = [];
        zrUtil.each(option.series, function (seriesOpt) {
            if (seriesOpt.type === 'map') {
                mapSeries.push(seriesOpt);
            }
        });
 
        zrUtil.each(mapSeries, function (seriesOpt) {
            seriesOpt.map = seriesOpt.map || seriesOpt.mapType;
            // Put x, y, width, height, x2, y2 in the top level
            zrUtil.defaults(seriesOpt, seriesOpt.mapLocation);
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/map/mapDataStatistic.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/map/mapDataStatistic.js

Statements: 6.67% (3 / 45)      Branches: 0% (0 / 18)      Functions: 0% (0 / 8)      Lines: 6.67% (3 / 45)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84    1               1                                                                                   1                                                              
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    // FIXME 公用?
    /**
     * @param {Array.<module:echarts/data/List>} datas
     * @param {string} statisticType 'average' 'sum'
     * @inner
     */
    function dataStatistics(datas, statisticType) {
        var dataNameMap = {};
        var dims = ['value'];
 
        zrUtil.each(datas, function (data) {
            data.each(dims, function (value, idx) {
                var name = data.getName(idx);
                dataNameMap[name] = dataNameMap[name] || [];
                if (!isNaN(value)) {
                    dataNameMap[name].push(value);
                }
            });
        });
 
        return datas[0].map(dims, function (value, idx) {
            var name = datas[0].getName(idx);
            var sum = 0;
            var min = Infinity;
            var max = -Infinity;
            var len = dataNameMap[name].length;
            for (var i = 0; i < len; i++) {
                min = Math.min(min, dataNameMap[name][i]);
                max = Math.max(max, dataNameMap[name][i]);
                sum += dataNameMap[name][i];
            }
            var result;
            if (statisticType === 'min') {
                result = min;
            }
            else if (statisticType === 'max') {
                result = max;
            }
            else if (statisticType === 'average') {
                result = sum / len;
            }
            else {
                result = sum;
            }
            return len === 0 ? NaN : result;
        });
    }
 
    module.exports = function (ecModel) {
        var seriesGroups = {};
        ecModel.eachSeriesByType('map', function (seriesModel) {
            var hostGeoModel = seriesModel.getHostGeoModel();
            var key = hostGeoModel ? 'o' + hostGeoModel.id : 'i' + seriesModel.getMapType();
            (seriesGroups[key] = seriesGroups[key] || []).push(seriesModel);
        });
 
        zrUtil.each(seriesGroups, function (seriesList, key) {
            var data = dataStatistics(
                zrUtil.map(seriesList, function (seriesModel) {
                    return seriesModel.getData();
                }),
                seriesList[0].get('mapValueCalculation')
            );
 
            for (var i = 0; i < seriesList.length; i++) {
                seriesList[i].originalData = seriesList[i].getData();
            }
 
            // FIXME Put where?
            for (var i = 0; i < seriesList.length; i++) {
                seriesList[i].seriesGroup = seriesList;
                seriesList[i].needsDrawMap = i === 0 && !seriesList[i].getHostGeoModel();
 
                seriesList[i].setData(data.cloneShallow());
                seriesList[i].mainSeries = seriesList[0];
            }
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/map/mapSymbolLayout.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/map/mapSymbolLayout.js

Statements: 7.14% (2 / 28)      Branches: 0% (0 / 16)      Functions: 0% (0 / 5)      Lines: 7.14% (2 / 28)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59    1   1                                                                                                            
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    module.exports = function (ecModel) {
 
        var processedMapType = {};
 
        ecModel.eachSeriesByType('map', function (mapSeries) {
            var mapType = mapSeries.getMapType();
            if (mapSeries.getHostGeoModel() || processedMapType[mapType]) {
                return;
            }
 
            var mapSymbolOffsets = {};
 
            zrUtil.each(mapSeries.seriesGroup, function (subMapSeries) {
                var geo = subMapSeries.coordinateSystem;
                var data = subMapSeries.originalData;
                if (subMapSeries.get('showLegendSymbol') && ecModel.getComponent('legend')) {
                    data.each('value', function (value, idx) {
                        var name = data.getName(idx);
                        var region = geo.getRegion(name);
 
                        // If input series.data is [11, 22, '-'/null/undefined, 44],
                        // it will be filled with NaN: [11, 22, NaN, 44] and NaN will
                        // not be drawn. So here must validate if value is NaN.
                        if (!region || isNaN(value)) {
                            return;
                        }
 
                        var offset = mapSymbolOffsets[name] || 0;
 
                        var point = geo.dataToPoint(region.center);
 
                        mapSymbolOffsets[name] = offset + 1;
 
                        data.setItemLayout(idx, {
                            point: point,
                            offset: offset
                        });
                    });
                }
            });
 
            // Show label of those region not has legendSymbol(which is offset 0)
            var data = mapSeries.getData();
            data.each(function (idx) {
                var name = data.getName(idx);
                var layout = data.getItemLayout(idx) || {};
                layout.showLabel = !mapSymbolOffsets[name];
                data.setItemLayout(idx, layout);
            });
 
            processedMapType[mapType] = true;
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/map/mapVisual.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/map/mapVisual.js

Statements: 14.29% (1 / 7)      Branches: 0% (0 / 2)      Functions: 0% (0 / 2)      Lines: 14.29% (1 / 7)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18  1                                
 
    module.exports = function (ecModel) {
        ecModel.eachSeriesByType('map', function (seriesModel) {
            var colorList = seriesModel.get('color');
            var itemStyleModel = seriesModel.getModel('itemStyle.normal');
 
            var areaColor = itemStyleModel.get('areaColor');
            var color = itemStyleModel.get('color')
                || colorList[seriesModel.seriesIndex % colorList.length];
 
            seriesModel.getData().setVisual({
                'areaColor': areaColor,
                'color': color
            });
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/parallel/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/parallel/

Statements: 15.86% (23 / 145)      Branches: 0% (0 / 55)      Functions: 0% (0 / 28)      Lines: 15.86% (23 / 145)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/chart/parallel/
File Statements Branches Functions Lines
ParallelSeries.js 14.81% (8 / 54) 0% (0 / 28) 0% (0 / 9) 14.81% (8 / 54)
ParallelView.js 18.57% (13 / 70) 0% (0 / 20) 0% (0 / 16) 18.57% (13 / 70)
parallelVisual.js 9.52% (2 / 21) 0% (0 / 7) 0% (0 / 3) 9.52% (2 / 21)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/parallel/ParallelSeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/parallel/ParallelSeries.js

Statements: 14.81% (8 / 54)      Branches: 0% (0 / 28)      Functions: 0% (0 / 9)      Lines: 14.81% (8 / 54)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161    1 1 1 1   1                                                                                                                                                                                                                 1                                     1       1                                                  
 
 
    var List = require('../../data/List');
    var zrUtil = require('zrender/lib/core/util');
    var SeriesModel = require('../../model/Series');
    var completeDimensions = require('../../data/helper/completeDimensions');
 
    module.exports = SeriesModel.extend({
 
        type: 'series.parallel',
 
        dependencies: ['parallel'],
 
        visualColorAccessPath: 'lineStyle.normal.color',
 
        getInitialData: function (option, ecModel) {
            var parallelModel = ecModel.getComponent(
                'parallel', this.get('parallelIndex')
            );
            var parallelAxisIndices = parallelModel.parallelAxisIndex;
 
            var rawData = option.data;
            var modelDims = parallelModel.dimensions;
 
            var dataDims = generateDataDims(modelDims, rawData);
 
            var dataDimsInfo = zrUtil.map(dataDims, function (dim, dimIndex) {
 
                var modelDimsIndex = zrUtil.indexOf(modelDims, dim);
                var axisModel = modelDimsIndex >= 0 && ecModel.getComponent(
                    'parallelAxis', parallelAxisIndices[modelDimsIndex]
                );
 
                if (axisModel && axisModel.get('type') === 'category') {
                    translateCategoryValue(axisModel, dim, rawData);
                    return {name: dim, type: 'ordinal'};
                }
                else if (modelDimsIndex < 0) {
                    return completeDimensions.guessOrdinal(rawData, dimIndex)
                        ? {name: dim, type: 'ordinal'}
                        : dim;
                }
                else {
                    return dim;
                }
            });
 
            var list = new List(dataDimsInfo, this);
            list.initData(rawData);
 
            // Anication is forbiden in progressive data mode.
            if (this.option.progressive) {
                this.option.animation = false;
            }
 
            return list;
        },
 
        /**
         * User can get data raw indices on 'axisAreaSelected' event received.
         *
         * @public
         * @param {string} activeState 'active' or 'inactive' or 'normal'
         * @return {Array.<number>} Raw indices
         */
        getRawIndicesByActiveState: function (activeState) {
            var coordSys = this.coordinateSystem;
            var data = this.getData();
            var indices = [];
 
            coordSys.eachActiveState(data, function (theActiveState, dataIndex) {
                if (activeState === theActiveState) {
                    indices.push(data.getRawIndex(dataIndex));
                }
            });
 
            return indices;
        },
 
        defaultOption: {
            zlevel: 0,                  // 一级层叠
            z: 2,                       // 二级层叠
 
            coordinateSystem: 'parallel',
            parallelIndex: 0,
 
            label: {
                normal: {
                    show: false
                },
                emphasis: {
                    show: false
                }
            },
 
            inactiveOpacity: 0.05,
            activeOpacity: 1,
 
            lineStyle: {
                normal: {
                    width: 1,
                    opacity: 0.45,
                    type: 'solid'
                }
            },
            progressive: false, // 100
            smooth: false,
 
            animationEasing: 'linear'
        }
    });
 
    function translateCategoryValue(axisModel, dim, rawData) {
        var axisData = axisModel.get('data');
        var numberDim = convertDimNameToNumber(dim);
 
        if (axisData && axisData.length) {
            zrUtil.each(rawData, function (dataItem) {
                if (!dataItem) {
                    return;
                }
                // FIXME
                // time consuming, should use hash?
                var index = zrUtil.indexOf(axisData, dataItem[numberDim]);
                dataItem[numberDim] = index >= 0 ? index : NaN;
            });
        }
        // FIXME
        // 如果没有设置axis data, 应自动算出,或者提示。
    }
 
    function convertDimNameToNumber(dimName) {
        return +dimName.replace('dim', '');
    }
 
    function generateDataDims(modelDims, rawData) {
        // parallelModel.dimension should not be regarded as data
        // dimensions. Consider dimensions = ['dim4', 'dim2', 'dim6'];
 
        // We detect max dim by parallelModel.dimensions and fist
        // item in rawData arbitrarily.
        var maxDimNum = 0;
        zrUtil.each(modelDims, function (dimName) {
            var numberDim = convertDimNameToNumber(dimName);
            numberDim > maxDimNum && (maxDimNum = numberDim);
        });
 
        var firstItem = rawData[0];
        if (firstItem && firstItem.length - 1 > maxDimNum) {
            maxDimNum = firstItem.length - 1;
        }
 
        var dataDims = [];
        for (var i = 0; i <= maxDimNum; i++) {
            dataDims.push('dim' + i);
        }
 
        return dataDims;
    }
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/parallel/ParallelView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/parallel/ParallelView.js

Statements: 18.57% (13 / 70)      Branches: 0% (0 / 20)      Functions: 0% (0 / 16)      Lines: 18.57% (13 / 70)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240    1 1   1   1                                                                                                                                                 1       1               1                                                                                               1                                             1                       1                     1                                                                                         1           1    
 
 
    var graphic = require('../../util/graphic');
    var zrUtil = require('zrender/lib/core/util');
 
    var SMOOTH = 0.3;
 
    var ParallelView = require('../../view/Chart').extend({
 
        type: 'parallel',
 
        init: function () {
 
            /**
             * @type {module:zrender/container/Group}
             * @private
             */
            this._dataGroup = new graphic.Group();
 
            this.group.add(this._dataGroup);
 
            /**
             * @type {module:echarts/data/List}
             */
            this._data;
        },
 
        /**
         * @override
         */
        render: function (seriesModel, ecModel, api, payload) {
            this._renderForNormal(seriesModel, payload);
            // this[
            //     seriesModel.option.progressive
            //         ? '_renderForProgressive'
            //         : '_renderForNormal'
            // ](seriesModel);
        },
 
        dispose: function () {},
 
        /**
         * @private
         */
        _renderForNormal: function (seriesModel, payload) {
            var dataGroup = this._dataGroup;
            var data = seriesModel.getData();
            var oldData = this._data;
            var coordSys = seriesModel.coordinateSystem;
            var dimensions = coordSys.dimensions;
            var option = seriesModel.option;
            var smooth = option.smooth ? SMOOTH : null;
 
            // Consider switch between progressive and not.
            // oldData && oldData.__plProgressive && dataGroup.removeAll();
 
            data.diff(oldData)
                .add(add)
                .update(update)
                .remove(remove)
                .execute();
 
            // Update style
            updateElCommon(data, smooth);
 
            // First create
            if (!this._data) {
                var clipPath = createGridClipShape(
                    coordSys, seriesModel, function () {
                        // Callback will be invoked immediately if there is no animation
                        setTimeout(function () {
                            dataGroup.removeClipPath();
                        });
                    }
                );
                dataGroup.setClipPath(clipPath);
            }
 
            this._data = data;
 
            function add(newDataIndex) {
                addEl(data, dataGroup, newDataIndex, dimensions, coordSys, null, smooth);
            }
 
            function update(newDataIndex, oldDataIndex) {
                var line = oldData.getItemGraphicEl(oldDataIndex);
                var points = createLinePoints(data, newDataIndex, dimensions, coordSys);
                data.setItemGraphicEl(newDataIndex, line);
                var animationModel = (payload && payload.animation === false) ? null : seriesModel;
                graphic.updateProps(line, {shape: {points: points}}, animationModel, newDataIndex);
            }
 
            function remove(oldDataIndex) {
                var line = oldData.getItemGraphicEl(oldDataIndex);
                dataGroup.remove(line);
            }
 
        },
 
        /**
         * @private
         */
        // _renderForProgressive: function (seriesModel) {
        //     var dataGroup = this._dataGroup;
        //     var data = seriesModel.getData();
        //     var oldData = this._data;
        //     var coordSys = seriesModel.coordinateSystem;
        //     var dimensions = coordSys.dimensions;
        //     var option = seriesModel.option;
        //     var progressive = option.progressive;
        //     var smooth = option.smooth ? SMOOTH : null;
 
        //     // In progressive animation is disabled, so use simple data diff,
        //     // which effects performance less.
        //     // (Typically performance for data with length 7000+ like:
        //     // simpleDiff: 60ms, addEl: 184ms,
        //     // in RMBP 2.4GHz intel i7, OSX 10.9 chrome 50.0.2661.102 (64-bit))
        //     if (simpleDiff(oldData, data, dimensions)) {
        //         dataGroup.removeAll();
        //         data.each(function (dataIndex) {
        //             addEl(data, dataGroup, dataIndex, dimensions, coordSys);
        //         });
        //     }
 
        //     updateElCommon(data, progressive, smooth);
 
        //     // Consider switch between progressive and not.
        //     data.__plProgressive = true;
        //     this._data = data;
        // },
 
        /**
         * @override
         */
        remove: function () {
            this._dataGroup && this._dataGroup.removeAll();
            this._data = null;
        }
    });
 
    function createGridClipShape(coordSys, seriesModel, cb) {
        var parallelModel = coordSys.model;
        var rect = coordSys.getRect();
        var rectEl = new graphic.Rect({
            shape: {
                x: rect.x,
                y: rect.y,
                width: rect.width,
                height: rect.height
            }
        });
 
        var dim = parallelModel.get('layout') === 'horizontal' ? 'width' : 'height';
        rectEl.setShape(dim, 0);
        graphic.initProps(rectEl, {
            shape: {
                width: rect.width,
                height: rect.height
            }
        }, seriesModel, cb);
        return rectEl;
    }
 
    function createLinePoints(data, dataIndex, dimensions, coordSys) {
        var points = [];
        for (var i = 0; i < dimensions.length; i++) {
            var dimName = dimensions[i];
            var value = data.get(dimName, dataIndex);
            if (!isEmptyValue(value, coordSys.getAxis(dimName).type)) {
                points.push(coordSys.dataToPoint(value, dimName));
            }
        }
        return points;
    }
 
    function addEl(data, dataGroup, dataIndex, dimensions, coordSys) {
        var points = createLinePoints(data, dataIndex, dimensions, coordSys);
        var line = new graphic.Polyline({
            shape: {points: points},
            silent: true,
            z2: 10
        });
        dataGroup.add(line);
        data.setItemGraphicEl(dataIndex, line);
    }
 
    function updateElCommon(data, smooth) {
        var seriesStyleModel = data.hostModel.getModel('lineStyle.normal');
        var lineStyle = seriesStyleModel.getLineStyle();
        data.eachItemGraphicEl(function (line, dataIndex) {
            if (data.hasItemOption) {
                var itemModel = data.getItemModel(dataIndex);
                var lineStyleModel = itemModel.getModel('lineStyle.normal', seriesStyleModel);
                lineStyle = lineStyleModel.getLineStyle(['color', 'stroke']);
            }
 
            line.useStyle(zrUtil.extend(lineStyle, {
                fill: null,
                // lineStyle.color have been set to itemVisual in module:echarts/visual/seriesColor.
                stroke: data.getItemVisual(dataIndex, 'color'),
                // lineStyle.opacity have been set to itemVisual in parallelVisual.
                opacity: data.getItemVisual(dataIndex, 'opacity')
            }));
 
            line.shape.smooth = smooth;
        });
    }
 
    // function simpleDiff(oldData, newData, dimensions) {
    //     var oldLen;
    //     if (!oldData
    //         || !oldData.__plProgressive
    //         || (oldLen = oldData.count()) !== newData.count()
    //     ) {
    //         return true;
    //     }
 
    //     var dimLen = dimensions.length;
    //     for (var i = 0; i < oldLen; i++) {
    //         for (var j = 0; j < dimLen; j++) {
    //             if (oldData.get(dimensions[j], i) !== newData.get(dimensions[j], i)) {
    //                 return true;
    //             }
    //         }
    //     }
 
    //     return false;
    // }
 
    // FIXME
    // 公用方法?
    function isEmptyValue(val, axisType) {
        return axisType === 'category'
            ? val == null
            : (val == null || isNaN(val)); // axisType === 'value'
    }
 
    module.exports = ParallelView;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/parallel/parallelVisual.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/parallel/parallelVisual.js

Statements: 9.52% (2 / 21)      Branches: 0% (0 / 7)      Functions: 0% (0 / 3)      Lines: 9.52% (2 / 21)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43    1   1                                                                            
 
 
    var opacityAccessPath = ['lineStyle', 'normal', 'opacity'];
 
    module.exports = function (ecModel) {
 
        ecModel.eachSeriesByType('parallel', function (seriesModel) {
 
            var itemStyleModel = seriesModel.getModel('itemStyle.normal');
            var lineStyleModel = seriesModel.getModel('lineStyle.normal');
            var globalColors = ecModel.get('color');
 
            var color = lineStyleModel.get('color')
                || itemStyleModel.get('color')
                || globalColors[seriesModel.seriesIndex % globalColors.length];
            var inactiveOpacity = seriesModel.get('inactiveOpacity');
            var activeOpacity = seriesModel.get('activeOpacity');
            var lineStyle = seriesModel.getModel('lineStyle.normal').getLineStyle();
 
            var coordSys = seriesModel.coordinateSystem;
            var data = seriesModel.getData();
 
            var opacityMap = {
                normal: lineStyle.opacity,
                active: activeOpacity,
                inactive: inactiveOpacity
            };
 
            coordSys.eachActiveState(data, function (activeState, dataIndex) {
                var itemModel = data.getItemModel(dataIndex);
                var opacity = opacityMap[activeState];
                if (activeState === 'normal') {
                    var itemOpacity = itemModel.get(opacityAccessPath, true);
                    itemOpacity != null && (opacity = itemOpacity);
                }
                data.setItemVisual(dataIndex, 'opacity', opacity);
            });
 
            data.setVisual('color', color);
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/pie/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/pie/

Statements: 10.56% (38 / 360)      Branches: 0% (0 / 157)      Functions: 0% (0 / 39)      Lines: 10.56% (38 / 360)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/chart/pie/
File Statements Branches Functions Lines
PieSeries.js 26.67% (8 / 30) 0% (0 / 6) 0% (0 / 6) 26.67% (8 / 30)
PieView.js 10.96% (16 / 146) 0% (0 / 50) 0% (0 / 20) 10.96% (16 / 146)
labelLayout.js 5.93% (7 / 118) 0% (0 / 71) 0% (0 / 8) 5.93% (7 / 118)
pieLayout.js 10.61% (7 / 66) 0% (0 / 30) 0% (0 / 5) 10.61% (7 / 66)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/pie/PieSeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/pie/PieSeries.js

Statements: 26.67% (8 / 30)      Branches: 0% (0 / 6)      Functions: 0% (0 / 6)      Lines: 26.67% (8 / 30)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146      1 1 1 1   1   1                                                                                                                                                                                                                                                                     1   1    
'use strict';
 
 
    var List = require('../../data/List');
    var zrUtil = require('zrender/lib/core/util');
    var modelUtil = require('../../util/model');
    var completeDimensions = require('../../data/helper/completeDimensions');
 
    var dataSelectableMixin = require('../../component/helper/selectableMixin');
 
    var PieSeries = require('../../echarts').extendSeriesModel({
 
        type: 'series.pie',
 
        // Overwrite
        init: function (option) {
            PieSeries.superApply(this, 'init', arguments);
 
            // Enable legend selection for each data item
            // Use a function instead of direct access because data reference may changed
            this.legendDataProvider = function () {
                return this.getRawData();
            };
 
            this.updateSelectedMap(option.data);
 
            this._defaultLabelLine(option);
        },
 
        // Overwrite
        mergeOption: function (newOption) {
            PieSeries.superCall(this, 'mergeOption', newOption);
            this.updateSelectedMap(this.option.data);
        },
 
        getInitialData: function (option, ecModel) {
            var dimensions = completeDimensions(['value'], option.data);
            var list = new List(dimensions, this);
            list.initData(option.data);
            return list;
        },
 
        // Overwrite
        getDataParams: function (dataIndex) {
            var data = this.getData();
            var params = PieSeries.superCall(this, 'getDataParams', dataIndex);
            var sum = data.getSum('value');
            // FIXME toFixed?
            //
            // Percent is 0 if sum is 0
            params.percent = !sum ? 0 : +(data.get('value', dataIndex) / sum * 100).toFixed(2);
 
            params.$vars.push('percent');
            return params;
        },
 
        _defaultLabelLine: function (option) {
            // Extend labelLine emphasis
            modelUtil.defaultEmphasis(option.labelLine, ['show']);
 
            var labelLineNormalOpt = option.labelLine.normal;
            var labelLineEmphasisOpt = option.labelLine.emphasis;
            // Not show label line if `label.normal.show = false`
            labelLineNormalOpt.show = labelLineNormalOpt.show
                && option.label.normal.show;
            labelLineEmphasisOpt.show = labelLineEmphasisOpt.show
                && option.label.emphasis.show;
        },
 
        defaultOption: {
            zlevel: 0,
            z: 2,
            legendHoverLink: true,
 
            hoverAnimation: true,
            // 默认全局居中
            center: ['50%', '50%'],
            radius: [0, '75%'],
            // 默认顺时针
            clockwise: true,
            startAngle: 90,
            // 最小角度改为0
            minAngle: 0,
            // 选中是扇区偏移量
            selectedOffset: 10,
 
            // If use strategy to avoid label overlapping
            avoidLabelOverlap: true,
            // 选择模式,默认关闭,可选single,multiple
            // selectedMode: false,
            // 南丁格尔玫瑰图模式,'radius'(半径) | 'area'(面积)
            // roseType: null,
 
            // If still show when all data zero.
            stillShowZeroSum: true,
 
            label: {
                normal: {
                    // If rotate around circle
                    rotate: false,
                    show: true,
                    // 'outer', 'inside', 'center'
                    position: 'outer'
                    // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调
                    // textStyle: null      // 默认使用全局文本样式,详见TEXTSTYLE
                    // distance: 当position为inner时有效,为label位置到圆心的距离与圆半径(环状图为内外半径和)的比例系数
                },
                emphasis: {}
            },
            // Enabled when label.normal.position is 'outer'
            labelLine: {
                normal: {
                    show: true,
                    // 引导线两段中的第一段长度
                    length: 15,
                    // 引导线两段中的第二段长度
                    length2: 15,
                    smooth: false,
                    lineStyle: {
                        // color: 各异,
                        width: 1,
                        type: 'solid'
                    }
                }
            },
            itemStyle: {
                normal: {
                    borderWidth: 1
                },
                emphasis: {}
            },
 
            // Animation type canbe expansion, scale
            animationType: 'expansion',
 
            animationEasing: 'cubicOut',
 
            data: []
        }
    });
 
    zrUtil.mixin(PieSeries, dataSelectableMixin);
 
    module.exports = PieSeries;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/pie/PieView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/pie/PieView.js

Statements: 10.96% (16 / 146)      Branches: 0% (0 / 50)      Functions: 0% (0 / 20)      Lines: 10.96% (16 / 146)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402    1 1             1                                                               1                                               1                               1       1                   1   1                           1                                                                                                                             1                   1                                           1                                                                                                                                         1       1                                                                                                                                                                                                                                             1    
 
 
    var graphic = require('../../util/graphic');
    var zrUtil = require('zrender/lib/core/util');
 
    /**
     * @param {module:echarts/model/Series} seriesModel
     * @param {boolean} hasAnimation
     * @inner
     */
    function updateDataSelected(uid, seriesModel, hasAnimation, api) {
        var data = seriesModel.getData();
        var dataIndex = this.dataIndex;
        var name = data.getName(dataIndex);
        var selectedOffset = seriesModel.get('selectedOffset');
 
        api.dispatchAction({
            type: 'pieToggleSelect',
            from: uid,
            name: name,
            seriesId: seriesModel.id
        });
 
        data.each(function (idx) {
            toggleItemSelected(
                data.getItemGraphicEl(idx),
                data.getItemLayout(idx),
                seriesModel.isSelected(data.getName(idx)),
                selectedOffset,
                hasAnimation
            );
        });
    }
 
    /**
     * @param {module:zrender/graphic/Sector} el
     * @param {Object} layout
     * @param {boolean} isSelected
     * @param {number} selectedOffset
     * @param {boolean} hasAnimation
     * @inner
     */
    function toggleItemSelected(el, layout, isSelected, selectedOffset, hasAnimation) {
        var midAngle = (layout.startAngle + layout.endAngle) / 2;
 
        var dx = Math.cos(midAngle);
        var dy = Math.sin(midAngle);
 
        var offset = isSelected ? selectedOffset : 0;
        var position = [dx * offset, dy * offset];
 
        hasAnimation
            // animateTo will stop revious animation like update transition
            ? el.animate()
                .when(200, {
                    position: position
                })
                .start('bounceOut')
            : el.attr('position', position);
    }
 
    /**
     * Piece of pie including Sector, Label, LabelLine
     * @constructor
     * @extends {module:zrender/graphic/Group}
     */
    function PiePiece(data, idx) {
 
        graphic.Group.call(this);
 
        var sector = new graphic.Sector({
            z2: 2
        });
        var polyline = new graphic.Polyline();
        var text = new graphic.Text();
        this.add(sector);
        this.add(polyline);
        this.add(text);
 
        this.updateData(data, idx, true);
 
        // Hover to change label and labelLine
        function onEmphasis() {
            polyline.ignore = polyline.hoverIgnore;
            text.ignore = text.hoverIgnore;
        }
        function onNormal() {
            polyline.ignore = polyline.normalIgnore;
            text.ignore = text.normalIgnore;
        }
        this.on('emphasis', onEmphasis)
            .on('normal', onNormal)
            .on('mouseover', onEmphasis)
            .on('mouseout', onNormal);
    }
 
    var piePieceProto = PiePiece.prototype;
 
    function getLabelStyle(data, idx, state, labelModel, labelPosition) {
        var textStyleModel = labelModel.getModel('textStyle');
        var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner';
        return {
            fill: textStyleModel.getTextColor()
                || (isLabelInside ? '#fff' : data.getItemVisual(idx, 'color')),
            opacity: data.getItemVisual(idx, 'opacity'),
            textFont: textStyleModel.getFont(),
            text: zrUtil.retrieve(
                data.hostModel.getFormattedLabel(idx, state), data.getName(idx)
            )
        };
    }
 
    piePieceProto.updateData = function (data, idx, firstCreate) {
 
        var sector = this.childAt(0);
 
        var seriesModel = data.hostModel;
        var itemModel = data.getItemModel(idx);
        var layout = data.getItemLayout(idx);
        var sectorShape = zrUtil.extend({}, layout);
        sectorShape.label = null;
 
        if (firstCreate) {
            sector.setShape(sectorShape);
 
            var animationType = seriesModel.getShallow('animationType');
            if (animationType === 'scale') {
                sector.shape.r = layout.r0;
                graphic.initProps(sector, {
                    shape: {
                        r: layout.r
                    }
                }, seriesModel, idx);
            }
            // Expansion
            else {
                sector.shape.endAngle = layout.startAngle;
                graphic.updateProps(sector, {
                    shape: {
                        endAngle: layout.endAngle
                    }
                }, seriesModel, idx);
            }
 
        }
        else {
            graphic.updateProps(sector, {
                shape: sectorShape
            }, seriesModel, idx);
        }
 
        // Update common style
        var itemStyleModel = itemModel.getModel('itemStyle');
        var visualColor = data.getItemVisual(idx, 'color');
 
        sector.useStyle(
            zrUtil.defaults(
                {
                    lineJoin: 'bevel',
                    fill: visualColor
                },
                itemStyleModel.getModel('normal').getItemStyle()
            )
        );
        sector.hoverStyle = itemStyleModel.getModel('emphasis').getItemStyle();
 
        // Toggle selected
        toggleItemSelected(
            this,
            data.getItemLayout(idx),
            itemModel.get('selected'),
            seriesModel.get('selectedOffset'),
            seriesModel.get('animation')
        );
 
        function onEmphasis() {
            // Sector may has animation of updating data. Force to move to the last frame
            // Or it may stopped on the wrong shape
            sector.stopAnimation(true);
            sector.animateTo({
                shape: {
                    r: layout.r + 10
                }
            }, 300, 'elasticOut');
        }
        function onNormal() {
            sector.stopAnimation(true);
            sector.animateTo({
                shape: {
                    r: layout.r
                }
            }, 300, 'elasticOut');
        }
        sector.off('mouseover').off('mouseout').off('emphasis').off('normal');
        if (itemModel.get('hoverAnimation') && seriesModel.isAnimationEnabled()) {
            sector
                .on('mouseover', onEmphasis)
                .on('mouseout', onNormal)
                .on('emphasis', onEmphasis)
                .on('normal', onNormal);
        }
 
        this._updateLabel(data, idx);
 
        graphic.setHoverStyle(this);
    };
 
    piePieceProto._updateLabel = function (data, idx) {
 
        var labelLine = this.childAt(1);
        var labelText = this.childAt(2);
 
        var seriesModel = data.hostModel;
        var itemModel = data.getItemModel(idx);
        var layout = data.getItemLayout(idx);
        var labelLayout = layout.label;
        var visualColor = data.getItemVisual(idx, 'color');
 
        graphic.updateProps(labelLine, {
            shape: {
                points: labelLayout.linePoints || [
                    [labelLayout.x, labelLayout.y], [labelLayout.x, labelLayout.y], [labelLayout.x, labelLayout.y]
                ]
            }
        }, seriesModel, idx);
 
        graphic.updateProps(labelText, {
            style: {
                x: labelLayout.x,
                y: labelLayout.y
            }
        }, seriesModel, idx);
        labelText.attr({
            style: {
                textVerticalAlign: labelLayout.verticalAlign,
                textAlign: labelLayout.textAlign,
                textFont: labelLayout.font
            },
            rotation: labelLayout.rotation,
            origin: [labelLayout.x, labelLayout.y],
            z2: 10
        });
 
        var labelModel = itemModel.getModel('label.normal');
        var labelHoverModel = itemModel.getModel('label.emphasis');
        var labelLineModel = itemModel.getModel('labelLine.normal');
        var labelLineHoverModel = itemModel.getModel('labelLine.emphasis');
        var labelPosition = labelModel.get('position') || labelHoverModel.get('position');
 
        labelText.setStyle(getLabelStyle(data, idx, 'normal', labelModel, labelPosition));
 
        labelText.ignore = labelText.normalIgnore = !labelModel.get('show');
        labelText.hoverIgnore = !labelHoverModel.get('show');
 
        labelLine.ignore = labelLine.normalIgnore = !labelLineModel.get('show');
        labelLine.hoverIgnore = !labelLineHoverModel.get('show');
 
        // Default use item visual color
        labelLine.setStyle({
            stroke: visualColor,
            opacity: data.getItemVisual(idx, 'opacity')
        });
        labelLine.setStyle(labelLineModel.getModel('lineStyle').getLineStyle());
 
        labelText.hoverStyle = getLabelStyle(data, idx, 'emphasis', labelHoverModel, labelPosition);
        labelLine.hoverStyle = labelLineHoverModel.getModel('lineStyle').getLineStyle();
 
        var smooth = labelLineModel.get('smooth');
        if (smooth && smooth === true) {
            smooth = 0.4;
        }
        labelLine.setShape({
            smooth: smooth
        });
    };
 
    zrUtil.inherits(PiePiece, graphic.Group);
 
 
    // Pie view
    var Pie = require('../../view/Chart').extend({
 
        type: 'pie',
 
        init: function () {
            var sectorGroup = new graphic.Group();
            this._sectorGroup = sectorGroup;
        },
 
        render: function (seriesModel, ecModel, api, payload) {
            if (payload && (payload.from === this.uid)) {
                return;
            }
 
            var data = seriesModel.getData();
            var oldData = this._data;
            var group = this.group;
 
            var hasAnimation = ecModel.get('animation');
            var isFirstRender = !oldData;
            var animationType = seriesModel.get('animationType');
 
            var onSectorClick = zrUtil.curry(
                updateDataSelected, this.uid, seriesModel, hasAnimation, api
            );
 
            var selectedMode = seriesModel.get('selectedMode');
 
            data.diff(oldData)
                .add(function (idx) {
                    var piePiece = new PiePiece(data, idx);
                    // Default expansion animation
                    if (isFirstRender && animationType !== 'scale') {
                        piePiece.eachChild(function (child) {
                            child.stopAnimation(true);
                        });
                    }
 
                    selectedMode && piePiece.on('click', onSectorClick);
 
                    data.setItemGraphicEl(idx, piePiece);
 
                    group.add(piePiece);
                })
                .update(function (newIdx, oldIdx) {
                    var piePiece = oldData.getItemGraphicEl(oldIdx);
 
                    piePiece.updateData(data, newIdx);
 
                    piePiece.off('click');
                    selectedMode && piePiece.on('click', onSectorClick);
                    group.add(piePiece);
                    data.setItemGraphicEl(newIdx, piePiece);
                })
                .remove(function (idx) {
                    var piePiece = oldData.getItemGraphicEl(idx);
                    group.remove(piePiece);
                })
                .execute();
 
            if (
                hasAnimation && isFirstRender && data.count() > 0
                // Default expansion animation
                && animationType !== 'scale'
            ) {
                var shape = data.getItemLayout(0);
                var r = Math.max(api.getWidth(), api.getHeight()) / 2;
 
                var removeClipPath = zrUtil.bind(group.removeClipPath, group);
                group.setClipPath(this._createClipPath(
                    shape.cx, shape.cy, r, shape.startAngle, shape.clockwise, removeClipPath, seriesModel
                ));
            }
 
            this._data = data;
        },
 
        dispose: function () {},
 
        _createClipPath: function (
            cx, cy, r, startAngle, clockwise, cb, seriesModel
        ) {
            var clipPath = new graphic.Sector({
                shape: {
                    cx: cx,
                    cy: cy,
                    r0: 0,
                    r: r,
                    startAngle: startAngle,
                    endAngle: startAngle,
                    clockwise: clockwise
                }
            });
 
            graphic.initProps(clipPath, {
                shape: {
                    endAngle: startAngle + (clockwise ? 1 : -1) * Math.PI * 2
                }
            }, seriesModel, cb);
 
            return clipPath;
        },
 
        /**
         * @implement
         */
        containPoint: function (point, seriesModel) {
            var data = seriesModel.getData();
            var itemLayout = data.getItemLayout(0);
            if (itemLayout) {
                var dx = point[0] - itemLayout.cx;
                var dy = point[1] - itemLayout.cy;
                var radius = Math.sqrt(dx * dx + dy * dy);
                return radius <= itemLayout.r && radius >= itemLayout.r0;
            }
        }
 
    });
 
    module.exports = Pie;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/pie/labelLayout.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/pie/labelLayout.js

Statements: 5.93% (7 / 118)      Branches: 0% (0 / 71)      Functions: 0% (0 / 8)      Lines: 5.93% (7 / 118)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227        1   1           1                               1                     1                                                                                                                               1                                                             1                                                                                                                                                                                        
'use strict';
// FIXME emphasis label position is not same with normal label position
 
 
    var textContain = require('zrender/lib/contain/text');
 
    function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight) {
        list.sort(function (a, b) {
            return a.y - b.y;
        });
 
        // 压
        function shiftDown(start, end, delta, dir) {
            for (var j = start; j < end; j++) {
                list[j].y += delta;
                if (j > start
                    && j + 1 < end
                    && list[j + 1].y > list[j].y + list[j].height
                ) {
                    shiftUp(j, delta / 2);
                    return;
                }
            }
 
            shiftUp(end - 1, delta / 2);
        }
 
        // 弹
        function shiftUp(end, delta) {
            for (var j = end; j >= 0; j--) {
                list[j].y -= delta;
                if (j > 0
                    && list[j].y > list[j - 1].y + list[j - 1].height
                ) {
                    break;
                }
            }
        }
 
        function changeX(list, isDownList, cx, cy, r, dir) {
            var lastDeltaX = dir > 0
                ? isDownList                // 右侧
                    ? Number.MAX_VALUE      // 下
                    : 0                     // 上
                : isDownList                // 左侧
                    ? Number.MAX_VALUE      // 下
                    : 0;                    // 上
 
            for (var i = 0, l = list.length; i < l; i++) {
                // Not change x for center label
                if (list[i].position === 'center') {
                    continue;
                }
                var deltaY = Math.abs(list[i].y - cy);
                var length = list[i].len;
                var length2 = list[i].len2;
                var deltaX = (deltaY < r + length)
                    ? Math.sqrt(
                          (r + length + length2) * (r + length + length2)
                          - deltaY * deltaY
                      )
                    : Math.abs(list[i].x - cx);
                if (isDownList && deltaX >= lastDeltaX) {
                    // 右下,左下
                    deltaX = lastDeltaX - 10;
                }
                if (!isDownList && deltaX <= lastDeltaX) {
                    // 右上,左上
                    deltaX = lastDeltaX + 10;
                }
 
                list[i].x = cx + deltaX * dir;
                lastDeltaX = deltaX;
            }
        }
 
        var lastY = 0;
        var delta;
        var len = list.length;
        var upList = [];
        var downList = [];
        for (var i = 0; i < len; i++) {
            delta = list[i].y - lastY;
            if (delta < 0) {
                shiftDown(i, len, -delta, dir);
            }
            lastY = list[i].y + list[i].height;
        }
        if (viewHeight - lastY < 0) {
            shiftUp(len - 1, lastY - viewHeight);
        }
        for (var i = 0; i < len; i++) {
            if (list[i].y >= cy) {
                downList.push(list[i]);
            }
            else {
                upList.push(list[i]);
            }
        }
        changeX(upList, false, cx, cy, r, dir);
        changeX(downList, true, cx, cy, r, dir);
    }
 
    function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight) {
        var leftList = [];
        var rightList = [];
        for (var i = 0; i < labelLayoutList.length; i++) {
            if (labelLayoutList[i].x < cx) {
                leftList.push(labelLayoutList[i]);
            }
            else {
                rightList.push(labelLayoutList[i]);
            }
        }
 
        adjustSingleSide(rightList, cx, cy, r, 1, viewWidth, viewHeight);
        adjustSingleSide(leftList, cx, cy, r, -1, viewWidth, viewHeight);
 
        for (var i = 0; i < labelLayoutList.length; i++) {
            var linePoints = labelLayoutList[i].linePoints;
            if (linePoints) {
                var dist = linePoints[1][0] - linePoints[2][0];
                if (labelLayoutList[i].x < cx) {
                    linePoints[2][0] = labelLayoutList[i].x + 3;
                }
                else {
                    linePoints[2][0] = labelLayoutList[i].x - 3;
                }
                linePoints[1][1] = linePoints[2][1] = labelLayoutList[i].y;
                linePoints[1][0] = linePoints[2][0] + dist;
            }
        }
    }
 
    module.exports = function (seriesModel, r, viewWidth, viewHeight) {
        var data = seriesModel.getData();
        var labelLayoutList = [];
        var cx;
        var cy;
        var hasLabelRotate = false;
 
        data.each(function (idx) {
            var layout = data.getItemLayout(idx);
 
            var itemModel = data.getItemModel(idx);
            var labelModel = itemModel.getModel('label.normal');
            // Use position in normal or emphasis
            var labelPosition = labelModel.get('position') || itemModel.get('label.emphasis.position');
 
            var labelLineModel = itemModel.getModel('labelLine.normal');
            var labelLineLen = labelLineModel.get('length');
            var labelLineLen2 = labelLineModel.get('length2');
 
            var midAngle = (layout.startAngle + layout.endAngle) / 2;
            var dx = Math.cos(midAngle);
            var dy = Math.sin(midAngle);
 
            var textX;
            var textY;
            var linePoints;
            var textAlign;
 
            cx = layout.cx;
            cy = layout.cy;
 
            var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner';
            if (labelPosition === 'center') {
                textX = layout.cx;
                textY = layout.cy;
                textAlign = 'center';
            }
            else {
                var x1 = (isLabelInside ? (layout.r + layout.r0) / 2 * dx : layout.r * dx) + cx;
                var y1 = (isLabelInside ? (layout.r + layout.r0) / 2 * dy : layout.r * dy) + cy;
 
                textX = x1 + dx * 3;
                textY = y1 + dy * 3;
 
                if (!isLabelInside) {
                    // For roseType
                    var x2 = x1 + dx * (labelLineLen + r - layout.r);
                    var y2 = y1 + dy * (labelLineLen + r - layout.r);
                    var x3 = x2 + ((dx < 0 ? -1 : 1) * labelLineLen2);
                    var y3 = y2;
 
                    textX = x3 + (dx < 0 ? -5 : 5);
                    textY = y3;
                    linePoints = [[x1, y1], [x2, y2], [x3, y3]];
                }
 
                textAlign = isLabelInside ? 'center' : (dx > 0 ? 'left' : 'right');
            }
            var font = labelModel.getModel('textStyle').getFont();
 
            var labelRotate = labelModel.get('rotate')
                ? (dx < 0 ? -midAngle + Math.PI : -midAngle) : 0;
            var text = seriesModel.getFormattedLabel(idx, 'normal')
                        || data.getName(idx);
            var textRect = textContain.getBoundingRect(
                text, font, textAlign, 'top'
            );
            hasLabelRotate = !!labelRotate;
            layout.label = {
                x: textX,
                y: textY,
                position: labelPosition,
                height: textRect.height,
                len: labelLineLen,
                len2: labelLineLen2,
                linePoints: linePoints,
                textAlign: textAlign,
                verticalAlign: 'middle',
                font: font,
                rotation: labelRotate
            };
 
            // Not layout the inside label
            if (!isLabelInside) {
                labelLayoutList.push(layout.label);
            }
        });
        if (!hasLabelRotate && seriesModel.get('avoidLabelOverlap')) {
            avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight);
        }
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/pie/pieLayout.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/pie/pieLayout.js

Statements: 10.61% (7 / 66)      Branches: 0% (0 / 30)      Functions: 0% (0 / 5)      Lines: 10.61% (7 / 66)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142        1 1 1 1   1 1   1                                                                                                                                                                                                                                                                  
// TODO minAngle
 
 
 
    var numberUtil = require('../../util/number');
    var parsePercent = numberUtil.parsePercent;
    var labelLayout = require('./labelLayout');
    var zrUtil = require('zrender/lib/core/util');
 
    var PI2 = Math.PI * 2;
    var RADIAN = Math.PI / 180;
 
    module.exports = function (seriesType, ecModel, api, payload) {
        ecModel.eachSeriesByType(seriesType, function (seriesModel) {
            var center = seriesModel.get('center');
            var radius = seriesModel.get('radius');
 
            if (!zrUtil.isArray(radius)) {
                radius = [0, radius];
            }
            if (!zrUtil.isArray(center)) {
                center = [center, center];
            }
 
            var width = api.getWidth();
            var height = api.getHeight();
            var size = Math.min(width, height);
            var cx = parsePercent(center[0], width);
            var cy = parsePercent(center[1], height);
            var r0 = parsePercent(radius[0], size / 2);
            var r = parsePercent(radius[1], size / 2);
 
            var data = seriesModel.getData();
 
            var startAngle = -seriesModel.get('startAngle') * RADIAN;
 
            var minAngle = seriesModel.get('minAngle') * RADIAN;
 
            var sum = data.getSum('value');
            // Sum may be 0
            var unitRadian = Math.PI / (sum || data.count()) * 2;
 
            var clockwise = seriesModel.get('clockwise');
 
            var roseType = seriesModel.get('roseType');
            var stillShowZeroSum = seriesModel.get('stillShowZeroSum');
 
            // [0...max]
            var extent = data.getDataExtent('value');
            extent[0] = 0;
 
            // In the case some sector angle is smaller than minAngle
            var restAngle = PI2;
            var valueSumLargerThanMinAngle = 0;
 
            var currentAngle = startAngle;
 
            var dir = clockwise ? 1 : -1;
            data.each('value', function (value, idx) {
                var angle;
                if (isNaN(value)) {
                    data.setItemLayout(idx, {
                        angle: NaN,
                        startAngle: NaN,
                        endAngle: NaN,
                        clockwise: clockwise,
                        cx: cx,
                        cy: cy,
                        r0: r0,
                        r: roseType
                            ? NaN
                            : r
                    });
                    return;
                }
 
                // FIXME 兼容 2.0 但是 roseType 是 area 的时候才是这样?
                if (roseType !== 'area') {
                    angle = (sum === 0 && stillShowZeroSum)
                        ? unitRadian : (value * unitRadian);
                }
                else {
                    angle = PI2 / (data.count() || 1);
                }
 
                if (angle < minAngle) {
                    angle = minAngle;
                    restAngle -= minAngle;
                }
                else {
                    valueSumLargerThanMinAngle += value;
                }
 
                var endAngle = currentAngle + dir * angle;
                data.setItemLayout(idx, {
                    angle: angle,
                    startAngle: currentAngle,
                    endAngle: endAngle,
                    clockwise: clockwise,
                    cx: cx,
                    cy: cy,
                    r0: r0,
                    r: roseType
                        ? numberUtil.linearMap(value, extent, [r0, r])
                        : r
                });
 
                currentAngle = endAngle;
            }, true);
 
            // Some sector is constrained by minAngle
            // Rest sectors needs recalculate angle
            if (restAngle < PI2) {
                // Average the angle if rest angle is not enough after all angles is
                // Constrained by minAngle
                if (restAngle <= 1e-3) {
                    var angle = PI2 / data.count();
                    data.each(function (idx) {
                        var layout = data.getItemLayout(idx);
                        layout.startAngle = startAngle + dir * idx * angle;
                        layout.endAngle = startAngle + dir * (idx + 1) * angle;
                    });
                }
                else {
                    unitRadian = restAngle / valueSumLargerThanMinAngle;
                    currentAngle = startAngle;
                    data.each('value', function (value, idx) {
                        var layout = data.getItemLayout(idx);
                        var angle = layout.angle === minAngle
                            ? minAngle : value * unitRadian;
                        layout.startAngle = currentAngle;
                        layout.endAngle = currentAngle + dir * angle;
                        currentAngle += dir * angle;
                    });
                }
            }
 
            labelLayout(seriesModel, r, width, height);
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/radar/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/radar/

Statements: 13.13% (21 / 160)      Branches: 0% (0 / 54)      Functions: 0% (0 / 27)      Lines: 13.13% (21 / 160)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/chart/radar/
File Statements Branches Functions Lines
RadarSeries.js 33.33% (7 / 21) 0% (0 / 4) 0% (0 / 5) 33.33% (7 / 21)
RadarView.js 9.71% (10 / 103) 0% (0 / 26) 0% (0 / 15) 9.71% (10 / 103)
backwardCompat.js 10% (2 / 20) 0% (0 / 18) 0% (0 / 3) 10% (2 / 20)
radarLayout.js 12.5% (2 / 16) 0% (0 / 6) 0% (0 / 4) 12.5% (2 / 16)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/radar/RadarSeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/radar/RadarSeries.js

Statements: 33.33% (7 / 21)      Branches: 0% (0 / 4)      Functions: 0% (0 / 5)      Lines: 33.33% (7 / 21)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77      1 1 1 1 1   1                                                                                                                                 1    
'use strict';
 
 
    var SeriesModel = require('../../model/Series');
    var List = require('../../data/List');
    var completeDimensions = require('../../data/helper/completeDimensions');
    var zrUtil = require('zrender/lib/core/util');
    var encodeHTML = require('../../util/format').encodeHTML;
 
    var RadarSeries = SeriesModel.extend({
 
        type: 'series.radar',
 
        dependencies: ['radar'],
 
 
        // Overwrite
        init: function (option) {
            RadarSeries.superApply(this, 'init', arguments);
 
            // Enable legend selection for each data item
            // Use a function instead of direct access because data reference may changed
            this.legendDataProvider = function () {
                return this.getRawData();
            };
        },
 
        getInitialData: function (option, ecModel) {
            var data = option.data || [];
            var dimensions = completeDimensions(
                [], data, {extraPrefix: 'indicator_'}
            );
            var list = new List(dimensions, this);
            list.initData(data);
            return list;
        },
 
        formatTooltip: function (dataIndex) {
            var value = this.getRawValue(dataIndex);
            var coordSys = this.coordinateSystem;
            var indicatorAxes = coordSys.getIndicatorAxes();
            var name = this.getData().getName(dataIndex);
            return encodeHTML(name === '' ? this.name : name) + '<br/>'
                + zrUtil.map(indicatorAxes, function (axis, idx) {
                    return encodeHTML(axis.name + ' : ' + value[idx]);
                }).join('<br />');
        },
 
        defaultOption: {
            zlevel: 0,
            z: 2,
            coordinateSystem: 'radar',
            legendHoverLink: true,
            radarIndex: 0,
            lineStyle: {
                normal: {
                    width: 2,
                    type: 'solid'
                }
            },
            label: {
                normal: {
                    position: 'top'
                }
            },
            // areaStyle: {
            // },
            // itemStyle: {}
            symbol: 'emptyCircle',
            symbolSize: 4
            // symbolRotate: null
        }
    });
 
    module.exports = RadarSeries;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/radar/RadarView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/radar/RadarView.js

Statements: 9.71% (10 / 103)      Branches: 0% (0 / 26)      Functions: 0% (0 / 15)      Lines: 9.71% (10 / 103)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222    1 1 1   1           1                   1                                     1                                             1                                                                                                                                                                                                                                                                 1       1                                                
 
 
    var graphic = require('../../util/graphic');
    var zrUtil = require('zrender/lib/core/util');
    var symbolUtil = require('../../util/symbol');
 
    function normalizeSymbolSize(symbolSize) {
        if (!zrUtil.isArray(symbolSize)) {
            symbolSize = [+symbolSize, +symbolSize];
        }
        return symbolSize;
    }
    module.exports = require('../../echarts').extendChartView({
        type: 'radar',
 
        render: function (seriesModel, ecModel, api) {
            var polar = seriesModel.coordinateSystem;
            var group = this.group;
 
            var data = seriesModel.getData();
            var oldData = this._data;
 
            function createSymbol(data, idx) {
                var symbolType = data.getItemVisual(idx, 'symbol') || 'circle';
                var color = data.getItemVisual(idx, 'color');
                if (symbolType === 'none') {
                    return;
                }
                var symbolPath = symbolUtil.createSymbol(
                    symbolType, -0.5, -0.5, 1, 1, color
                );
                symbolPath.attr({
                    style: {
                        strokeNoScale: true
                    },
                    z2: 100,
                    scale: normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize'))
                });
                return symbolPath;
            }
 
            function updateSymbols(oldPoints, newPoints, symbolGroup, data, idx, isInit) {
                // Simply rerender all
                symbolGroup.removeAll();
                for (var i = 0; i < newPoints.length - 1; i++) {
                    var symbolPath = createSymbol(data, idx);
                    if (symbolPath) {
                        symbolPath.__dimIdx = i;
                        if (oldPoints[i]) {
                            symbolPath.attr('position', oldPoints[i]);
                            graphic[isInit ? 'initProps' : 'updateProps'](
                                symbolPath, {
                                    position: newPoints[i]
                                }, seriesModel, idx
                            );
                        }
                        else {
                            symbolPath.attr('position', newPoints[i]);
                        }
                        symbolGroup.add(symbolPath);
                    }
                }
            }
 
            function getInitialPoints(points) {
                return zrUtil.map(points, function (pt) {
                    return [polar.cx, polar.cy];
                });
            }
            data.diff(oldData)
                .add(function (idx) {
                    var points = data.getItemLayout(idx);
                    if (!points) {
                        return;
                    }
                    var polygon = new graphic.Polygon();
                    var polyline = new graphic.Polyline();
                    var target = {
                        shape: {
                            points: points
                        }
                    };
                    polygon.shape.points = getInitialPoints(points);
                    polyline.shape.points = getInitialPoints(points);
                    graphic.initProps(polygon, target, seriesModel, idx);
                    graphic.initProps(polyline, target, seriesModel, idx);
 
                    var itemGroup = new graphic.Group();
                    var symbolGroup = new graphic.Group();
                    itemGroup.add(polyline);
                    itemGroup.add(polygon);
                    itemGroup.add(symbolGroup);
 
                    updateSymbols(
                        polyline.shape.points, points, symbolGroup, data, idx, true
                    );
 
                    data.setItemGraphicEl(idx, itemGroup);
                })
                .update(function (newIdx, oldIdx) {
                    var itemGroup = oldData.getItemGraphicEl(oldIdx);
                    var polyline = itemGroup.childAt(0);
                    var polygon = itemGroup.childAt(1);
                    var symbolGroup = itemGroup.childAt(2);
                    var target = {
                        shape: {
                            points: data.getItemLayout(newIdx)
                        }
                    };
                    if (!target.shape.points) {
                        return;
                    }
                    updateSymbols(
                        polyline.shape.points, target.shape.points, symbolGroup, data, newIdx, false
                    );
 
                    graphic.updateProps(polyline, target, seriesModel);
                    graphic.updateProps(polygon, target, seriesModel);
 
                    data.setItemGraphicEl(newIdx, itemGroup);
                })
                .remove(function (idx) {
                    group.remove(oldData.getItemGraphicEl(idx));
                })
                .execute();
 
            data.eachItemGraphicEl(function (itemGroup, idx) {
                var itemModel = data.getItemModel(idx);
                var polyline = itemGroup.childAt(0);
                var polygon = itemGroup.childAt(1);
                var symbolGroup = itemGroup.childAt(2);
                var color = data.getItemVisual(idx, 'color');
 
                group.add(itemGroup);
 
                polyline.useStyle(
                    zrUtil.defaults(
                        itemModel.getModel('lineStyle.normal').getLineStyle(),
                        {
                            fill: 'none',
                            stroke: color
                        }
                    )
                );
                polyline.hoverStyle = itemModel.getModel('lineStyle.emphasis').getLineStyle();
 
                var areaStyleModel = itemModel.getModel('areaStyle.normal');
                var hoverAreaStyleModel = itemModel.getModel('areaStyle.emphasis');
                var polygonIgnore = areaStyleModel.isEmpty() && areaStyleModel.parentModel.isEmpty();
                var hoverPolygonIgnore = hoverAreaStyleModel.isEmpty() && hoverAreaStyleModel.parentModel.isEmpty();
 
                hoverPolygonIgnore = hoverPolygonIgnore && polygonIgnore;
                polygon.ignore = polygonIgnore;
 
                polygon.useStyle(
                    zrUtil.defaults(
                        areaStyleModel.getAreaStyle(),
                        {
                            fill: color,
                            opacity: 0.7
                        }
                    )
                );
                polygon.hoverStyle = hoverAreaStyleModel.getAreaStyle();
 
                var itemStyle = itemModel.getModel('itemStyle.normal').getItemStyle(['color']);
                var itemHoverStyle = itemModel.getModel('itemStyle.emphasis').getItemStyle();
                var labelModel = itemModel.getModel('label.normal');
                var labelHoverModel = itemModel.getModel('label.emphasis');
                symbolGroup.eachChild(function (symbolPath) {
                    symbolPath.setStyle(itemStyle);
                    symbolPath.hoverStyle = zrUtil.clone(itemHoverStyle);
 
                    var defaultText = data.get(data.dimensions[symbolPath.__dimIdx], idx);
                    graphic.setText(symbolPath.style, labelModel, color);
                    symbolPath.setStyle({
                        text: labelModel.get('show') ? zrUtil.retrieve(
                            seriesModel.getFormattedLabel(
                                idx, 'normal', null, symbolPath.__dimIdx
                            ),
                            defaultText
                        ) : ''
                    });
 
                    graphic.setText(symbolPath.hoverStyle, labelHoverModel, color);
                    symbolPath.hoverStyle.text = labelHoverModel.get('show') ? zrUtil.retrieve(
                        seriesModel.getFormattedLabel(
                            idx, 'emphasis', null, symbolPath.__dimIdx
                        ),
                        defaultText
                    ) : '';
                });
 
                function onEmphasis() {
                    polygon.attr('ignore', hoverPolygonIgnore);
                }
 
                function onNormal() {
                    polygon.attr('ignore', polygonIgnore);
                }
 
                itemGroup.off('mouseover').off('mouseout').off('normal').off('emphasis');
                itemGroup.on('emphasis', onEmphasis)
                    .on('mouseover', onEmphasis)
                    .on('normal', onNormal)
                    .on('mouseout', onNormal);
 
                graphic.setHoverStyle(itemGroup);
            });
 
            this._data = data;
        },
 
        remove: function () {
            this.group.removeAll();
            this._data = null;
        },
 
        dispose: function () {}
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/radar/backwardCompat.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/radar/backwardCompat.js

Statements: 10% (2 / 20)      Branches: 0% (0 / 18)      Functions: 0% (0 / 3)      Lines: 10% (2 / 20)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37      1   1                                                              
// Backward compat for radar chart in 2
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    module.exports = function (option) {
        var polarOptArr = option.polar;
        if (polarOptArr) {
            if (!zrUtil.isArray(polarOptArr)) {
                polarOptArr = [polarOptArr];
            }
            var polarNotRadar = [];
            zrUtil.each(polarOptArr, function (polarOpt, idx) {
                if (polarOpt.indicator) {
                    if (polarOpt.type && !polarOpt.shape) {
                        polarOpt.shape = polarOpt.type;
                    }
                    option.radar = option.radar || [];
                    if (!zrUtil.isArray(option.radar)) {
                        option.radar = [option.radar];
                    }
                    option.radar.push(polarOpt);
                }
                else {
                    polarNotRadar.push(polarOpt);
                }
            });
            option.polar = polarNotRadar;
        }
        zrUtil.each(option.series, function (seriesOpt) {
            if (seriesOpt.type === 'radar' && seriesOpt.polarIndex) {
                seriesOpt.radarIndex = seriesOpt.polarIndex;
            }
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/radar/radarLayout.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/radar/radarLayout.js

Statements: 12.5% (2 / 16)      Branches: 0% (0 / 6)      Functions: 0% (0 / 4)      Lines: 12.5% (2 / 16)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29    1                 1                                  
 
 
    module.exports = function (ecModel) {
        ecModel.eachSeriesByType('radar', function (seriesModel) {
            var data = seriesModel.getData();
            var points = [];
            var coordSys = seriesModel.coordinateSystem;
            if (!coordSys) {
                return;
            }
 
            function pointsConverter(val, idx) {
                points[idx] = points[idx] || [];
                points[idx][i] = coordSys.dataToPoint(val, i);
            }
            for (var i = 0; i < coordSys.getIndicatorAxes().length; i++) {
                var dim = data.dimensions[i];
                data.each(dim, pointsConverter);
            }
 
            data.each(function (idx) {
                // Close polygon
                points[idx][0] && points[idx].push(points[idx][0].slice());
                data.setItemLayout(idx, points[idx]);
            });
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/sankey/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/sankey/

Statements: 13.87% (38 / 274)      Branches: 0% (0 / 50)      Functions: 0% (0 / 59)      Lines: 13.87% (38 / 274)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/chart/sankey/
File Statements Branches Functions Lines
SankeySeries.js 25% (5 / 20) 0% (0 / 12) 0% (0 / 4) 25% (5 / 20)
SankeyView.js 7.35% (5 / 68) 0% (0 / 14) 0% (0 / 7) 7.35% (5 / 68)
sankeyLayout.js 14.88% (25 / 168) 0% (0 / 22) 0% (0 / 44) 14.88% (25 / 168)
sankeyVisual.js 16.67% (3 / 18) 0% (0 / 2) 0% (0 / 4) 16.67% (3 / 18)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/sankey/SankeySeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/sankey/SankeySeries.js

Statements: 25% (5 / 20)      Branches: 0% (0 / 12)      Functions: 0% (0 / 4)      Lines: 25% (5 / 20)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133            1 1 1   1                                                                                                                                                                                                                                             1      
/**
 * @file Get initial data and define sankey view's series model
 * @author Deqing Li(annong035@gmail.com)
 */
 
 
    var SeriesModel = require('../../model/Series');
    var createGraphFromNodeEdge = require('../helper/createGraphFromNodeEdge');
    var encodeHTML = require('../../util/format').encodeHTML;
 
    var SankeySeries = SeriesModel.extend({
 
        type: 'series.sankey',
 
        layoutInfo: null,
 
        /**
         * Init a graph data structure from data in option series
         *
         * @param  {Object} option  the object used to config echarts view
         * @return {module:echarts/data/List} storage initial data
         */
        getInitialData: function (option) {
            var links = option.edges || option.links;
            var nodes = option.data || option.nodes;
            if (nodes && links) {
                var graph = createGraphFromNodeEdge(nodes, links, this, true);
                return graph.data;
            }
        },
 
        /**
         * Return the graphic data structure
         *
         * @return {module:echarts/data/Graph} graphic data structure
         */
        getGraph: function () {
            return this.getData().graph;
        },
 
        /**
         * Get edge data of graphic data structure
         *
         * @return {module:echarts/data/List} data structure of list
         */
        getEdgeData: function () {
            return this.getGraph().edgeData;
        },
 
        /**
         * @override
         */
        formatTooltip: function (dataIndex, multipleSeries, dataType) {
            // dataType === 'node' or empty do not show tooltip by default
            if (dataType === 'edge') {
                var params = this.getDataParams(dataIndex, dataType);
                var rawDataOpt = params.data;
                var html = rawDataOpt.source + ' -- ' + rawDataOpt.target;
                if (params.value) {
                    html += ' : ' + params.value;
                }
                return encodeHTML(html);
            }
 
            return SankeySeries.superCall(this, 'formatTooltip', dataIndex, multipleSeries);
        },
 
        defaultOption: {
            zlevel: 0,
            z: 2,
 
            coordinateSystem: 'view',
 
            layout: null,
 
            // the position of the whole view
            left: '5%',
            top: '5%',
            right: '20%',
            bottom: '5%',
 
            // the dx of the node
            nodeWidth: 20,
 
            // the vertical distance between two nodes
            nodeGap: 8,
 
            // the number of iterations to change the position of the node
            layoutIterations: 32,
 
            label: {
                normal: {
                    show: true,
                    position: 'right',
                    textStyle: {
                        color: '#000',
                        fontSize: 12
                    }
                },
                emphasis: {
                    show: true
                }
            },
 
            itemStyle: {
                normal: {
                    borderWidth: 1,
                    borderColor: '#333'
                }
            },
 
            lineStyle: {
                normal: {
                    color: '#314656',
                    opacity: 0.2,
                    curveness: 0.5
                },
                emphasis: {
                    opacity: 0.6
                }
            },
 
            animationEasing: 'linear',
 
            animationDuration: 1000
        }
 
    });
 
    module.exports = SankeySeries;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/sankey/SankeyView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/sankey/SankeyView.js

Statements: 7.35% (5 / 68)      Branches: 0% (0 / 14)      Functions: 0% (0 / 7)      Lines: 7.35% (5 / 68)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203            1 1   1                                                       1                                                                                                                                                                                                                                                                                                 1                                        
/**
 * @file  The file used to draw sankey view
 * @author  Deqing Li(annong035@gmail.com)
 */
 
 
    var graphic = require('../../util/graphic');
    var zrUtil = require('zrender/lib/core/util');
 
    var SankeyShape = graphic.extendShape({
        shape: {
            x1: 0, y1: 0,
            x2: 0, y2: 0,
            cpx1: 0, cpy1: 0,
            cpx2: 0, cpy2: 0,
 
            extent: 0
        },
 
        buildPath: function (ctx, shape) {
            var halfExtent = shape.extent / 2;
            ctx.moveTo(shape.x1, shape.y1 - halfExtent);
            ctx.bezierCurveTo(
                shape.cpx1, shape.cpy1 - halfExtent,
                shape.cpx2, shape.cpy2 - halfExtent,
                shape.x2, shape.y2 - halfExtent
            );
            ctx.lineTo(shape.x2, shape.y2 + halfExtent);
            ctx.bezierCurveTo(
                shape.cpx2, shape.cpy2 + halfExtent,
                shape.cpx1, shape.cpy1 + halfExtent,
                shape.x1, shape.y1 + halfExtent
            );
            ctx.closePath();
        }
    });
 
    module.exports = require('../../echarts').extendChartView({
 
        type: 'sankey',
 
        /**
         * @private
         * @type {module:echarts/chart/sankey/SankeySeries}
         */
        _model: null,
 
        render: function (seriesModel, ecModel, api) {
            var graph = seriesModel.getGraph();
            var group = this.group;
            var layoutInfo = seriesModel.layoutInfo;
            var nodeData = seriesModel.getData();
            var edgeData = seriesModel.getData('edge');
 
            this._model = seriesModel;
 
            group.removeAll();
 
            group.position = [layoutInfo.x, layoutInfo.y];
 
            // generate a bezire Curve for each edge
            graph.eachEdge(function (edge) {
                var curve = new SankeyShape();
 
                curve.dataIndex = edge.dataIndex;
                curve.seriesIndex = seriesModel.seriesIndex;
                curve.dataType = 'edge';
 
                var lineStyleModel = edge.getModel('lineStyle.normal');
                var curvature = lineStyleModel.get('curveness');
                var n1Layout = edge.node1.getLayout();
                var n2Layout = edge.node2.getLayout();
                var edgeLayout = edge.getLayout();
 
                curve.shape.extent = Math.max(1, edgeLayout.dy);
 
                var x1 = n1Layout.x + n1Layout.dx;
                var y1 = n1Layout.y + edgeLayout.sy + edgeLayout.dy / 2;
                var x2 = n2Layout.x;
                var y2 = n2Layout.y + edgeLayout.ty + edgeLayout.dy / 2;
                var cpx1 = x1 * (1 - curvature) + x2 * curvature;
                var cpy1 = y1;
                var cpx2 = x1 * curvature + x2 * (1 - curvature);
                var cpy2 = y2;
 
                curve.setShape({
                    x1: x1,
                    y1: y1,
                    x2: x2,
                    y2: y2,
                    cpx1: cpx1,
                    cpy1: cpy1,
                    cpx2: cpx2,
                    cpy2: cpy2
                });
 
                curve.setStyle(lineStyleModel.getItemStyle());
                // Special color, use source node color or target node color
                switch (curve.style.fill) {
                    case 'source':
                        curve.style.fill = edge.node1.getVisual('color');
                        break;
                    case 'target':
                        curve.style.fill = edge.node2.getVisual('color');
                        break;
                }
 
                graphic.setHoverStyle(curve, edge.getModel('lineStyle.emphasis').getItemStyle());
 
                group.add(curve);
 
                edgeData.setItemGraphicEl(edge.dataIndex, curve);
            });
 
            // generate a rect  for each node
            graph.eachNode(function (node) {
                var layout = node.getLayout();
                var itemModel = node.getModel();
                var labelModel = itemModel.getModel('label.normal');
                var textStyleModel = labelModel.getModel('textStyle');
                var labelHoverModel = itemModel.getModel('label.emphasis');
                var textStyleHoverModel = labelHoverModel.getModel('textStyle');
 
                var rect = new graphic.Rect({
                    shape: {
                        x: layout.x,
                        y: layout.y,
                        width: node.getLayout().dx,
                        height: node.getLayout().dy
                    },
                    style: {
                        // Get formatted label in label.normal option
                        //  Use node id if it is not specified
                        text: labelModel.get('show')
                            ? seriesModel.getFormattedLabel(node.dataIndex, 'normal') || node.id
                            // Use empty string to hide the label
                            : '',
                        textFont: textStyleModel.getFont(),
                        textFill: textStyleModel.getTextColor(),
                        textPosition: labelModel.get('position')
                    }
                });
 
                rect.setStyle(zrUtil.defaults(
                    {
                        fill: node.getVisual('color')
                    },
                    itemModel.getModel('itemStyle.normal').getItemStyle()
                ));
 
                graphic.setHoverStyle(rect, zrUtil.extend(
                    node.getModel('itemStyle.emphasis'),
                    {
                        text: labelHoverModel.get('show')
                            ? seriesModel.getFormattedLabel(node.dataIndex, 'emphasis') || node.id
                            : '',
                        textFont: textStyleHoverModel.getFont(),
                        textFill: textStyleHoverModel.getTextColor(),
                        textPosition: labelHoverModel.get('position')
                    }
                ));
 
                group.add(rect);
 
                nodeData.setItemGraphicEl(node.dataIndex, rect);
 
                rect.dataType = 'node';
            });
 
            if (!this._data && seriesModel.get('animation')) {
                group.setClipPath(createGridClipShape(group.getBoundingRect(), seriesModel, function () {
                    group.removeClipPath();
                }));
            }
 
            this._data = seriesModel.getData();
        },
 
        dispose: function () {}
    });
 
    // add animation to the view
    function createGridClipShape(rect, seriesModel, cb) {
        var rectEl = new graphic.Rect({
            shape: {
                x: rect.x - 10,
                y: rect.y - 10,
                width: 0,
                height: rect.height + 20
            }
        });
        graphic.initProps(rectEl, {
            shape: {
                width: rect.width + 20,
                height: rect.height + 20
            }
        }, seriesModel, cb);
 
        return rectEl;
    }
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/sankey/sankeyLayout.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/sankey/sankeyLayout.js

Statements: 14.88% (25 / 168)      Branches: 0% (0 / 22)      Functions: 0% (0 / 44)      Lines: 14.88% (25 / 168)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372            1 1 1   1                                                                             1                 1                     1                               1                                                                   1                           1                                 1                                                                     1                                                                             1                                                                                           1                       1                     1                       1                 1                                     1       1       1                         1       1       1       1          
/**
 * @file The layout algorithm of sankey view
 * @author  Deqing Li(annong035@gmail.com)
 */
 
 
    var layout = require('../../util/layout');
    var nest = require('../../util/array/nest');
    var zrUtil = require('zrender/lib/core/util');
 
    module.exports = function (ecModel, api, payload) {
 
        ecModel.eachSeriesByType('sankey', function (seriesModel) {
 
            var nodeWidth = seriesModel.get('nodeWidth');
            var nodeGap = seriesModel.get('nodeGap');
 
            var layoutInfo = getViewRect(seriesModel, api);
 
            seriesModel.layoutInfo = layoutInfo;
 
            var width = layoutInfo.width;
            var height = layoutInfo.height;
 
            var graph = seriesModel.getGraph();
 
            var nodes = graph.nodes;
            var edges = graph.edges;
 
            computeNodeValues(nodes);
 
            var filteredNodes = zrUtil.filter(nodes, function (node) {
                return node.getLayout().value === 0;
            });
 
            var iterations = filteredNodes.length !== 0
                ? 0 : seriesModel.get('layoutIterations');
 
            layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations);
        });
    };
 
    /**
     * Get the layout position of the whole view
     *
     * @param {module:echarts/model/Series} seriesModel  the model object of sankey series
     * @param {module:echarts/ExtensionAPI} api  provide the API list that the developer can call
     * @return {module:zrender/core/BoundingRect}  size of rect to draw the sankey view
     */
    function getViewRect(seriesModel, api) {
        return layout.getLayoutRect(
            seriesModel.getBoxLayoutParams(), {
                width: api.getWidth(),
                height: api.getHeight()
            }
        );
    }
 
    function layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations) {
        computeNodeBreadths(nodes, nodeWidth, width);
        computeNodeDepths(nodes, edges, height, nodeGap, iterations);
        computeEdgeDepths(nodes);
    }
 
    /**
     * Compute the value of each node by summing the associated edge's value
     *
     * @param {module:echarts/data/Graph~Node} nodes  node of sankey view
     */
    function computeNodeValues(nodes) {
        zrUtil.each(nodes, function (node) {
            var value1 = sum(node.outEdges, getEdgeValue);
            var value2 = sum(node.inEdges, getEdgeValue);
            var value = Math.max(value1, value2);
            node.setLayout({value: value}, true);
        });
    }
 
    /**
     * Compute the x-position for each node
     *
     * @param {module:echarts/data/Graph~Node} nodes  node of sankey view
     * @param  {number} nodeWidth  the dx of the node
     * @param  {number} width  the whole width of the area to draw the view
     */
    function computeNodeBreadths(nodes, nodeWidth, width) {
        var remainNodes = nodes;
        var nextNode = null;
        var x = 0;
        var kx = 0;
 
        while (remainNodes.length) {
            nextNode = [];
            for (var i = 0, len = remainNodes.length; i < len; i++) {
                var node = remainNodes[i];
                node.setLayout({x: x}, true);
                node.setLayout({dx: nodeWidth}, true);
                for (var j = 0, lenj = node.outEdges.length; j < lenj; j++) {
                    nextNode.push(node.outEdges[j].node2);
                }
            }
            remainNodes = nextNode;
            ++x;
        }
 
        moveSinksRight(nodes, x);
        kx = (width - nodeWidth) / (x - 1);
 
        scaleNodeBreadths(nodes, kx);
    }
 
    /**
     * All the node without outEgdes are assigned maximum x-position and
     *     be aligned in the last column.
     *
     * @param {module:echarts/data/Graph~Node} nodes  node of sankey view
     * @param {number} x  value (x-1) use to assign to node without outEdges
     *     as x-position
     */
    function moveSinksRight(nodes, x) {
        zrUtil.each(nodes, function (node) {
            if (!node.outEdges.length) {
                node.setLayout({x: x - 1}, true);
            }
        });
    }
 
    /**
     * Scale node x-position to the width
     *
     * @param {module:echarts/data/Graph~Node} nodes  node of sankey view
     * @param {number} kx   multiple used to scale nodes
     */
    function scaleNodeBreadths(nodes, kx) {
        zrUtil.each(nodes, function (node) {
            var nodeX = node.getLayout().x * kx;
            node.setLayout({x: nodeX}, true);
        });
    }
 
    /**
     * Using Gauss-Seidel iterations method to compute the node depth(y-position)
     *
     * @param {module:echarts/data/Graph~Node} nodes  node of sankey view
     * @param {module:echarts/data/Graph~Edge} edges  edge of sankey view
     * @param {number} height  the whole height of the area to draw the view
     * @param {numbber} nodeGap  the vertical distance between two nodes
     *     in the same column.
     * @param {number} iterations  the number of iterations for the algorithm
     */
    function computeNodeDepths(nodes, edges, height, nodeGap, iterations) {
        var nodesByBreadth = nest()
            .key(function (d) {
                return d.getLayout().x;
            })
            .sortKeys(ascending)
            .entries(nodes)
            .map(function (d) {
                return d.values;
            });
 
        initializeNodeDepth(nodes, nodesByBreadth, edges, height, nodeGap);
        resolveCollisions(nodesByBreadth, nodeGap, height);
 
        for (var alpha = 1; iterations > 0; iterations--) {
            // 0.99 is a experience parameter, ensure that each iterations of
            // changes as small as possible.
            alpha *= 0.99;
            relaxRightToLeft(nodesByBreadth, alpha);
            resolveCollisions(nodesByBreadth, nodeGap, height);
            relaxLeftToRight(nodesByBreadth, alpha);
            resolveCollisions(nodesByBreadth, nodeGap, height);
        }
    }
 
    /**
     * Compute the original y-position for each node
     *
     * @param {module:echarts/data/Graph~Node} nodes  node of sankey view
     * @param {Array.<Array.<module:echarts/data/Graph~Node>>} nodesByBreadth
     *     group by the array of all sankey nodes based on the nodes x-position.
     * @param {module:echarts/data/Graph~Edge} edges  edge of sankey view
     * @param {number} height  the whole height of the area to draw the view
     * @param {number} nodeGap  the vertical distance between two nodes
     */
    function initializeNodeDepth(nodes, nodesByBreadth, edges, height, nodeGap) {
        var kyArray = [];
        zrUtil.each(nodesByBreadth, function (nodes) {
            var n = nodes.length;
            var sum = 0;
            zrUtil.each(nodes, function (node) {
                sum += node.getLayout().value;
            });
            var ky = (height - (n - 1) * nodeGap) / sum;
            kyArray.push(ky);
        });
 
        kyArray.sort(function (a, b) {
            return a - b;
        });
        var ky0 = kyArray[0];
 
        zrUtil.each(nodesByBreadth, function (nodes) {
            zrUtil.each(nodes, function (node, i) {
                node.setLayout({y: i}, true);
                var nodeDy = node.getLayout().value * ky0;
                node.setLayout({dy: nodeDy}, true);
            });
        });
 
        zrUtil.each(edges, function (edge) {
            var edgeDy = +edge.getValue() * ky0;
            edge.setLayout({dy: edgeDy}, true);
        });
    }
 
    /**
     * Resolve the collision of initialized depth (y-position)
     *
     * @param {Array.<Array.<module:echarts/data/Graph~Node>>} nodesByBreadth
     *     group by the array of all sankey nodes based on the nodes x-position.
     * @param {number} nodeGap  the vertical distance between two nodes
     * @param {number} height  the whole height of the area to draw the view
     */
    function resolveCollisions(nodesByBreadth, nodeGap, height) {
        zrUtil.each(nodesByBreadth, function (nodes) {
            var node;
            var dy;
            var y0 = 0;
            var n = nodes.length;
            var i;
 
            nodes.sort(ascendingDepth);
 
            for (i = 0; i < n; i++) {
                node = nodes[i];
                dy = y0 - node.getLayout().y;
                if (dy > 0) {
                    var nodeY = node.getLayout().y + dy;
                    node.setLayout({y: nodeY}, true);
                }
                y0 = node.getLayout().y + node.getLayout().dy + nodeGap;
            }
 
            // if the bottommost node goes outside the bounds, push it back up
            dy = y0 - nodeGap - height;
            if (dy > 0) {
                var nodeY = node.getLayout().y - dy;
                node.setLayout({y: nodeY}, true);
                y0 = node.getLayout().y;
                for (i = n - 2; i >= 0; --i) {
                    node = nodes[i];
                    dy = node.getLayout().y + node.getLayout().dy + nodeGap - y0;
                    if (dy > 0) {
                        nodeY = node.getLayout().y - dy;
                        node.setLayout({y: nodeY}, true);
                    }
                    y0 = node.getLayout().y;
                }
            }
        });
    }
 
    /**
     * Change the y-position of the nodes, except most the right side nodes
     *
     * @param {Array.<Array.<module:echarts/data/Graph~Node>>} nodesByBreadth
     *     group by the array of all sankey nodes based on the node x-position.
     * @param {number} alpha  parameter used to adjust the nodes y-position
     */
    function relaxRightToLeft(nodesByBreadth, alpha) {
        zrUtil.each(nodesByBreadth.slice().reverse(), function (nodes) {
            zrUtil.each(nodes, function (node) {
                if (node.outEdges.length) {
                    var y = sum(node.outEdges, weightedTarget) / sum(node.outEdges, getEdgeValue);
                    var nodeY = node.getLayout().y + (y - center(node)) * alpha;
                    node.setLayout({y: nodeY}, true);
                }
            });
        });
    }
 
    function weightedTarget(edge) {
        return center(edge.node2) * edge.getValue();
    }
 
    /**
     * Change the y-position of the nodes, except most the left side nodes
     *
     * @param {Array.<Array.<module:echarts/data/Graph~Node>>} nodesByBreadth
     *     group by the array of all sankey nodes based on the node x-position.
     * @param {number} alpha  parameter used to adjust the nodes y-position
     */
    function relaxLeftToRight(nodesByBreadth, alpha) {
        zrUtil.each(nodesByBreadth, function (nodes) {
            zrUtil.each(nodes, function (node) {
                if (node.inEdges.length) {
                    var y = sum(node.inEdges, weightedSource) / sum(node.inEdges, getEdgeValue);
                    var nodeY = node.getLayout().y + (y - center(node)) * alpha;
                    node.setLayout({y: nodeY}, true);
                }
            });
        });
    }
 
    function weightedSource(edge) {
        return center(edge.node1) * edge.getValue();
    }
 
    /**
     * Compute the depth(y-position) of each edge
     *
     * @param {module:echarts/data/Graph~Node} nodes  node of sankey view
     */
    function computeEdgeDepths(nodes) {
        zrUtil.each(nodes, function (node) {
            node.outEdges.sort(ascendingTargetDepth);
            node.inEdges.sort(ascendingSourceDepth);
        });
        zrUtil.each(nodes, function (node) {
            var sy = 0;
            var ty = 0;
            zrUtil.each(node.outEdges, function (edge) {
                edge.setLayout({sy: sy}, true);
                sy += edge.getLayout().dy;
            });
            zrUtil.each(node.inEdges, function (edge) {
                edge.setLayout({ty: ty}, true);
                ty += edge.getLayout().dy;
            });
        });
    }
 
    function ascendingTargetDepth(a, b) {
        return a.node2.getLayout().y - b.node2.getLayout().y;
    }
 
    function ascendingSourceDepth(a, b) {
        return a.node1.getLayout().y - b.node1.getLayout().y;
    }
 
    function sum(array, f) {
        var sum = 0;
        var len = array.length;
        var i = -1;
        while (++i < len) {
            var value = +f.call(array, array[i], i);
            if (!isNaN(value)) {
                sum += value;
            }
        }
        return sum;
    }
 
    function center(node) {
        return node.getLayout().y + node.getLayout().dy / 2;
    }
 
    function ascendingDepth(a, b) {
        return a.getLayout().y - b.getLayout().y;
    }
 
    function ascending(a, b) {
        return a < b ? -1 : a > b ? 1 : a === b ? 0 : NaN;
    }
 
    function getEdgeValue(edge) {
        return edge.getValue();
    }
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/sankey/sankeyVisual.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/sankey/sankeyVisual.js

Statements: 16.67% (3 / 18)      Branches: 0% (0 / 2)      Functions: 0% (0 / 4)      Lines: 16.67% (3 / 18)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44            1 1   1                                                                    
/**
 * @file Visual encoding for sankey view
 * @author  Deqing Li(annong035@gmail.com)
 */
 
 
    var VisualMapping = require('../../visual/VisualMapping');
    var zrUtil = require('zrender/lib/core/util');
 
    module.exports = function (ecModel, payload) {
        ecModel.eachSeriesByType('sankey', function (seriesModel) {
            var graph = seriesModel.getGraph();
            var nodes = graph.nodes;
 
            nodes.sort(function (a, b) {
                return a.getLayout().value - b.getLayout().value;
            });
 
            var minValue = nodes[0].getLayout().value;
            var maxValue = nodes[nodes.length - 1].getLayout().value;
 
            zrUtil.each(nodes, function (node) {
                var mapping = new VisualMapping({
                    type: 'color',
                    mappingMethod: 'linear',
                    dataExtent: [minValue, maxValue],
                    visual: seriesModel.get('color')
                });
 
                var mapValueToColor = mapping.mapValueToVisual(node.getLayout().value);
                node.setVisual('color', mapValueToColor);
                // If set itemStyle.normal.color
                var itemModel = node.getModel();
                var customColor = itemModel.get('itemStyle.normal.color');
                if (customColor != null) {
                    node.setVisual('color', customColor);
                }
            });
 
        });
    };
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/scatter/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/scatter/

Statements: 28.57% (6 / 21)      Branches: 0% (0 / 8)      Functions: 0% (0 / 6)      Lines: 28.57% (6 / 21)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/chart/scatter/
File Statements Branches Functions Lines
ScatterSeries.js 60% (3 / 5) 100% (0 / 0) 0% (0 / 1) 60% (3 / 5)
ScatterView.js 18.75% (3 / 16) 0% (0 / 8) 0% (0 / 5) 18.75% (3 / 16)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/scatter/ScatterSeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/scatter/ScatterSeries.js

Statements: 60% (3 / 5)      Branches: 100% (0 / 0)      Functions: 0% (0 / 1)      Lines: 60% (3 / 5)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65      1 1   1                                                                                                                    
'use strict';
 
 
    var createListFromArray = require('../helper/createListFromArray');
    var SeriesModel = require('../../model/Series');
 
    module.exports = SeriesModel.extend({
 
        type: 'series.scatter',
 
        dependencies: ['grid', 'polar', 'geo', 'singleAxis'],
 
        getInitialData: function (option, ecModel) {
            var list = createListFromArray(option.data, this, ecModel);
            return list;
        },
 
        brushSelector: 'point',
 
        defaultOption: {
            coordinateSystem: 'cartesian2d',
            zlevel: 0,
            z: 2,
            legendHoverLink: true,
 
            hoverAnimation: true,
            // Cartesian coordinate system
            // xAxisIndex: 0,
            // yAxisIndex: 0,
 
            // Polar coordinate system
            // polarIndex: 0,
 
            // Geo coordinate system
            // geoIndex: 0,
 
            // symbol: null,        // 图形类型
            symbolSize: 10,          // 图形大小,半宽(半径)参数,当图形为方向或菱形则总宽度为symbolSize * 2
            // symbolRotate: null,  // 图形旋转控制
 
            large: false,
            // Available when large is true
            largeThreshold: 2000,
 
            // label: {
                // normal: {
                    // show: false
                    // distance: 5,
                    // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调
                    // position: 默认自适应,水平布局为'top',垂直布局为'right',可选为
                    //           'inside'|'left'|'right'|'top'|'bottom'
                    // textStyle: null      // 默认使用全局文本样式,详见TEXTSTYLE
            //     }
            // },
            itemStyle: {
                normal: {
                    opacity: 0.8
                    // color: 各异
                }
            }
        }
 
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/scatter/ScatterView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/scatter/ScatterView.js

Statements: 18.75% (3 / 16)      Branches: 0% (0 / 8)      Functions: 0% (0 / 5)      Lines: 18.75% (3 / 16)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45    1 1   1                                                                              
 
 
    var SymbolDraw = require('../helper/SymbolDraw');
    var LargeSymbolDraw = require('../helper/LargeSymbolDraw');
 
    require('../../echarts').extendChartView({
 
        type: 'scatter',
 
        init: function () {
            this._normalSymbolDraw = new SymbolDraw();
            this._largeSymbolDraw = new LargeSymbolDraw();
        },
 
        render: function (seriesModel, ecModel, api) {
            var data = seriesModel.getData();
            var largeSymbolDraw = this._largeSymbolDraw;
            var normalSymbolDraw = this._normalSymbolDraw;
            var group = this.group;
 
            var symbolDraw = seriesModel.get('large') && data.count() > seriesModel.get('largeThreshold')
                ? largeSymbolDraw : normalSymbolDraw;
 
            this._symbolDraw = symbolDraw;
            symbolDraw.updateData(data);
            group.add(symbolDraw.group);
 
            group.remove(
                symbolDraw === largeSymbolDraw
                ? normalSymbolDraw.group : largeSymbolDraw.group
            );
        },
 
        updateLayout: function (seriesModel) {
            this._symbolDraw.updateLayout(seriesModel);
        },
 
        remove: function (ecModel, api) {
            this._symbolDraw && this._symbolDraw.remove(api, true);
        },
 
        dispose: function () {}
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/themeRiver/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/themeRiver/

Statements: 9.84% (25 / 254)      Branches: 0% (0 / 46)      Functions: 0% (0 / 30)      Lines: 9.84% (25 / 254)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/chart/themeRiver/
File Statements Branches Functions Lines
ThemeRiverSeries.js 10.48% (11 / 105) 0% (0 / 26) 0% (0 / 14) 10.48% (11 / 105)
ThemeRiverView.js 11.11% (8 / 72) 0% (0 / 12) 0% (0 / 7) 11.11% (8 / 72)
themeRiverLayout.js 7.35% (5 / 68) 0% (0 / 8) 0% (0 / 6) 7.35% (5 / 68)
themeRiverVisual.js 11.11% (1 / 9) 100% (0 / 0) 0% (0 / 3) 11.11% (1 / 9)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/themeRiver/ThemeRiverSeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/themeRiver/ThemeRiverSeries.js

Statements: 10.48% (11 / 105)      Branches: 0% (0 / 26)      Functions: 0% (0 / 14)      Lines: 10.48% (11 / 105)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310              1 1 1 1 1 1 1   1   1                                                                                                                                                                                                                                                                                                                                                                                                       1                                                                                                                                                                                         1      
'use strict';
/**
 * @file  Define the themeRiver view's series model
 * @author Deqing Li(annong035@gmail.com)
 */
 
 
    var completeDimensions = require('../../data/helper/completeDimensions');
    var SeriesModel = require('../../model/Series');
    var List = require('../../data/List');
    var zrUtil = require('zrender/lib/core/util');
    var formatUtil = require('../../util/format');
    var encodeHTML = formatUtil.encodeHTML;
    var nest = require('../../util/array/nest');
 
    var DATA_NAME_INDEX = 2;
 
    var ThemeRiverSeries = SeriesModel.extend({
 
        type: 'series.themeRiver',
 
        dependencies: ['singleAxis'],
 
        /**
         * @readOnly
         * @type {Object}
         */
        nameMap: null,
 
        /**
         * @override
         */
        init: function (option) {
            ThemeRiverSeries.superApply(this, 'init', arguments);
 
            // Put this function here is for the sake of consistency of code
            // Enable legend selection for each data item
            // Use a function instead of direct access because data reference may changed
            this.legendDataProvider = function () {
                return this.getRawData();
            };
        },
 
        /**
         * If there is no value of a certain point in the time for some event,set it value to 0.
         *
         * @param {Array} data  initial data in the option
         * @return {Array}
         */
        fixData: function (data) {
            var rawDataLength = data.length;
 
            // grouped data by name
            var dataByName = nest()
                .key(function (dataItem) {
                    return dataItem[2];
                })
                .entries(data);
 
            // data group in each layer
            var layData = zrUtil.map(dataByName, function (d) {
                return {
                    name: d.key,
                    dataList: d.values
                };
            });
 
            var layerNum = layData.length;
            var largestLayer = -1;
            var index = -1;
            for (var i = 0; i < layerNum; ++i) {
                var len = layData[i].dataList.length;
                if (len > largestLayer) {
                    largestLayer = len;
                    index = i;
                }
            }
 
            for (var k = 0; k < layerNum; ++k) {
                if (k === index) {
                    continue;
                }
                var name = layData[k].name;
                for (var j = 0; j < largestLayer; ++j) {
                    var timeValue = layData[index].dataList[j][0];
                    var length = layData[k].dataList.length;
                    var keyIndex = -1;
                    for (var l = 0; l < length; ++l) {
                        var value = layData[k].dataList[l][0];
                        if (value === timeValue) {
                            keyIndex = l;
                            break;
                        }
                    }
                    if (keyIndex === -1) {
                        data[rawDataLength] = [];
                        data[rawDataLength][0] = timeValue;
                        data[rawDataLength][1] = 0;
                        data[rawDataLength][2] = name;
                        rawDataLength++;
 
                    }
                }
            }
            return data;
        },
 
        /**
         * @override
         * @param  {Object} option  the initial option that user gived
         * @param  {module:echarts/model/Model} ecModel  the model object for themeRiver option
         * @return {module:echarts/data/List}
         */
        getInitialData: function (option, ecModel) {
 
            var dimensions = [];
 
            var singleAxisModel = ecModel.queryComponents({
                mainType: 'singleAxis',
                index: this.get('singleAxisIndex'),
                id: this.get('singleAxisId')
            })[0];
 
            var axisType = singleAxisModel.get('type');
 
            dimensions = [
                {
                    name: 'time',
                    // FIXME common?
                    type: axisType === 'category'
                        ? 'ordinal'
                        : axisType === 'time'
                        ? 'time'
                        : 'float'
                },
                {
                    name: 'value',
                    type: 'float'
                },
                {
                    name: 'name',
                    type: 'ordinal'
                }
            ];
 
            // filter the data item with the value of label is undefined
            var filterData = zrUtil.filter(option.data, function (dataItem) {
                return dataItem[2] !== undefined;
            });
 
            var data = this.fixData(filterData || []);
            var nameList = [];
            var nameMap = this.nameMap = {};
            var count = 0;
 
            for (var i = 0; i < data.length; ++i) {
                nameList.push(data[i][DATA_NAME_INDEX]);
                if (!nameMap[data[i][DATA_NAME_INDEX]]) {
                    nameMap[data[i][DATA_NAME_INDEX]] = count++;
                }
            }
 
            completeDimensions(dimensions, data);
 
            var list = new List(dimensions, this);
 
            list.initData(data, nameList);
 
            return list;
        },
 
        /**
         * Used by single coordinate
         *
         * @param {string} axisDim  the dimension for single coordinate
         * @return {Array.<string> } specified dimensions on the axis.
         */
        coordDimToDataDim: function (axisDim) {
            return ['time'];
        },
 
        /**
         * The raw data is divided into multiple layers and each layer
         *     has same name.
         *
         * @return {Array.<Array.<number>>}
         */
        getLayerSeries: function () {
            var data = this.getData();
            var lenCount = data.count();
            var indexArr = [];
 
            for (var i = 0; i < lenCount; ++i) {
                indexArr[i] = i;
            }
            // data group by name
            var dataByName = nest()
                .key(function (index) {
                    return data.get('name', index);
                })
                .entries(indexArr);
 
            var layerSeries = zrUtil.map(dataByName, function (d) {
                return {
                    name: d.key,
                    indices: d.values
                };
            });
 
            for (var j = 0; j < layerSeries.length; ++j) {
                layerSeries[j].indices.sort(comparer);
            }
 
            function comparer(index1, index2) {
                return data.get('time', index1) - data.get('time', index2);
            }
 
            return layerSeries;
        },
 
        /**
         * Get data indices for show tooltip content
         *
         * @param {Array.<string>|string} dim  single coordinate dimension
         * @param {number} value axis value
         * @param {module:echarts/coord/single/SingleAxis} baseAxis  single Axis used
         *     the themeRiver.
         * @return {Object} {dataIndices, nestestValue}
         */
        getAxisTooltipData: function (dim, value, baseAxis) {
            if (!zrUtil.isArray(dim)) {
                dim = dim ? [dim] : [];
            }
 
            var data = this.getData();
            var layerSeries = this.getLayerSeries();
            var indices = [];
            var layerNum = layerSeries.length;
            var nestestValue;
 
            for (var i = 0; i < layerNum; ++i) {
                var minDist = Number.MAX_VALUE;
                var nearestIdx = -1;
                var pointNum = layerSeries[i].indices.length;
                for (var j = 0; j < pointNum; ++j) {
                    var theValue = data.get(dim[0], layerSeries[i].indices[j]);
                    var dist = Math.abs(theValue - value);
                    if (dist <= minDist) {
                        nestestValue = theValue;
                        minDist = dist;
                        nearestIdx = layerSeries[i].indices[j];
                    }
                }
                indices.push(nearestIdx);
            }
 
            return {dataIndices: indices, nestestValue: nestestValue};
        },
 
        /**
         * @override
         * @param {number} dataIndex  index of data
         */
        formatTooltip: function (dataIndex) {
            var data = this.getData();
            var htmlName = data.get('name', dataIndex);
            var htmlValue = data.get('value', dataIndex);
            if (isNaN(htmlValue) || htmlValue == null) {
                htmlValue = '-';
            }
            return encodeHTML(htmlName + ' : ' + htmlValue);
        },
 
        defaultOption: {
            zlevel: 0,
            z: 2,
 
            coordinateSystem: 'singleAxis',
 
            // gap in axis's orthogonal orientation
            boundaryGap: ['10%', '10%'],
 
            // legendHoverLink: true,
 
            singleAxisIndex: 0,
 
            animationEasing: 'linear',
 
            label: {
                normal: {
                    margin: 4,
                    textAlign: 'right',
                    show: true,
                    position: 'left',
                    textStyle: {
                        color: '#000',
                        fontSize: 11
                    }
                },
                emphasis: {
                    show: true
                }
            }
        }
    });
 
    module.exports = ThemeRiverSeries;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/themeRiver/ThemeRiverView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/themeRiver/ThemeRiverView.js

Statements: 11.11% (8 / 72)      Branches: 0% (0 / 12)      Functions: 0% (0 / 7)      Lines: 11.11% (8 / 72)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180            1 1 1 1   1                                                   1                             1                                                                                                                                                                                                                   1                                          
/**
 * @file  The file used to draw themeRiver view
 * @author  Deqing Li(annong035@gmail.com)
 */
 
 
    var poly = require('../line/poly');
    var graphic = require('../../util/graphic');
    var zrUtil = require('zrender/lib/core/util');
    var DataDiffer = require('../../data/DataDiffer');
 
    module.exports = require('../../echarts').extendChartView({
 
        type: 'themeRiver',
 
        init: function () {
            this._layers = [];
        },
 
        render: function (seriesModel, ecModel, api) {
            var data = seriesModel.getData();
            var rawData = seriesModel.getRawData();
 
            if (!data.count()) {
                return;
            }
 
            var group = this.group;
 
            var layerSeries = seriesModel.getLayerSeries();
 
            var layoutInfo = data.getLayout('layoutInfo');
            var rect = layoutInfo.rect;
            var boundaryGap = layoutInfo.boundaryGap;
 
            group.attr('position', [0, rect.y + boundaryGap[0]]);
 
            function keyGetter(item) {
                return item.name;
            }
            var dataDiffer = new DataDiffer(
                this._layersSeries || [], layerSeries,
                keyGetter, keyGetter
            );
 
            var newLayersGroups = {};
 
            dataDiffer.add(zrUtil.bind(zrUtil.curry(process, 'add'), this))
                .update(zrUtil.bind(zrUtil.curry(process, 'update'), this))
                .remove(zrUtil.bind(zrUtil.curry(process, 'remove'), this))
                .execute();
 
            function process(status, idx, oldIdx) {
                var oldLayersGroups = this._layers;
                if (status === 'remove') {
                    group.remove(oldLayersGroups[idx]);
                    return;
                }
                var points0 = [];
                var points1 = [];
                var color;
                var indices = layerSeries[idx].indices;
                for (var j = 0; j < indices.length; j++) {
                    var layout = data.getItemLayout(indices[j]);
                    var x = layout.x;
                    var y0 = layout.y0;
                    var y = layout.y;
 
                    points0.push([x, y0]);
                    points1.push([x, y0 + y]);
 
                    color = rawData.getItemVisual(indices[j], 'color');
                }
 
                var polygon;
                var text;
                var textLayout = data.getItemLayout(indices[0]);
                var itemModel = data.getItemModel(indices[j - 1]);
                var labelModel = itemModel.getModel('label.normal');
                var margin = labelModel.get('margin');
                if (status === 'add') {
                    var layerGroup = newLayersGroups[idx] = new graphic.Group();
                    polygon = new poly.Polygon({
                        shape: {
                            points: points0,
                            stackedOnPoints: points1,
                            smooth: 0.4,
                            stackedOnSmooth: 0.4,
                            smoothConstraint: false
                        },
                        z2: 0
                    });
                    text = new graphic.Text({
                        style: {
                            x: textLayout.x - margin,
                            y: textLayout.y0 + textLayout.y / 2
                        }
                    });
                    layerGroup.add(polygon);
                    layerGroup.add(text);
                    group.add(layerGroup);
 
                    polygon.setClipPath(createGridClipShape(polygon.getBoundingRect(), seriesModel, function () {
                        polygon.removeClipPath();
                    }));
                }
                else {
                    var layerGroup = oldLayersGroups[oldIdx];
                    polygon = layerGroup.childAt(0);
                    text = layerGroup.childAt(1);
                    group.add(layerGroup);
 
                    newLayersGroups[idx] = layerGroup;
 
                    graphic.updateProps(polygon, {
                        shape: {
                            points: points0,
                            stackedOnPoints: points1
                        }
                    }, seriesModel);
 
                    graphic.updateProps(text, {
                        style: {
                            x: textLayout.x - margin,
                            y: textLayout.y0 + textLayout.y / 2
                        }
                    }, seriesModel);
                }
 
                var hoverItemStyleModel = itemModel.getModel('itemStyle.emphasis');
                var itemStyleModel = itemModel.getModel('itemStyle.normal');
                var textStyleModel = labelModel.getModel('textStyle');
 
                text.setStyle({
                    text: labelModel.get('show')
                        ? seriesModel.getFormattedLabel(indices[j - 1], 'normal')
                            || data.getName(indices[j - 1])
                        : '',
                    textFont: textStyleModel.getFont(),
                    textAlign: labelModel.get('textAlign'),
                    textVerticalAlign: 'middle'
                });
 
                polygon.setStyle(zrUtil.extend({
                    fill: color
                }, itemStyleModel.getItemStyle(['color'])));
 
                graphic.setHoverStyle(polygon, hoverItemStyleModel.getItemStyle());
            }
 
            this._layersSeries = layerSeries;
            this._layers = newLayersGroups;
        },
 
        dispose: function () {}
    });
 
    // add animation to the view
    function createGridClipShape(rect, seriesModel, cb) {
        var rectEl = new graphic.Rect({
            shape: {
                x: rect.x - 10,
                y: rect.y - 10,
                width: 0,
                height: rect.height + 20
            }
        });
        graphic.initProps(rectEl, {
            shape: {
                width: rect.width + 20,
                height: rect.height + 20
            }
        }, seriesModel, cb);
 
        return rectEl;
    }
 
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/themeRiver/themeRiverLayout.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/themeRiver/themeRiverLayout.js

Statements: 7.35% (5 / 68)      Branches: 0% (0 / 8)      Functions: 0% (0 / 6)      Lines: 7.35% (5 / 68)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145            1 1     1                                                                                         1                                                                                                       1                                                                          
/**
 * @file  Using layout algorithm transform the raw data to layout information.
 * @author Deqing Li(annong035@gmail.com)
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
    var numberUtil =  require('../../util/number');
 
 
    module.exports = function (ecModel, api) {
 
        ecModel.eachSeriesByType('themeRiver', function (seriesModel) {
 
            var data = seriesModel.getData();
 
            var single = seriesModel.coordinateSystem;
 
            var layoutInfo = {};
 
            // use the axis boundingRect for view
            var rect = single.getRect();
 
            layoutInfo.rect = rect;
 
            var boundaryGap = seriesModel.get('boundaryGap');
 
            var axis = single.getAxis();
 
            layoutInfo.boundaryGap = boundaryGap;
 
            if (axis.orient === 'horizontal') {
                boundaryGap[0] = numberUtil.parsePercent(boundaryGap[0], rect.height);
                boundaryGap[1] = numberUtil.parsePercent(boundaryGap[1], rect.height);
                var height = rect.height - boundaryGap[0] - boundaryGap[1];
                themeRiverLayout(data, seriesModel, height);
            }
            else {
                boundaryGap[0] = numberUtil.parsePercent(boundaryGap[0], rect.width);
                boundaryGap[1] = numberUtil.parsePercent(boundaryGap[1], rect.width);
                var width = rect.width - boundaryGap[0] - boundaryGap[1];
                themeRiverLayout(data, seriesModel, width);
            }
 
            data.setLayout('layoutInfo', layoutInfo);
        });
    };
 
    /**
     * The layout information about themeriver
     *
     * @param {module:echarts/data/List} data  data in the series
     * @param {module:echarts/model/Series} seriesModel  the model object of themeRiver series
     * @param {number} height  value used to compute every series height
     */
    function themeRiverLayout(data, seriesModel, height) {
        if (!data.count()) {
            return;
        }
        var coordSys = seriesModel.coordinateSystem;
        // the data in each layer are organized into a series.
        var layerSeries = seriesModel.getLayerSeries();
 
        // the points in each layer.
        var layerPoints = zrUtil.map(layerSeries, function (singleLayer) {
            return zrUtil.map(singleLayer.indices, function (idx) {
                var pt = coordSys.dataToPoint(data.get('time', idx));
                pt[1] = data.get('value', idx);
                return pt;
            });
        });
 
        var base = computeBaseline(layerPoints);
        var baseLine = base.y0;
        var ky = height / base.max;
 
        // set layout information for each item.
        var n = layerSeries.length;
        var m = layerSeries[0].indices.length;
        var baseY0;
        for (var j = 0; j < m; ++j) {
            baseY0 = baseLine[j] * ky;
            data.setItemLayout(layerSeries[0].indices[j], {
                layerIndex: 0,
                x: layerPoints[0][j][0],
                y0: baseY0,
                y: layerPoints[0][j][1] * ky
            });
            for (var i = 1; i < n; ++i) {
                baseY0 += layerPoints[i - 1][j][1] * ky;
                data.setItemLayout(layerSeries[i].indices[j], {
                    layerIndex: i,
                    x: layerPoints[i][j][0],
                    y0: baseY0,
                    y: layerPoints[i][j][1] * ky
                });
            }
        }
    }
 
    /**
     * Compute the baseLine of the rawdata
     * Inspired by Lee Byron's paper Stacked Graphs - Geometry & Aesthetics
     *
     * @param  {Array.<Array>} data  the points in each layer
     * @return {Array}
     */
    function computeBaseline(data) {
        var layerNum = data.length;
        var pointNum = data[0].length;
        var sums = [];
        var y0 = [];
        var max = 0;
        var temp;
        var base = {};
 
        for (var i = 0; i < pointNum; ++i) {
            for (var j = 0, temp = 0; j < layerNum; ++j) {
                temp += data[j][i][1];
            }
            if (temp > max) {
                max = temp;
            }
            sums.push(temp);
        }
 
        for (var k = 0; k < pointNum; ++k) {
            y0[k] = (max - sums[k]) / 2;
        }
        max = 0;
 
        for (var l = 0; l < pointNum; ++l) {
            var sum = sums[l] + y0[l];
            if (sum > max) {
                max = sum;
            }
        }
        base.y0 = y0;
        base.max = max;
 
        return base;
    }
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/themeRiver/themeRiverVisual.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/themeRiver/themeRiverVisual.js

Statements: 11.11% (1 / 9)      Branches: 100% (0 / 0)      Functions: 0% (0 / 3)      Lines: 11.11% (1 / 9)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22            1                              
/**
 * @file Visual encoding for themeRiver view
 * @author  Deqing Li(annong035@gmail.com)
 */
 
 
    module.exports = function (ecModel) {
        ecModel.eachSeriesByType('themeRiver', function (seriesModel) {
            var data = seriesModel.getData();
            var rawData = seriesModel.getRawData();
            var colorList = seriesModel.get('color');
 
            data.each(function (index) {
                var name = data.getName(index);
                var color = colorList[(seriesModel.nameMap[name] - 1) % colorList.length];
                rawData.setItemVisual(index, 'color', color);
            });
        });
    };
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/treemap/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/treemap/

Statements: 13.01% (108 / 830)      Branches: 0% (0 / 497)      Functions: 0% (0 / 106)      Lines: 13.01% (108 / 830)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/chart/treemap/
File Statements Branches Functions Lines
Breadcrumb.js 21.43% (12 / 56) 0% (0 / 20) 0% (0 / 7) 21.43% (12 / 56)
TreemapSeries.js 15.49% (11 / 71) 0% (0 / 44) 0% (0 / 12) 15.49% (11 / 71)
TreemapView.js 11.28% (37 / 328) 0% (0 / 200) 0% (0 / 50) 11.28% (37 / 328)
helper.js 12% (3 / 25) 0% (0 / 15) 0% (0 / 4) 12% (3 / 25)
treemapAction.js 53.33% (8 / 15) 0% (0 / 6) 0% (0 / 3) 53.33% (8 / 15)
treemapLayout.js 9.62% (23 / 239) 0% (0 / 138) 0% (0 / 17) 9.62% (23 / 239)
treemapVisual.js 14.58% (14 / 96) 0% (0 / 74) 0% (0 / 13) 14.58% (14 / 96)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/treemap/Breadcrumb.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/treemap/Breadcrumb.js

Statements: 21.43% (12 / 56)      Branches: 0% (0 / 20)      Functions: 0% (0 / 7)      Lines: 21.43% (12 / 56)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172    1 1 1 1   1 1 1   1                   1                                                                                                                                                                                                                                             1                         1                               1    
 
 
    var graphic = require('../../util/graphic');
    var layout = require('../../util/layout');
    var zrUtil = require('zrender/lib/core/util');
    var helper = require('./helper');
 
    var TEXT_PADDING = 8;
    var ITEM_GAP = 8;
    var ARRAY_LENGTH = 5;
 
    function Breadcrumb(containerGroup) {
        /**
         * @private
         * @type {module:zrender/container/Group}
         */
        this.group = new graphic.Group();
 
        containerGroup.add(this.group);
    }
 
    Breadcrumb.prototype = {
 
        constructor: Breadcrumb,
 
        render: function (seriesModel, api, targetNode, onSelect) {
            var model = seriesModel.getModel('breadcrumb');
            var thisGroup = this.group;
 
            thisGroup.removeAll();
 
            if (!model.get('show') || !targetNode) {
                return;
            }
 
            var normalStyleModel = model.getModel('itemStyle.normal');
            // var emphasisStyleModel = model.getModel('itemStyle.emphasis');
            var textStyleModel = normalStyleModel.getModel('textStyle');
 
            var layoutParam = {
                pos: {
                    left: model.get('left'),
                    right: model.get('right'),
                    top: model.get('top'),
                    bottom: model.get('bottom')
                },
                box: {
                    width: api.getWidth(),
                    height: api.getHeight()
                },
                emptyItemWidth: model.get('emptyItemWidth'),
                totalWidth: 0,
                renderList: []
            };
 
            this._prepare(targetNode, layoutParam, textStyleModel);
            this._renderContent(seriesModel, layoutParam, normalStyleModel, textStyleModel, onSelect);
 
            layout.positionElement(thisGroup, layoutParam.pos, layoutParam.box);
        },
 
        /**
         * Prepare render list and total width
         * @private
         */
        _prepare: function (targetNode, layoutParam, textStyleModel) {
            for (var node = targetNode; node; node = node.parentNode) {
                var text = node.getModel().get('name');
                var textRect = textStyleModel.getTextRect(text);
                var itemWidth = Math.max(
                    textRect.width + TEXT_PADDING * 2,
                    layoutParam.emptyItemWidth
                );
                layoutParam.totalWidth += itemWidth + ITEM_GAP;
                layoutParam.renderList.push({node: node, text: text, width: itemWidth});
            }
        },
 
        /**
         * @private
         */
        _renderContent: function (
            seriesModel, layoutParam, normalStyleModel, textStyleModel, onSelect
        ) {
            // Start rendering.
            var lastX = 0;
            var emptyItemWidth = layoutParam.emptyItemWidth;
            var height = seriesModel.get('breadcrumb.height');
            var availableSize = layout.getAvailableSize(layoutParam.pos, layoutParam.box);
            var totalWidth = layoutParam.totalWidth;
            var renderList = layoutParam.renderList;
 
            for (var i = renderList.length - 1; i >= 0; i--) {
                var item = renderList[i];
                var itemNode = item.node;
                var itemWidth = item.width;
                var text = item.text;
 
                // Hdie text and shorten width if necessary.
                if (totalWidth > availableSize.width) {
                    totalWidth -= itemWidth - emptyItemWidth;
                    itemWidth = emptyItemWidth;
                    text = '';
                }
 
                var el = new graphic.Polygon({
                    shape: {
                        points: makeItemPoints(
                            lastX, 0, itemWidth, height,
                            i === renderList.length - 1, i === 0
                        )
                    },
                    style: zrUtil.defaults(
                        normalStyleModel.getItemStyle(),
                        {
                            lineJoin: 'bevel',
                            text: text,
                            textFill: textStyleModel.getTextColor(),
                            textFont: textStyleModel.getFont()
                        }
                    ),
                    z: 10,
                    onclick: zrUtil.curry(onSelect, itemNode)
                });
                this.group.add(el);
 
                packEventData(el, seriesModel, itemNode);
 
                lastX += itemWidth + ITEM_GAP;
            }
        },
 
        /**
         * @override
         */
        remove: function () {
            this.group.removeAll();
        }
    };
 
    function makeItemPoints(x, y, itemWidth, itemHeight, head, tail) {
        var points = [
            [head ? x : x - ARRAY_LENGTH, y],
            [x + itemWidth, y],
            [x + itemWidth, y + itemHeight],
            [head ? x : x - ARRAY_LENGTH, y + itemHeight]
        ];
        !tail && points.splice(2, 0, [x + itemWidth + ARRAY_LENGTH, y + itemHeight / 2]);
        !head && points.push([x, y + itemHeight / 2]);
        return points;
    }
 
    // Package custom mouse event.
    function packEventData(el, seriesModel, itemNode) {
        el.eventData = {
            componentType: 'series',
            componentSubType: 'treemap',
            seriesIndex: seriesModel.componentIndex,
            seriesName: seriesModel.name,
            seriesType: 'treemap',
            selfType: 'breadcrumb', // Distinguish with click event on treemap node.
            nodeData: {
                dataIndex: itemNode && itemNode.dataIndex,
                name: itemNode && itemNode.name
            },
            treePathInfo: itemNode && helper.wrapTreePathInfo(itemNode, seriesModel)
        };
    }
 
    module.exports = Breadcrumb;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/treemap/TreemapSeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/treemap/TreemapSeries.js

Statements: 15.49% (11 / 71)      Branches: 0% (0 / 44)      Functions: 0% (0 / 12)      Lines: 15.49% (11 / 71)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347    1 1 1 1 1 1 1 1     1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       1                                                                         1                                                          
 
 
    var SeriesModel = require('../../model/Series');
    var Tree = require('../../data/Tree');
    var zrUtil = require('zrender/lib/core/util');
    var Model = require('../../model/Model');
    var formatUtil = require('../../util/format');
    var helper = require('./helper');
    var encodeHTML = formatUtil.encodeHTML;
    var addCommas = formatUtil.addCommas;
 
 
    module.exports = SeriesModel.extend({
 
        type: 'series.treemap',
 
        layoutMode: 'box',
 
        dependencies: ['grid', 'polar'],
 
        /**
         * @type {module:echarts/data/Tree~Node}
         */
        _viewRoot: null,
 
        defaultOption: {
            // Disable progressive rendering
            progressive: 0,
            hoverLayerThreshold: Infinity,
            // center: ['50%', '50%'],          // not supported in ec3.
            // size: ['80%', '80%'],            // deprecated, compatible with ec2.
            left: 'center',
            top: 'middle',
            right: null,
            bottom: null,
            width: '80%',
            height: '80%',
            sort: true,                         // Can be null or false or true
                                                // (order by desc default, asc not supported yet (strange effect))
            clipWindow: 'origin',               // Size of clipped window when zooming. 'origin' or 'fullscreen'
            squareRatio: 0.5 * (1 + Math.sqrt(5)), // golden ratio
            leafDepth: null,                    // Nodes on depth from root are regarded as leaves.
                                                // Count from zero (zero represents only view root).
            drillDownIcon: '▶',                 // Use html character temporarily because it is complicated
                                                // to align specialized icon. ▷▶❒❐▼✚
 
            zoomToNodeRatio: 0.32 * 0.32,       // Be effective when using zoomToNode. Specify the proportion of the
                                                // target node area in the view area.
            roam: true,                         // true, false, 'scale' or 'zoom', 'move'.
            nodeClick: 'zoomToNode',            // Leaf node click behaviour: 'zoomToNode', 'link', false.
                                                // If leafDepth is set and clicking a node which has children but
                                                // be on left depth, the behaviour would be changing root. Otherwise
                                                // use behavious defined above.
            animation: true,
            animationDurationUpdate: 900,
            animationEasing: 'quinticInOut',
            breadcrumb: {
                show: true,
                height: 22,
                left: 'center',
                top: 'bottom',
                // right
                // bottom
                emptyItemWidth: 25,             // Width of empty node.
                itemStyle: {
                    normal: {
                        color: 'rgba(0,0,0,0.7)', //'#5793f3',
                        borderColor: 'rgba(255,255,255,0.7)',
                        borderWidth: 1,
                        shadowColor: 'rgba(150,150,150,1)',
                        shadowBlur: 3,
                        shadowOffsetX: 0,
                        shadowOffsetY: 0,
                        textStyle: {
                            color: '#fff'
                        }
                    },
                    emphasis: {
                        textStyle: {}
                    }
                }
            },
            label: {
                normal: {
                    show: true,
                    position: 'inside', // Can be [5, '5%'] or position stirng like 'insideTopLeft', ...
                    textStyle: {
                        color: '#fff',
                        ellipsis: true
                    }
                }
            },
            itemStyle: {
                normal: {
                    color: null,            // Can be 'none' if not necessary.
                    colorAlpha: null,       // Can be 'none' if not necessary.
                    colorSaturation: null,  // Can be 'none' if not necessary.
                    borderWidth: 0,
                    gapWidth: 0,
                    borderColor: '#fff',
                    borderColorSaturation: null // If specified, borderColor will be ineffective, and the
                                                // border color is evaluated by color of current node and
                                                // borderColorSaturation.
                },
                emphasis: {
 
                }
            },
 
            visualDimension: 0,                 // Can be 0, 1, 2, 3.
            visualMin: null,
            visualMax: null,
 
            color: [],                  // + treemapSeries.color should not be modified. Please only modified
                                        // level[n].color (if necessary).
                                        // + Specify color list of each level. level[0].color would be global
                                        // color list if not specified. (see method `setDefault`).
                                        // + But set as a empty array to forbid fetch color from global palette
                                        // when using nodeModel.get('color'), otherwise nodes on deep level
                                        // will always has color palette set and are not able to inherit color
                                        // from parent node.
                                        // + TreemapSeries.color can not be set as 'none', otherwise effect
                                        // legend color fetching (see seriesColor.js).
            colorAlpha: null,           // Array. Specify color alpha range of each level, like [0.2, 0.8]
            colorSaturation: null,      // Array. Specify color saturation of each level, like [0.2, 0.5]
            colorMappingBy: 'index',    // 'value' or 'index' or 'id'.
            visibleMin: 10,             // If area less than this threshold (unit: pixel^2), node will not
                                        // be rendered. Only works when sort is 'asc' or 'desc'.
            childrenVisibleMin: null,   // If area of a node less than this threshold (unit: pixel^2),
                                        // grandchildren will not show.
                                        // Why grandchildren? If not grandchildren but children,
                                        // some siblings show children and some not,
                                        // the appearance may be mess and not consistent,
            levels: []                  // Each item: {
                                        //     visibleMin, itemStyle, visualDimension, label
                                        // }
            // data: {
            //      value: [],
            //      children: [],
            //      link: 'http://xxx.xxx.xxx',
            //      target: 'blank' or 'self'
            // }
        },
 
        /**
         * @override
         */
        getInitialData: function (option, ecModel) {
            var rootName = option.name;
            rootName == null && (rootName = option.name);
 
            // Create a virtual root.
            var root = {name: rootName, children: option.data};
 
            completeTreeValue(root);
 
            var levels = option.levels || [];
 
            levels = option.levels = setDefault(levels, ecModel);
 
            // Make sure always a new tree is created when setOption,
            // in TreemapView, we check whether oldTree === newTree
            // to choose mappings approach among old shapes and new shapes.
            return Tree.createTree(root, this, levels).data;
        },
 
        optionUpdated: function () {
            this.resetViewRoot();
        },
 
        /**
         * @override
         * @param {number} dataIndex
         * @param {boolean} [mutipleSeries=false]
         */
        formatTooltip: function (dataIndex) {
            var data = this.getData();
            var value = this.getRawValue(dataIndex);
            var formattedValue = zrUtil.isArray(value)
                ? addCommas(value[0]) : addCommas(value);
            var name = data.getName(dataIndex);
 
            return encodeHTML(name + ': ' + formattedValue);
        },
 
        /**
         * Add tree path to tooltip param
         *
         * @override
         * @param {number} dataIndex
         * @return {Object}
         */
        getDataParams: function (dataIndex) {
            var params = SeriesModel.prototype.getDataParams.apply(this, arguments);
 
            var node = this.getData().tree.getNodeByDataIndex(dataIndex);
            params.treePathInfo = helper.wrapTreePathInfo(node, this);
 
            return params;
        },
 
        /**
         * @public
         * @param {Object} layoutInfo {
         *                                x: containerGroup x
         *                                y: containerGroup y
         *                                width: containerGroup width
         *                                height: containerGroup height
         *                            }
         */
        setLayoutInfo: function (layoutInfo) {
            /**
             * @readOnly
             * @type {Object}
             */
            this.layoutInfo = this.layoutInfo || {};
            zrUtil.extend(this.layoutInfo, layoutInfo);
        },
 
        /**
         * @param  {string} id
         * @return {number} index
         */
        mapIdToIndex: function (id) {
            // A feature is implemented:
            // index is monotone increasing with the sequence of
            // input id at the first time.
            // This feature can make sure that each data item and its
            // mapped color have the same index between data list and
            // color list at the beginning, which is useful for user
            // to adjust data-color mapping.
 
            /**
             * @private
             * @type {Object}
             */
            var idIndexMap = this._idIndexMap;
 
            if (!idIndexMap) {
                idIndexMap = this._idIndexMap = {};
                /**
                 * @private
                 * @type {number}
                 */
                this._idIndexMapCount = 0;
            }
 
            var index = idIndexMap[id];
            if (index == null) {
                idIndexMap[id] = index = this._idIndexMapCount++;
            }
 
            return index;
        },
 
        getViewRoot: function () {
            return this._viewRoot;
        },
 
        /**
         * @param {module:echarts/data/Tree~Node} [viewRoot]
         */
        resetViewRoot: function (viewRoot) {
            viewRoot
                ? (this._viewRoot = viewRoot)
                : (viewRoot = this._viewRoot);
 
            var root = this.getData().tree.root;
 
            if (!viewRoot
                || (viewRoot !== root && !root.contains(viewRoot))
            ) {
                this._viewRoot = root;
            }
        }
    });
 
    /**
     * @param {Object} dataNode
     */
    function completeTreeValue(dataNode) {
        // Postorder travel tree.
        // If value of none-leaf node is not set,
        // calculate it by suming up the value of all children.
        var sum = 0;
 
        zrUtil.each(dataNode.children, function (child) {
 
            completeTreeValue(child);
 
            var childValue = child.value;
            zrUtil.isArray(childValue) && (childValue = childValue[0]);
 
            sum += childValue;
        });
 
        var thisValue = dataNode.value;
        if (zrUtil.isArray(thisValue)) {
            thisValue = thisValue[0];
        }
 
        if (thisValue == null || isNaN(thisValue)) {
            thisValue = sum;
        }
        // Value should not less than 0.
        if (thisValue < 0) {
            thisValue = 0;
        }
 
        zrUtil.isArray(dataNode.value)
            ? (dataNode.value[0] = thisValue)
            : (dataNode.value = thisValue);
    }
 
    /**
     * set default to level configuration
     */
    function setDefault(levels, ecModel) {
        var globalColorList = ecModel.get('color');
 
        if (!globalColorList) {
            return;
        }
 
        levels = levels || [];
        var hasColorDefine;
        zrUtil.each(levels, function (levelDefine) {
            var model = new Model(levelDefine);
            var modelColor = model.get('color');
 
            if (model.get('itemStyle.normal.color')
                || (modelColor && modelColor !== 'none')
            ) {
                hasColorDefine = true;
            }
        });
 
        if (!hasColorDefine) {
            var level0 = levels[0] || (levels[0] = {});
            level0.color = globalColorList.slice();
        }
 
        return levels;
    }
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/treemap/TreemapView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/treemap/TreemapView.js

Statements: 11.28% (37 / 328)      Branches: 0% (0 / 200)      Functions: 0% (0 / 50)      Lines: 11.28% (37 / 328)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880    1 1 1 1 1 1 1 1 1 1 1 1 1   1 1 1 1 1 1   1                                                                                                                                                                                                                                                                                                                               1                                       1         1                               1                     1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             1                                                                                                     1                                                                                                                                                                                   1               1                                                                                                                                     1                                                             1                                   1                                   1                                                       1                                         1                 1                                                                   1            
 
 
    var zrUtil = require('zrender/lib/core/util');
    var graphic = require('../../util/graphic');
    var DataDiffer = require('../../data/DataDiffer');
    var helper = require('./helper');
    var Breadcrumb = require('./Breadcrumb');
    var RoamController = require('../../component/helper/RoamController');
    var BoundingRect = require('zrender/lib/core/BoundingRect');
    var matrix = require('zrender/lib/core/matrix');
    var animationUtil = require('../../util/animation');
    var bind = zrUtil.bind;
    var Group = graphic.Group;
    var Rect = graphic.Rect;
    var each = zrUtil.each;
 
    var DRAG_THRESHOLD = 3;
    var PATH_LABEL_NORMAL = ['label', 'normal'];
    var PATH_LABEL_EMPHASIS = ['label', 'emphasis'];
    var Z_BASE = 10; // Should bigger than every z.
    var Z_BG = 1;
    var Z_CONTENT = 2;
 
    module.exports = require('../../echarts').extendChartView({
 
        type: 'treemap',
 
        /**
         * @override
         */
        init: function (o, api) {
 
            /**
             * @private
             * @type {module:zrender/container/Group}
             */
            this._containerGroup;
 
            /**
             * @private
             * @type {Object.<string, Array.<module:zrender/container/Group>>}
             */
            this._storage = createStorage();
 
            /**
             * @private
             * @type {module:echarts/data/Tree}
             */
            this._oldTree;
 
            /**
             * @private
             * @type {module:echarts/chart/treemap/Breadcrumb}
             */
            this._breadcrumb;
 
            /**
             * @private
             * @type {module:echarts/component/helper/RoamController}
             */
            this._controller;
 
            /**
             * 'ready', 'animating'
             * @private
             */
            this._state = 'ready';
 
            /**
             * @private
             * @type {boolean}
             */
            this._mayClick;
        },
 
        /**
         * @override
         */
        render: function (seriesModel, ecModel, api, payload) {
 
            var models = ecModel.findComponents({
                mainType: 'series', subType: 'treemap', query: payload
            });
            if (zrUtil.indexOf(models, seriesModel) < 0) {
                return;
            }
 
            this.seriesModel = seriesModel;
            this.api = api;
            this.ecModel = ecModel;
 
            var targetInfo = helper.retrieveTargetInfo(payload, seriesModel);
            var payloadType = payload && payload.type;
            var layoutInfo = seriesModel.layoutInfo;
            var isInit = !this._oldTree;
            var thisStorage = this._storage;
 
            // Mark new root when action is treemapRootToNode.
            var reRoot = (payloadType === 'treemapRootToNode' && targetInfo && thisStorage)
                ? {
                    rootNodeGroup: thisStorage.nodeGroup[targetInfo.node.getRawIndex()],
                    direction: payload.direction
                }
                : null;
 
            var containerGroup = this._giveContainerGroup(layoutInfo);
 
            var renderResult = this._doRender(containerGroup, seriesModel, reRoot);
            (
                !isInit && (
                    !payloadType
                    || payloadType === 'treemapZoomToNode'
                    || payloadType === 'treemapRootToNode'
                )
            )
                ? this._doAnimation(containerGroup, renderResult, seriesModel, reRoot)
                : renderResult.renderFinally();
 
            this._resetController(api);
 
            this._renderBreadcrumb(seriesModel, api, targetInfo);
        },
 
        /**
         * @private
         */
        _giveContainerGroup: function (layoutInfo) {
            var containerGroup = this._containerGroup;
            if (!containerGroup) {
                // FIXME
                // 加一层containerGroup是为了clip,但是现在clip功能并没有实现。
                containerGroup = this._containerGroup = new Group();
                this._initEvents(containerGroup);
                this.group.add(containerGroup);
            }
            containerGroup.attr('position', [layoutInfo.x, layoutInfo.y]);
 
            return containerGroup;
        },
 
        /**
         * @private
         */
        _doRender: function (containerGroup, seriesModel, reRoot) {
            var thisTree = seriesModel.getData().tree;
            var oldTree = this._oldTree;
 
            // Clear last shape records.
            var lastsForAnimation = createStorage();
            var thisStorage = createStorage();
            var oldStorage = this._storage;
            var willInvisibleEls = [];
            var doRenderNode = zrUtil.curry(
                renderNode, seriesModel,
                thisStorage, oldStorage, reRoot,
                lastsForAnimation, willInvisibleEls
            );
 
            // Notice: when thisTree and oldTree are the same tree (see list.cloneShadow),
            // the oldTree is actually losted, so we can not find all of the old graphic
            // elements from tree. So we use this stragegy: make element storage, move
            // from old storage to new storage, clear old storage.
 
            dualTravel(
                thisTree.root ? [thisTree.root] : [],
                (oldTree && oldTree.root) ? [oldTree.root] : [],
                containerGroup,
                thisTree === oldTree || !oldTree,
                0
            );
 
            // Process all removing.
            var willDeleteEls = clearStorage(oldStorage);
 
            this._oldTree = thisTree;
            this._storage = thisStorage;
 
            return {
                lastsForAnimation: lastsForAnimation,
                willDeleteEls: willDeleteEls,
                renderFinally: renderFinally
            };
 
            function dualTravel(thisViewChildren, oldViewChildren, parentGroup, sameTree, depth) {
                // When 'render' is triggered by action,
                // 'this' and 'old' may be the same tree,
                // we use rawIndex in that case.
                if (sameTree) {
                    oldViewChildren = thisViewChildren;
                    each(thisViewChildren, function (child, index) {
                        !child.isRemoved() && processNode(index, index);
                    });
                }
                // Diff hierarchically (diff only in each subtree, but not whole).
                // because, consistency of view is important.
                else {
                    (new DataDiffer(oldViewChildren, thisViewChildren, getKey, getKey))
                        .add(processNode)
                        .update(processNode)
                        .remove(zrUtil.curry(processNode, null))
                        .execute();
                }
 
                function getKey(node) {
                    // Identify by name or raw index.
                    return node.getId();
                }
 
                function processNode(newIndex, oldIndex) {
                    var thisNode = newIndex != null ? thisViewChildren[newIndex] : null;
                    var oldNode = oldIndex != null ? oldViewChildren[oldIndex] : null;
 
                    var group = doRenderNode(thisNode, oldNode, parentGroup, depth);
 
                    group && dualTravel(
                        thisNode && thisNode.viewChildren || [],
                        oldNode && oldNode.viewChildren || [],
                        group,
                        sameTree,
                        depth + 1
                    );
                }
            }
 
            function clearStorage(storage) {
                var willDeleteEls = createStorage();
                storage && each(storage, function (store, storageName) {
                    var delEls = willDeleteEls[storageName];
                    each(store, function (el) {
                        el && (delEls.push(el), el.__tmWillDelete = 1);
                    });
                });
                return willDeleteEls;
            }
 
            function renderFinally() {
                each(willDeleteEls, function (els) {
                    each(els, function (el) {
                        el.parent && el.parent.remove(el);
                    });
                });
                each(willInvisibleEls, function (el) {
                    el.invisible = true;
                    // Setting invisible is for optimizing, so no need to set dirty,
                    // just mark as invisible.
                    el.dirty();
                });
            }
        },
 
        /**
         * @private
         */
        _doAnimation: function (containerGroup, renderResult, seriesModel, reRoot) {
            if (!seriesModel.get('animation')) {
                return;
            }
 
            var duration = seriesModel.get('animationDurationUpdate');
            var easing = seriesModel.get('animationEasing');
            var animationWrap = animationUtil.createWrap();
 
            // Make delete animations.
            each(renderResult.willDeleteEls, function (store, storageName) {
                each(store, function (el, rawIndex) {
                    if (el.invisible) {
                        return;
                    }
 
                    var parent = el.parent; // Always has parent, and parent is nodeGroup.
                    var target;
 
                    if (reRoot && reRoot.direction === 'drillDown') {
                        target = parent === reRoot.rootNodeGroup
                            // This is the content element of view root.
                            // Only `content` will enter this branch, because
                            // `background` and `nodeGroup` will not be deleted.
                            ? {
                                shape: {
                                    x: 0,
                                    y: 0,
                                    width: parent.__tmNodeWidth,
                                    height: parent.__tmNodeHeight
                                },
                                style: {
                                    opacity: 0
                                }
                            }
                            // Others.
                            : {style: {opacity: 0}};
                    }
                    else {
                        var targetX = 0;
                        var targetY = 0;
 
                        if (!parent.__tmWillDelete) {
                            // Let node animate to right-bottom corner, cooperating with fadeout,
                            // which is appropriate for user understanding.
                            // Divided by 2 for reRoot rolling up effect.
                            targetX = parent.__tmNodeWidth / 2;
                            targetY = parent.__tmNodeHeight / 2;
                        }
 
                        target = storageName === 'nodeGroup'
                            ? {position: [targetX, targetY], style: {opacity: 0}}
                            : {
                                shape: {x: targetX, y: targetY, width: 0, height: 0},
                                style: {opacity: 0}
                            };
                    }
 
                    target && animationWrap.add(el, target, duration, easing);
                });
            });
 
            // Make other animations
            each(this._storage, function (store, storageName) {
                each(store, function (el, rawIndex) {
                    var last = renderResult.lastsForAnimation[storageName][rawIndex];
                    var target = {};
 
                    if (!last) {
                        return;
                    }
 
                    if (storageName === 'nodeGroup') {
                        if (last.old) {
                            target.position = el.position.slice();
                            el.attr('position', last.old);
                        }
                    }
                    else {
                        if (last.old) {
                            target.shape = zrUtil.extend({}, el.shape);
                            el.setShape(last.old);
                        }
 
                        if (last.fadein) {
                            el.setStyle('opacity', 0);
                            target.style = {opacity: 1};
                        }
                        // When animation is stopped for succedent animation starting,
                        // el.style.opacity might not be 1
                        else if (el.style.opacity !== 1) {
                            target.style = {opacity: 1};
                        }
                    }
 
                    animationWrap.add(el, target, duration, easing);
                });
            }, this);
 
            this._state = 'animating';
 
            animationWrap
                .done(bind(function () {
                    this._state = 'ready';
                    renderResult.renderFinally();
                }, this))
                .start();
        },
 
        /**
         * @private
         */
        _resetController: function (api) {
            var controller = this._controller;
 
            // Init controller.
            if (!controller) {
                controller = this._controller = new RoamController(api.getZr());
                controller.enable(this.seriesModel.get('roam'));
                controller.on('pan', bind(this._onPan, this));
                controller.on('zoom', bind(this._onZoom, this));
            }
 
            var rect = new BoundingRect(0, 0, api.getWidth(), api.getHeight());
            controller.setPointerChecker(function (e, x, y) {
                return rect.contain(x, y);
            });
        },
 
        /**
         * @private
         */
        _clearController: function () {
            var controller = this._controller;
            if (controller) {
                controller.dispose();
                controller = null;
            }
        },
 
        /**
         * @private
         */
        _onPan: function (dx, dy) {
            this._mayClick = false;
 
            if (this._state !== 'animating'
                && (Math.abs(dx) > DRAG_THRESHOLD || Math.abs(dy) > DRAG_THRESHOLD)
            ) {
                // These param must not be cached.
                var root = this.seriesModel.getData().tree.root;
 
                if (!root) {
                    return;
                }
 
                var rootLayout = root.getLayout();
 
                if (!rootLayout) {
                    return;
                }
 
                this.api.dispatchAction({
                    type: 'treemapMove',
                    from: this.uid,
                    seriesId: this.seriesModel.id,
                    rootRect: {
                        x: rootLayout.x + dx, y: rootLayout.y + dy,
                        width: rootLayout.width, height: rootLayout.height
                    }
                });
            }
        },
 
        /**
         * @private
         */
        _onZoom: function (scale, mouseX, mouseY) {
            this._mayClick = false;
 
            if (this._state !== 'animating') {
                // These param must not be cached.
                var root = this.seriesModel.getData().tree.root;
 
                if (!root) {
                    return;
                }
 
                var rootLayout = root.getLayout();
 
                if (!rootLayout) {
                    return;
                }
 
                var rect = new BoundingRect(
                    rootLayout.x, rootLayout.y, rootLayout.width, rootLayout.height
                );
                var layoutInfo = this.seriesModel.layoutInfo;
 
                // Transform mouse coord from global to containerGroup.
                mouseX -= layoutInfo.x;
                mouseY -= layoutInfo.y;
 
                // Scale root bounding rect.
                var m = matrix.create();
                matrix.translate(m, m, [-mouseX, -mouseY]);
                matrix.scale(m, m, [scale, scale]);
                matrix.translate(m, m, [mouseX, mouseY]);
 
                rect.applyTransform(m);
 
                this.api.dispatchAction({
                    type: 'treemapRender',
                    from: this.uid,
                    seriesId: this.seriesModel.id,
                    rootRect: {
                        x: rect.x, y: rect.y,
                        width: rect.width, height: rect.height
                    }
                });
            }
        },
 
        /**
         * @private
         */
        _initEvents: function (containerGroup) {
            // FIXME
            // 不用click以及silent的原因是,animate时视图设置silent true来避免click生效,
            // 但是animate中,按下鼠标,animate结束后(silent设回为false)松开鼠标,
            // 还是会触发click,期望是不触发。
 
            // Mousedown occurs when drag start, and mouseup occurs when drag end,
            // click event should not be triggered in that case.
 
            containerGroup.on('mousedown', function (e) {
                this._state === 'ready' && (this._mayClick = true);
            }, this);
            containerGroup.on('mouseup', function (e) {
                if (this._mayClick) {
                    this._mayClick = false;
                    this._state === 'ready' && onClick.call(this, e);
                }
            }, this);
 
            function onClick(e) {
                var nodeClick = this.seriesModel.get('nodeClick', true);
 
                if (!nodeClick) {
                    return;
                }
 
                var targetInfo = this.findTarget(e.offsetX, e.offsetY);
 
                if (!targetInfo) {
                    return;
                }
 
                var node = targetInfo.node;
                if (node.getLayout().isLeafRoot) {
                    this._rootToNode(targetInfo);
                }
                else {
                    if (nodeClick === 'zoomToNode') {
                        this._zoomToNode(targetInfo);
                    }
                    else if (nodeClick === 'link') {
                        var itemModel = node.hostTree.data.getItemModel(node.dataIndex);
                        var link = itemModel.get('link', true);
                        var linkTarget = itemModel.get('target', true) || 'blank';
                        link && window.open(link, linkTarget);
                    }
                }
            }
        },
 
        /**
         * @private
         */
        _renderBreadcrumb: function (seriesModel, api, targetInfo) {
            if (!targetInfo) {
                targetInfo = seriesModel.get('leafDepth', true) != null
                    ? {node: seriesModel.getViewRoot()}
                    // FIXME
                    // better way?
                    // Find breadcrumb tail on center of containerGroup.
                    : this.findTarget(api.getWidth() / 2, api.getHeight() / 2);
 
                if (!targetInfo) {
                    targetInfo = {node: seriesModel.getData().tree.root};
                }
            }
 
            (this._breadcrumb || (this._breadcrumb = new Breadcrumb(this.group)))
                .render(seriesModel, api, targetInfo.node, bind(onSelect, this));
 
            function onSelect(node) {
                if (this._state !== 'animating') {
                    helper.aboveViewRoot(seriesModel.getViewRoot(), node)
                        ? this._rootToNode({node: node})
                        : this._zoomToNode({node: node});
                }
            }
        },
 
        /**
         * @override
         */
        remove: function () {
            this._clearController();
            this._containerGroup && this._containerGroup.removeAll();
            this._storage = createStorage();
            this._state = 'ready';
            this._breadcrumb && this._breadcrumb.remove();
        },
 
        dispose: function () {
            this._clearController();
        },
 
        /**
         * @private
         */
        _zoomToNode: function (targetInfo) {
            this.api.dispatchAction({
                type: 'treemapZoomToNode',
                from: this.uid,
                seriesId: this.seriesModel.id,
                targetNode: targetInfo.node
            });
        },
 
        /**
         * @private
         */
        _rootToNode: function (targetInfo) {
            this.api.dispatchAction({
                type: 'treemapRootToNode',
                from: this.uid,
                seriesId: this.seriesModel.id,
                targetNode: targetInfo.node
            });
        },
 
        /**
         * @public
         * @param {number} x Global coord x.
         * @param {number} y Global coord y.
         * @return {Object} info If not found, return undefined;
         * @return {number} info.node Target node.
         * @return {number} info.offsetX x refer to target node.
         * @return {number} info.offsetY y refer to target node.
         */
        findTarget: function (x, y) {
            var targetInfo;
            var viewRoot = this.seriesModel.getViewRoot();
 
            viewRoot.eachNode({attr: 'viewChildren', order: 'preorder'}, function (node) {
                var bgEl = this._storage.background[node.getRawIndex()];
                // If invisible, there might be no element.
                if (bgEl) {
                    var point = bgEl.transformCoordToLocal(x, y);
                    var shape = bgEl.shape;
 
                    // For performance consideration, dont use 'getBoundingRect'.
                    if (shape.x <= point[0]
                        && point[0] <= shape.x + shape.width
                        && shape.y <= point[1]
                        && point[1] <= shape.y + shape.height
                    ) {
                        targetInfo = {node: node, offsetX: point[0], offsetY: point[1]};
                    }
                    else {
                        return false; // Suppress visit subtree.
                    }
                }
            }, this);
 
            return targetInfo;
        }
 
    });
 
    /**
     * @inner
     */
    function createStorage() {
        return {nodeGroup: [], background: [], content: []};
    }
 
    /**
     * @inner
     * @return Return undefined means do not travel further.
     */
    function renderNode(
        seriesModel, thisStorage, oldStorage, reRoot,
        lastsForAnimation, willInvisibleEls,
        thisNode, oldNode, parentGroup, depth
    ) {
        // Whether under viewRoot.
        if (!thisNode) {
            // Deleting nodes will be performed finally. This method just find
            // element from old storage, or create new element, set them to new
            // storage, and set styles.
            return;
        }
 
        var thisLayout = thisNode.getLayout();
 
        if (!thisLayout || !thisLayout.isInView) {
            return;
        }
 
        var thisWidth = thisLayout.width;
        var thisHeight = thisLayout.height;
        var thisInvisible = thisLayout.invisible;
 
        var thisRawIndex = thisNode.getRawIndex();
        var oldRawIndex = oldNode && oldNode.getRawIndex();
 
        // Node group
        var group = giveGraphic('nodeGroup', Group);
 
        if (!group) {
            return;
        }
 
        parentGroup.add(group);
        // x,y are not set when el is above view root.
        group.attr('position', [thisLayout.x || 0, thisLayout.y || 0]);
        group.__tmNodeWidth = thisWidth;
        group.__tmNodeHeight = thisHeight;
 
        if (thisLayout.isAboveViewRoot) {
            return group;
        }
 
        // Background
        var bg = giveGraphic('background', Rect, depth, Z_BG);
        if (bg) {
            bg.setShape({x: 0, y: 0, width: thisWidth, height: thisHeight});
            updateStyle(bg, function () {
                bg.setStyle('fill', thisNode.getVisual('borderColor', true));
            });
            group.add(bg);
        }
 
        var thisViewChildren = thisNode.viewChildren;
 
        // No children, render content.
        if (!thisViewChildren || !thisViewChildren.length) {
            var content = giveGraphic('content', Rect, depth, Z_CONTENT);
            content && renderContent(group);
        }
 
        return group;
 
        // ----------------------------
        // | Procedures in renderNode |
        // ----------------------------
 
        function renderContent(group) {
            // For tooltip.
            content.dataIndex = thisNode.dataIndex;
            content.seriesIndex = seriesModel.seriesIndex;
 
            var borderWidth = thisLayout.borderWidth;
            var contentWidth = Math.max(thisWidth - 2 * borderWidth, 0);
            var contentHeight = Math.max(thisHeight - 2 * borderWidth, 0);
 
            content.culling = true;
            content.setShape({
                x: borderWidth,
                y: borderWidth,
                width: contentWidth,
                height: contentHeight
            });
 
            var visualColor = thisNode.getVisual('color', true);
            updateStyle(content, function () {
                var normalStyle = {fill: visualColor};
                var emphasisStyle = thisNode.getModel('itemStyle.emphasis').getItemStyle();
 
                prepareText(normalStyle, emphasisStyle, visualColor, contentWidth, contentHeight);
 
                content.setStyle(normalStyle);
                graphic.setHoverStyle(content, emphasisStyle);
            });
 
            group.add(content);
        }
 
        function updateStyle(element, cb) {
            if (!thisInvisible) {
                // If invisible, do not set visual, otherwise the element will
                // change immediately before animation. We think it is OK to
                // remain its origin color when moving out of the view window.
                cb();
 
                if (!element.__tmWillVisible) {
                    element.invisible = false;
                }
            }
            else {
                // Delay invisible setting utill animation finished,
                // avoid element vanish suddenly before animation.
                !element.invisible && willInvisibleEls.push(element);
            }
        }
 
        function prepareText(normalStyle, emphasisStyle, visualColor, contentWidth, contentHeight) {
            var nodeModel = thisNode.getModel();
            var text = nodeModel.get('name');
            if (thisLayout.isLeafRoot) {
                var iconChar = seriesModel.get('drillDownIcon', true);
                text = iconChar ? iconChar + ' ' + text : text;
            }
 
            setText(
                text, normalStyle, nodeModel, PATH_LABEL_NORMAL,
                visualColor, contentWidth, contentHeight
            );
            setText(
                text, emphasisStyle, nodeModel, PATH_LABEL_EMPHASIS,
                visualColor, contentWidth, contentHeight
            );
        }
 
        function setText(text, style, nodeModel, labelPath, visualColor, contentWidth, contentHeight) {
            var labelModel = nodeModel.getModel(labelPath);
            var labelTextStyleModel = labelModel.getModel('textStyle');
 
            graphic.setText(style, labelModel, visualColor);
 
            // text.align and text.baseline is not included by graphic.setText,
            // because in most cases the two attributes are not exposed to user,
            // except in treemap.
            style.textAlign = labelTextStyleModel.get('align');
            style.textVerticalAlign = labelTextStyleModel.get('baseline');
 
            var textRect = labelTextStyleModel.getTextRect(text);
            if (!labelModel.getShallow('show') || textRect.height > contentHeight) {
                style.text = '';
            }
            else if (textRect.width > contentWidth) {
                style.text = labelTextStyleModel.get('ellipsis')
                    ? labelTextStyleModel.truncateText(
                        text, contentWidth, null, {minChar: 2}
                    )
                    : '';
            }
            else {
                style.text = text;
            }
        }
 
        function giveGraphic(storageName, Ctor, depth, z) {
            var element = oldRawIndex != null && oldStorage[storageName][oldRawIndex];
            var lasts = lastsForAnimation[storageName];
 
            if (element) {
                // Remove from oldStorage
                oldStorage[storageName][oldRawIndex] = null;
                prepareAnimationWhenHasOld(lasts, element, storageName);
            }
            // If invisible and no old element, do not create new element (for optimizing).
            else if (!thisInvisible) {
                element = new Ctor({z: calculateZ(depth, z)});
                element.__tmDepth = depth;
                element.__tmStorageName = storageName;
                prepareAnimationWhenNoOld(lasts, element, storageName);
            }
 
            // Set to thisStorage
            return (thisStorage[storageName][thisRawIndex] = element);
        }
 
        function prepareAnimationWhenHasOld(lasts, element, storageName) {
            var lastCfg = lasts[thisRawIndex] = {};
            lastCfg.old = storageName === 'nodeGroup'
                ? element.position.slice()
                : zrUtil.extend({}, element.shape);
        }
 
        // If a element is new, we need to find the animation start point carefully,
        // otherwise it will looks strange when 'zoomToNode'.
        function prepareAnimationWhenNoOld(lasts, element, storageName) {
            var lastCfg = lasts[thisRawIndex] = {};
            var parentNode = thisNode.parentNode;
 
            if (parentNode && (!reRoot || reRoot.direction === 'drillDown')) {
                var parentOldX = 0;
                var parentOldY = 0;
 
                // New nodes appear from right-bottom corner in 'zoomToNode' animation.
                // For convenience, get old bounding rect from background.
                var parentOldBg = lastsForAnimation.background[parentNode.getRawIndex()];
                if (!reRoot && parentOldBg && parentOldBg.old) {
                    parentOldX = parentOldBg.old.width;
                    parentOldY = parentOldBg.old.height;
                }
 
                // When no parent old shape found, its parent is new too,
                // so we can just use {x:0, y:0}.
                lastCfg.old = storageName === 'nodeGroup'
                    ? [0, parentOldY]
                    : {x: parentOldX, y: parentOldY, width: 0, height: 0};
            }
 
            // Fade in, user can be aware that these nodes are new.
            lastCfg.fadein = storageName !== 'nodeGroup';
        }
    }
 
    // We can not set all backgroud with the same z, Because the behaviour of
    // drill down and roll up differ background creation sequence from tree
    // hierarchy sequence, which cause that lowser background element overlap
    // upper ones. So we calculate z based on depth.
    // Moreover, we try to shrink down z interval to [0, 1] to avoid that
    // treemap with large z overlaps other components.
    function calculateZ(depth, zInLevel) {
        var zb = depth * Z_BASE + zInLevel;
        return (zb - 1) / zb;
    }
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/treemap/helper.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/treemap/helper.js

Statements: 12% (3 / 25)      Branches: 0% (0 / 15)      Functions: 0% (0 / 4)      Lines: 12% (3 / 25)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64    1   1                                                                                                                 1    
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    var helper = {
 
        retrieveTargetInfo: function (payload, seriesModel) {
            if (payload
                && (
                    payload.type === 'treemapZoomToNode'
                    || payload.type === 'treemapRootToNode'
                )
            ) {
                var root = seriesModel.getData().tree.root;
                var targetNode = payload.targetNode;
                if (targetNode && root.contains(targetNode)) {
                    return {node: targetNode};
                }
 
                var targetNodeId = payload.targetNodeId;
                if (targetNodeId != null && (targetNode = root.getNodeById(targetNodeId))) {
                    return {node: targetNode};
                }
            }
        },
 
        // Not includes the given node at the last item.
        getPathToRoot: function (node) {
            var path = [];
            while (node) {
                node = node.parentNode;
                node && path.push(node);
            }
            return path.reverse();
        },
 
        aboveViewRoot: function (viewRoot, node) {
            var viewPath = helper.getPathToRoot(viewRoot);
            return zrUtil.indexOf(viewPath, node) >= 0;
        },
 
        // From root to the input node (the input node will be included).
        wrapTreePathInfo: function (node, seriesModel) {
            var treePathInfo = [];
 
            while (node) {
                var nodeDataIndex = node.dataIndex;
                treePathInfo.push({
                    name: node.name,
                    dataIndex: nodeDataIndex,
                    value: seriesModel.getRawValue(nodeDataIndex)
                });
                node = node.parentNode;
            }
 
            treePathInfo.reverse();
 
            return treePathInfo;
        }
    };
 
    module.exports = helper;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/treemap/treemapAction.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/treemap/treemapAction.js

Statements: 53.33% (8 / 15)      Branches: 0% (0 / 6)      Functions: 0% (0 / 3)      Lines: 53.33% (8 / 15)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46          1 1   1   1           1 3     1                 1                                
/**
 * @file Treemap action
 */
 
 
    var echarts = require('../../echarts');
    var helper = require('./helper');
 
    var noop = function () {};
 
    var actionTypes = [
        'treemapZoomToNode',
        'treemapRender',
        'treemapMove'
    ];
 
    for (var i = 0; i < actionTypes.length; i++) {
        echarts.registerAction({type: actionTypes[i], update: 'updateView'}, noop);
    }
 
    echarts.registerAction(
        {type: 'treemapRootToNode', update: 'updateView'},
        function (payload, ecModel) {
 
            ecModel.eachComponent(
                {mainType: 'series', subType: 'treemap', query: payload},
                handleRootToNode
            );
 
            function handleRootToNode(model, index) {
                var targetInfo = helper.retrieveTargetInfo(payload, model);
 
                if (targetInfo) {
                    var originViewRoot = model.getViewRoot();
                    if (originViewRoot) {
                        payload.direction = helper.aboveViewRoot(originViewRoot, targetInfo.node)
                            ? 'rollUp' : 'drillDown';
                    }
                    model.resetViewRoot(targetInfo.node);
                }
            }
        }
    );
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/treemap/treemapLayout.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/treemap/treemapLayout.js

Statements: 9.62% (23 / 239)      Branches: 0% (0 / 138)      Functions: 0% (0 / 17)      Lines: 9.62% (23 / 239)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556    1 1 1 1 1 1   1 1 1 1 1         1                                                                                                                                                                                                                                         1                                                                                                                                                               1                                                                                                       1                                                                 1                                   1                                                                                     1                                                   1                                                                                             1                                                                                           1                                                                             1                                                                   1    
 
 
    var zrUtil = require('zrender/lib/core/util');
    var numberUtil = require('../../util/number');
    var layout = require('../../util/layout');
    var helper = require('./helper');
    var BoundingRect = require('zrender/lib/core/BoundingRect');
    var helper = require('./helper');
 
    var mathMax = Math.max;
    var mathMin = Math.min;
    var parsePercent = numberUtil.parsePercent;
    var retrieveValue = zrUtil.retrieve;
    var each = zrUtil.each;
 
    /**
     * @public
     */
    function update(ecModel, api, payload) {
        // Layout result in each node:
        // {x, y, width, height, area, borderWidth}
        var condition = {mainType: 'series', subType: 'treemap', query: payload};
        ecModel.eachComponent(condition, function (seriesModel) {
 
            var ecWidth = api.getWidth();
            var ecHeight = api.getHeight();
            var seriesOption = seriesModel.option;
 
            var layoutInfo = layout.getLayoutRect(
                seriesModel.getBoxLayoutParams(),
                {
                    width: api.getWidth(),
                    height: api.getHeight()
                }
            );
 
            var size = seriesOption.size || []; // Compatible with ec2.
            var containerWidth = parsePercent(
                retrieveValue(layoutInfo.width, size[0]),
                ecWidth
            );
            var containerHeight = parsePercent(
                retrieveValue(layoutInfo.height, size[1]),
                ecHeight
            );
 
            // Fetch payload info.
            var payloadType = payload && payload.type;
            var targetInfo = helper.retrieveTargetInfo(payload, seriesModel);
            var rootRect = (payloadType === 'treemapRender' || payloadType === 'treemapMove')
                ? payload.rootRect : null;
            var viewRoot = seriesModel.getViewRoot();
            var viewAbovePath = helper.getPathToRoot(viewRoot);
 
            if (payloadType !== 'treemapMove') {
                var rootSize = payloadType === 'treemapZoomToNode'
                    ? estimateRootSize(
                        seriesModel, targetInfo, viewRoot, containerWidth, containerHeight
                    )
                    : rootRect
                    ? [rootRect.width, rootRect.height]
                    : [containerWidth, containerHeight];
 
                var sort = seriesOption.sort;
                if (sort && sort !== 'asc' && sort !== 'desc') {
                    sort = 'desc';
                }
                var options = {
                    squareRatio: seriesOption.squareRatio,
                    sort: sort,
                    leafDepth: seriesOption.leafDepth
                };
 
                // layout should be cleared because using updateView but not update.
                viewRoot.hostTree.clearLayouts();
 
                // TODO
                // optimize: if out of view clip, do not layout.
                // But take care that if do not render node out of view clip,
                // how to calculate start po
 
                var viewRootLayout = {
                    x: 0, y: 0,
                    width: rootSize[0], height: rootSize[1],
                    area: rootSize[0] * rootSize[1]
                };
                viewRoot.setLayout(viewRootLayout);
 
                squarify(viewRoot, options, false, 0);
                // Supplement layout.
                var viewRootLayout = viewRoot.getLayout();
                each(viewAbovePath, function (node, index) {
                    var childValue = (viewAbovePath[index + 1] || viewRoot).getValue();
                    node.setLayout(zrUtil.extend(
                        {dataExtent: [childValue, childValue], borderWidth: 0},
                        viewRootLayout
                    ));
                });
            }
 
            var treeRoot = seriesModel.getData().tree.root;
 
            treeRoot.setLayout(
                calculateRootPosition(layoutInfo, rootRect, targetInfo),
                true
            );
 
            seriesModel.setLayoutInfo(layoutInfo);
 
            // FIXME
            // 现在没有clip功能,暂时取ec高宽。
            prunning(
                treeRoot,
                // Transform to base element coordinate system.
                new BoundingRect(-layoutInfo.x, -layoutInfo.y, ecWidth, ecHeight),
                viewAbovePath,
                viewRoot,
                0
            );
        });
    }
 
    /**
     * Layout treemap with squarify algorithm.
     * @see https://graphics.ethz.ch/teaching/scivis_common/Literature/squarifiedTreeMaps.pdf
     * @see https://github.com/mbostock/d3/blob/master/src/layout/treemap.js
     *
     * @protected
     * @param {module:echarts/data/Tree~TreeNode} node
     * @param {Object} options
     * @param {string} options.sort 'asc' or 'desc'
     * @param {number} options.squareRatio
     * @param {boolean} hideChildren
     * @param {number} depth
     */
    function squarify(node, options, hideChildren, depth) {
        var width;
        var height;
 
        if (node.isRemoved()) {
            return;
        }
 
        var thisLayout = node.getLayout();
        width = thisLayout.width;
        height = thisLayout.height;
 
        // Considering border and gap
        var itemStyleModel = node.getModel('itemStyle.normal');
        var borderWidth = itemStyleModel.get('borderWidth');
        var halfGapWidth = itemStyleModel.get('gapWidth') / 2;
        var layoutOffset = borderWidth - halfGapWidth;
        var nodeModel = node.getModel();
 
        node.setLayout({borderWidth: borderWidth}, true);
 
        width = mathMax(width - 2 * layoutOffset, 0);
        height = mathMax(height - 2 * layoutOffset, 0);
 
        var totalArea = width * height;
        var viewChildren = initChildren(
            node, nodeModel, totalArea, options, hideChildren, depth
        );
 
        if (!viewChildren.length) {
            return;
        }
 
        var rect = {x: layoutOffset, y: layoutOffset, width: width, height: height};
        var rowFixedLength = mathMin(width, height);
        var best = Infinity; // the best row score so far
        var row = [];
        row.area = 0;
 
        for (var i = 0, len = viewChildren.length; i < len;) {
            var child = viewChildren[i];
 
            row.push(child);
            row.area += child.getLayout().area;
            var score = worst(row, rowFixedLength, options.squareRatio);
 
            // continue with this orientation
            if (score <= best) {
                i++;
                best = score;
            }
            // abort, and try a different orientation
            else {
                row.area -= row.pop().getLayout().area;
                position(row, rowFixedLength, rect, halfGapWidth, false);
                rowFixedLength = mathMin(rect.width, rect.height);
                row.length = row.area = 0;
                best = Infinity;
            }
        }
 
        if (row.length) {
            position(row, rowFixedLength, rect, halfGapWidth, true);
        }
 
        if (!hideChildren) {
            var childrenVisibleMin = nodeModel.get('childrenVisibleMin');
            if (childrenVisibleMin != null && totalArea < childrenVisibleMin) {
                hideChildren = true;
            }
        }
 
        for (var i = 0, len = viewChildren.length; i < len; i++) {
            squarify(viewChildren[i], options, hideChildren, depth + 1);
        }
    }
 
    /**
     * Set area to each child, and calculate data extent for visual coding.
     */
    function initChildren(node, nodeModel, totalArea, options, hideChildren, depth) {
        var viewChildren = node.children || [];
        var orderBy = options.sort;
        orderBy !== 'asc' && orderBy !== 'desc' && (orderBy = null);
 
        var overLeafDepth = options.leafDepth != null && options.leafDepth <= depth;
 
        // leafDepth has higher priority.
        if (hideChildren && !overLeafDepth) {
            return (node.viewChildren = []);
        }
 
        // Sort children, order by desc.
        viewChildren = zrUtil.filter(viewChildren, function (child) {
            return !child.isRemoved();
        });
 
        sort(viewChildren, orderBy);
 
        var info = statistic(nodeModel, viewChildren, orderBy);
 
        if (info.sum === 0) {
            return (node.viewChildren = []);
        }
 
        info.sum = filterByThreshold(nodeModel, totalArea, info.sum, orderBy, viewChildren);
 
        if (info.sum === 0) {
            return (node.viewChildren = []);
        }
 
        // Set area to each child.
        for (var i = 0, len = viewChildren.length; i < len; i++) {
            var area = viewChildren[i].getValue() / info.sum * totalArea;
            // Do not use setLayout({...}, true), because it is needed to clear last layout.
            viewChildren[i].setLayout({area: area});
        }
 
        if (overLeafDepth) {
            viewChildren.length && node.setLayout({isLeafRoot: true}, true);
            viewChildren.length = 0;
        }
 
        node.viewChildren = viewChildren;
        node.setLayout({dataExtent: info.dataExtent}, true);
 
        return viewChildren;
    }
 
    /**
     * Consider 'visibleMin'. Modify viewChildren and get new sum.
     */
    function filterByThreshold(nodeModel, totalArea, sum, orderBy, orderedChildren) {
 
        // visibleMin is not supported yet when no option.sort.
        if (!orderBy) {
            return sum;
        }
 
        var visibleMin = nodeModel.get('visibleMin');
        var len = orderedChildren.length;
        var deletePoint = len;
 
        // Always travel from little value to big value.
        for (var i = len - 1; i >= 0; i--) {
            var value = orderedChildren[
                orderBy === 'asc' ? len - i - 1 : i
            ].getValue();
 
            if (value / sum * totalArea < visibleMin) {
                deletePoint = i;
                sum -= value;
            }
        }
 
        orderBy === 'asc'
            ? orderedChildren.splice(0, len - deletePoint)
            : orderedChildren.splice(deletePoint, len - deletePoint);
 
        return sum;
    }
 
    /**
     * Sort
     */
    function sort(viewChildren, orderBy) {
        if (orderBy) {
            viewChildren.sort(function (a, b) {
                var diff = orderBy === 'asc'
                    ?  a.getValue() - b.getValue() : b.getValue() - a.getValue();
                return diff === 0
                    ? (orderBy === 'asc'
                        ? a.dataIndex - b.dataIndex : b.dataIndex - a.dataIndex
                    )
                    : diff;
            });
        }
        return viewChildren;
    }
 
    /**
     * Statistic
     */
    function statistic(nodeModel, children, orderBy) {
        // Calculate sum.
        var sum = 0;
        for (var i = 0, len = children.length; i < len; i++) {
            sum += children[i].getValue();
        }
 
        // Statistic data extent for latter visual coding.
        // Notice: data extent should be calculate based on raw children
        // but not filtered view children, otherwise visual mapping will not
        // be stable when zoom (where children is filtered by visibleMin).
 
        var dimension = nodeModel.get('visualDimension');
        var dataExtent;
 
        // The same as area dimension.
        if (!children || !children.length) {
            dataExtent = [NaN, NaN];
        }
        else if (dimension === 'value' && orderBy) {
            dataExtent = [
                children[children.length - 1].getValue(),
                children[0].getValue()
            ];
            orderBy === 'asc' && dataExtent.reverse();
        }
        // Other dimension.
        else {
            var dataExtent = [Infinity, -Infinity];
            each(children, function (child) {
                var value = child.getValue(dimension);
                value < dataExtent[0] && (dataExtent[0] = value);
                value > dataExtent[1] && (dataExtent[1] = value);
            });
        }
 
        return {sum: sum, dataExtent: dataExtent};
    }
 
    /**
     * Computes the score for the specified row,
     * as the worst aspect ratio.
     */
    function worst(row, rowFixedLength, ratio) {
        var areaMax = 0;
        var areaMin = Infinity;
 
        for (var i = 0, area, len = row.length; i < len; i++) {
            area = row[i].getLayout().area;
            if (area) {
                area < areaMin && (areaMin = area);
                area > areaMax && (areaMax = area);
            }
        }
 
        var squareArea = row.area * row.area;
        var f = rowFixedLength * rowFixedLength * ratio;
 
        return squareArea
            ? mathMax(
                (f * areaMax) / squareArea,
                squareArea / (f * areaMin)
            )
            : Infinity;
    }
 
    /**
     * Positions the specified row of nodes. Modifies `rect`.
     */
    function position(row, rowFixedLength, rect, halfGapWidth, flush) {
        // When rowFixedLength === rect.width,
        // it is horizontal subdivision,
        // rowFixedLength is the width of the subdivision,
        // rowOtherLength is the height of the subdivision,
        // and nodes will be positioned from left to right.
 
        // wh[idx0WhenH] means: when horizontal,
        //      wh[idx0WhenH] => wh[0] => 'width'.
        //      xy[idx1WhenH] => xy[1] => 'y'.
        var idx0WhenH = rowFixedLength === rect.width ? 0 : 1;
        var idx1WhenH = 1 - idx0WhenH;
        var xy = ['x', 'y'];
        var wh = ['width', 'height'];
 
        var last = rect[xy[idx0WhenH]];
        var rowOtherLength = rowFixedLength
            ? row.area / rowFixedLength : 0;
 
        if (flush || rowOtherLength > rect[wh[idx1WhenH]]) {
            rowOtherLength = rect[wh[idx1WhenH]]; // over+underflow
        }
        for (var i = 0, rowLen = row.length; i < rowLen; i++) {
            var node = row[i];
            var nodeLayout = {};
            var step = rowOtherLength
                ? node.getLayout().area / rowOtherLength : 0;
 
            var wh1 = nodeLayout[wh[idx1WhenH]] = mathMax(rowOtherLength - 2 * halfGapWidth, 0);
 
            // We use Math.max/min to avoid negative width/height when considering gap width.
            var remain = rect[xy[idx0WhenH]] + rect[wh[idx0WhenH]] - last;
            var modWH = (i === rowLen - 1 || remain < step) ? remain : step;
            var wh0 = nodeLayout[wh[idx0WhenH]] = mathMax(modWH - 2 * halfGapWidth, 0);
 
            nodeLayout[xy[idx1WhenH]] = rect[xy[idx1WhenH]] + mathMin(halfGapWidth, wh1 / 2);
            nodeLayout[xy[idx0WhenH]] = last + mathMin(halfGapWidth, wh0 / 2);
 
            last += modWH;
            node.setLayout(nodeLayout, true);
        }
 
        rect[xy[idx1WhenH]] += rowOtherLength;
        rect[wh[idx1WhenH]] -= rowOtherLength;
    }
 
    // Return [containerWidth, containerHeight] as defualt.
    function estimateRootSize(seriesModel, targetInfo, viewRoot, containerWidth, containerHeight) {
        // If targetInfo.node exists, we zoom to the node,
        // so estimate whold width and heigth by target node.
        var currNode = (targetInfo || {}).node;
        var defaultSize = [containerWidth, containerHeight];
 
        if (!currNode || currNode === viewRoot) {
            return defaultSize;
        }
 
        var parent;
        var viewArea = containerWidth * containerHeight;
        var area = viewArea * seriesModel.option.zoomToNodeRatio;
 
        while (parent = currNode.parentNode) { // jshint ignore:line
            var sum = 0;
            var siblings = parent.children;
 
            for (var i = 0, len = siblings.length; i < len; i++) {
                sum += siblings[i].getValue();
            }
            var currNodeValue = currNode.getValue();
            if (currNodeValue === 0) {
                return defaultSize;
            }
            area *= sum / currNodeValue;
 
            var borderWidth = parent.getModel('itemStyle.normal').get('borderWidth');
 
            if (isFinite(borderWidth)) {
                // Considering border, suppose aspect ratio is 1.
                area += 4 * borderWidth * borderWidth + 4 * borderWidth * Math.pow(area, 0.5);
            }
 
            area > numberUtil.MAX_SAFE_INTEGER && (area = numberUtil.MAX_SAFE_INTEGER);
 
            currNode = parent;
        }
 
        area < viewArea && (area = viewArea);
        var scale = Math.pow(area / viewArea, 0.5);
 
        return [containerWidth * scale, containerHeight * scale];
    }
 
    // Root postion base on coord of containerGroup
    function calculateRootPosition(layoutInfo, rootRect, targetInfo) {
        if (rootRect) {
            return {x: rootRect.x, y: rootRect.y};
        }
 
        var defaultPosition = {x: 0, y: 0};
        if (!targetInfo) {
            return defaultPosition;
        }
 
        // If targetInfo is fetched by 'retrieveTargetInfo',
        // old tree and new tree are the same tree,
        // so the node still exists and we can visit it.
 
        var targetNode = targetInfo.node;
        var layout = targetNode.getLayout();
 
        if (!layout) {
            return defaultPosition;
        }
 
        // Transform coord from local to container.
        var targetCenter = [layout.width / 2, layout.height / 2];
        var node = targetNode;
        while (node) {
            var nodeLayout = node.getLayout();
            targetCenter[0] += nodeLayout.x;
            targetCenter[1] += nodeLayout.y;
            node = node.parentNode;
        }
 
        return {
            x: layoutInfo.width / 2 - targetCenter[0],
            y: layoutInfo.height / 2 - targetCenter[1]
        };
    }
 
    // Mark nodes visible for prunning when visual coding and rendering.
    // Prunning depends on layout and root position, so we have to do it after layout.
    function prunning(node, clipRect, viewAbovePath, viewRoot, depth) {
        var nodeLayout = node.getLayout();
        var nodeInViewAbovePath = viewAbovePath[depth];
        var isAboveViewRoot = nodeInViewAbovePath && nodeInViewAbovePath === node;
 
        if (
            (nodeInViewAbovePath && !isAboveViewRoot)
            || (depth === viewAbovePath.length && node !== viewRoot)
        ) {
            return;
        }
 
        node.setLayout({
            // isInView means: viewRoot sub tree + viewAbovePath
            isInView: true,
            // invisible only means: outside view clip so that the node can not
            // see but still layout for animation preparation but not render.
            invisible: !isAboveViewRoot && !clipRect.intersect(nodeLayout),
            isAboveViewRoot: isAboveViewRoot
        }, true);
 
        // Transform to child coordinate.
        var childClipRect = new BoundingRect(
            clipRect.x - nodeLayout.x,
            clipRect.y - nodeLayout.y,
            clipRect.width,
            clipRect.height
        );
 
        each(node.viewChildren || [], function (child) {
            prunning(child, childClipRect, viewAbovePath, viewRoot, depth + 1);
        });
    }
 
    module.exports = update;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/treemap/treemapVisual.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/chart/treemap/treemapVisual.js

Statements: 14.58% (14 / 96)      Branches: 0% (0 / 74)      Functions: 0% (0 / 13)      Lines: 14.58% (14 / 96)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228    1 1 1 1   1   1                                                       1                                                                                                                   1                                   1                                 1           1             1                                                                                                                 1             1                                        
 
 
    var VisualMapping = require('../../visual/VisualMapping');
    var zrColor = require('zrender/lib/tool/color');
    var zrUtil = require('zrender/lib/core/util');
    var isArray = zrUtil.isArray;
 
    var ITEM_STYLE_NORMAL = 'itemStyle.normal';
 
    module.exports = function (ecModel, api, payload) {
 
        var condition = {mainType: 'series', subType: 'treemap', query: payload};
        ecModel.eachComponent(condition, function (seriesModel) {
 
            var tree = seriesModel.getData().tree;
            var root = tree.root;
            var seriesItemStyleModel = seriesModel.getModel(ITEM_STYLE_NORMAL);
 
            if (root.isRemoved()) {
                return;
            }
 
            var levelItemStyles = zrUtil.map(tree.levelModels, function (levelModel) {
                return levelModel ? levelModel.get(ITEM_STYLE_NORMAL) : null;
            });
 
            travelTree(
                root, // Visual should calculate from tree root but not view root.
                {},
                levelItemStyles,
                seriesItemStyleModel,
                seriesModel.getViewRoot().getAncestors(),
                seriesModel
            );
        });
    };
 
    function travelTree(
        node, designatedVisual, levelItemStyles, seriesItemStyleModel,
        viewRootAncestors, seriesModel
    ) {
        var nodeModel = node.getModel();
        var nodeLayout = node.getLayout();
 
        // Optimize
        if (!nodeLayout || nodeLayout.invisible || !nodeLayout.isInView) {
            return;
        }
 
        var nodeItemStyleModel = node.getModel(ITEM_STYLE_NORMAL);
        var levelItemStyle = levelItemStyles[node.depth];
        var visuals = buildVisuals(
            nodeItemStyleModel, designatedVisual, levelItemStyle, seriesItemStyleModel
        );
 
        // calculate border color
        var borderColor = nodeItemStyleModel.get('borderColor');
        var borderColorSaturation = nodeItemStyleModel.get('borderColorSaturation');
        var thisNodeColor;
        if (borderColorSaturation != null) {
            // For performance, do not always execute 'calculateColor'.
            thisNodeColor = calculateColor(visuals, node);
            borderColor = calculateBorderColor(borderColorSaturation, thisNodeColor);
        }
        node.setVisual('borderColor', borderColor);
 
        var viewChildren = node.viewChildren;
        if (!viewChildren || !viewChildren.length) {
            thisNodeColor = calculateColor(visuals, node);
            // Apply visual to this node.
            node.setVisual('color', thisNodeColor);
        }
        else {
            var mapping = buildVisualMapping(
                node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren
            );
 
            // Designate visual to children.
            zrUtil.each(viewChildren, function (child, index) {
                // If higher than viewRoot, only ancestors of viewRoot is needed to visit.
                if (child.depth >= viewRootAncestors.length
                    || child === viewRootAncestors[child.depth]
                ) {
                    var childVisual = mapVisual(
                        nodeModel, visuals, child, index, mapping, seriesModel
                    );
                    travelTree(
                        child, childVisual, levelItemStyles, seriesItemStyleModel,
                        viewRootAncestors, seriesModel
                    );
                }
            });
        }
    }
 
    function buildVisuals(
        nodeItemStyleModel, designatedVisual, levelItemStyle, seriesItemStyleModel
    ) {
        var visuals = zrUtil.extend({}, designatedVisual);
 
        zrUtil.each(['color', 'colorAlpha', 'colorSaturation'], function (visualName) {
            // Priority: thisNode > thisLevel > parentNodeDesignated > seriesModel
            var val = nodeItemStyleModel.get(visualName, true); // Ignore parent
            val == null && levelItemStyle && (val = levelItemStyle[visualName]);
            val == null && (val = designatedVisual[visualName]);
            val == null && (val = seriesItemStyleModel.get(visualName));
 
            val != null && (visuals[visualName] = val);
        });
 
        return visuals;
    }
 
    function calculateColor(visuals) {
        var color = getValueVisualDefine(visuals, 'color');
 
        if (color) {
            var colorAlpha = getValueVisualDefine(visuals, 'colorAlpha');
            var colorSaturation = getValueVisualDefine(visuals, 'colorSaturation');
            if (colorSaturation) {
                color = zrColor.modifyHSL(color, null, null, colorSaturation);
            }
            if (colorAlpha) {
                color = zrColor.modifyAlpha(color, colorAlpha);
            }
 
            return color;
        }
    }
 
    function calculateBorderColor(borderColorSaturation, thisNodeColor) {
        return thisNodeColor != null
             ? zrColor.modifyHSL(thisNodeColor, null, null, borderColorSaturation)
             : null;
    }
 
    function getValueVisualDefine(visuals, name) {
        var value = visuals[name];
        if (value != null && value !== 'none') {
            return value;
        }
    }
 
    function buildVisualMapping(
        node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren
    ) {
        if (!viewChildren || !viewChildren.length) {
            return;
        }
 
        var rangeVisual = getRangeVisual(nodeModel, 'color')
            || (
                visuals.color != null
                && visuals.color !== 'none'
                && (
                    getRangeVisual(nodeModel, 'colorAlpha')
                    || getRangeVisual(nodeModel, 'colorSaturation')
                )
            );
 
        if (!rangeVisual) {
            return;
        }
 
        var visualMin = nodeModel.get('visualMin');
        var visualMax = nodeModel.get('visualMax');
        var dataExtent = nodeLayout.dataExtent.slice();
        visualMin != null && visualMin < dataExtent[0] && (dataExtent[0] = visualMin);
        visualMax != null && visualMax > dataExtent[1] && (dataExtent[1] = visualMax);
 
        var colorMappingBy = nodeModel.get('colorMappingBy');
        var opt = {
            type: rangeVisual.name,
            dataExtent: dataExtent,
            visual: rangeVisual.range
        };
        if (opt.type === 'color'
            && (colorMappingBy === 'index' || colorMappingBy === 'id')
        ) {
            opt.mappingMethod = 'category';
            opt.loop = true;
            // categories is ordinal, so do not set opt.categories.
        }
        else {
            opt.mappingMethod = 'linear';
        }
 
        var mapping = new VisualMapping(opt);
        mapping.__drColorMappingBy = colorMappingBy;
 
        return mapping;
    }
 
    // Notice: If we dont have the attribute 'colorRange', but only use
    // attribute 'color' to represent both concepts of 'colorRange' and 'color',
    // (It means 'colorRange' when 'color' is Array, means 'color' when not array),
    // this problem will be encountered:
    // If a level-1 node dont have children, and its siblings has children,
    // and colorRange is set on level-1, then the node can not be colored.
    // So we separate 'colorRange' and 'color' to different attributes.
    function getRangeVisual(nodeModel, name) {
        // 'colorRange', 'colorARange', 'colorSRange'.
        // If not exsits on this node, fetch from levels and series.
        var range = nodeModel.get(name);
        return (isArray(range) && range.length) ? {name: name, range: range} : null;
    }
 
    function mapVisual(nodeModel, visuals, child, index, mapping, seriesModel) {
        var childVisuals = zrUtil.extend({}, visuals);
 
        if (mapping) {
            var mappingType = mapping.type;
            var colorMappingBy = mappingType === 'color' && mapping.__drColorMappingBy;
            var value =
                colorMappingBy === 'index'
                ? index
                : colorMappingBy === 'id'
                ? seriesModel.mapIdToIndex(child.getId())
                : child.getValue(nodeModel.get('visualDimension'));
 
            childVisuals[mappingType] = mapping.mapValueToVisual(value);
        }
 
        return childVisuals;
    }
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/

Statements: 39.17% (170 / 434)      Branches: 0% (0 / 193)      Functions: 1.92% (1 / 52)      Lines: 39.17% (170 / 434)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/component/
File Statements Branches Functions Lines
angleAxis.js 100% (2 / 2) 100% (0 / 0) 100% (0 / 0) 100% (2 / 2)
axis.js 100% (2 / 2) 100% (0 / 0) 100% (0 / 0) 100% (2 / 2)
axisPointer.js 55.56% (10 / 18) 0% (0 / 11) 0% (0 / 3) 55.56% (10 / 18)
brush.js 100% (6 / 6) 100% (0 / 0) 100% (0 / 0) 100% (6 / 6)
calendar.js 100% (3 / 3) 100% (0 / 0) 100% (0 / 0) 100% (3 / 3)
dataZoom.js 100% (9 / 9) 100% (0 / 0) 100% (0 / 0) 100% (9 / 9)
dataZoomInside.js 100% (7 / 7) 100% (0 / 0) 100% (0 / 0) 100% (7 / 7)
dataZoomSelect.js 100% (7 / 7) 100% (0 / 0) 100% (0 / 0) 100% (7 / 7)
geo.js 63.16% (12 / 19) 0% (0 / 2) 25% (1 / 4) 63.16% (12 / 19)
graphic.js 8.98% (15 / 167) 0% (0 / 111) 0% (0 / 25) 8.98% (15 / 167)
grid.js 100% (3 / 3) 100% (0 / 0) 100% (0 / 0) 100% (3 / 3)
gridSimple.js 58.33% (7 / 12) 0% (0 / 7) 0% (0 / 2) 58.33% (7 / 12)
legend.js 100% (5 / 5) 100% (0 / 0) 100% (0 / 0) 100% (5 / 5)
markArea.js 75% (3 / 4) 0% (0 / 2) 0% (0 / 1) 75% (3 / 4)
markLine.js 75% (3 / 4) 0% (0 / 2) 0% (0 / 1) 75% (3 / 4)
markPoint.js 75% (3 / 4) 0% (0 / 2) 0% (0 / 1) 75% (3 / 4)
parallel.js 25.58% (11 / 43) 0% (0 / 26) 0% (0 / 10) 25.58% (11 / 43)
parallelAxis.js 100% (3 / 3) 100% (0 / 0) 100% (0 / 0) 100% (3 / 3)
polar.js 100% (6 / 6) 100% (0 / 0) 100% (0 / 0) 100% (6 / 6)
radar.js 100% (3 / 3) 100% (0 / 0) 100% (0 / 0) 100% (3 / 3)
radiusAxis.js 100% (2 / 2) 100% (0 / 0) 100% (0 / 0) 100% (2 / 2)
single.js 100% (4 / 4) 100% (0 / 0) 100% (0 / 0) 100% (4 / 4)
singleAxis.js 100% (7 / 7) 100% (0 / 0) 100% (0 / 0) 100% (7 / 7)
timeline.js 100% (6 / 6) 100% (0 / 0) 100% (0 / 0) 100% (6 / 6)
title.js 8.06% (5 / 62) 0% (0 / 30) 0% (0 / 3) 8.06% (5 / 62)
toolbox.js 100% (7 / 7) 100% (0 / 0) 100% (0 / 0) 100% (7 / 7)
tooltip.js 100% (5 / 5) 100% (0 / 0) 0% (0 / 2) 100% (5 / 5)
visualMap.js 100% (2 / 2) 100% (0 / 0) 100% (0 / 0) 100% (2 / 2)
visualMapContinuous.js 100% (6 / 6) 100% (0 / 0) 100% (0 / 0) 100% (6 / 6)
visualMapPiecewise.js 100% (6 / 6) 100% (0 / 0) 100% (0 / 0) 100% (6 / 6)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/angleAxis.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/angleAxis.js

Statements: 100% (2 / 2)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (2 / 2)      Ignored: none     

1 2 3 4 5 6 7 8      1   1    
'use strict';
 
 
    require('../coord/polar/polarCreator');
 
    require('./axis/AngleAxisView');
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis.js

Statements: 100% (2 / 2)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (2 / 2)      Ignored: none     

1 2 3 4 5 6 7 8 9        1   1    
'use strict';
// TODO boundaryGap
 
 
    require('../coord/cartesian/AxisModel');
 
    require('./axis/CartesianAxisView');
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer.js

Statements: 55.56% (10 / 18)      Branches: 0% (0 / 11)      Functions: 0% (0 / 3)      Lines: 55.56% (10 / 18)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63    1 1 1 1   1 1         1   1                                   1               1                                          
 
 
    var echarts = require('../echarts');
    var axisPointerModelHelper = require('./axisPointer/modelHelper');
    var axisTrigger = require('./axisPointer/axisTrigger');
    var zrUtil = require('zrender/lib/core/util');
 
    require('./axisPointer/AxisPointerModel');
    require('./axisPointer/AxisPointerView');
 
    // CartesianAxisPointer is not supposed to be required here. But consider
    // echarts.simple.js and online build tooltip, which only require gridSimple,
    // CartesianAxisPointer should be able to required somewhere.
    require('./axisPointer/CartesianAxisPointer');
 
    echarts.registerPreprocessor(function (option) {
        // Always has a global axisPointerModel for default setting.
        if (option) {
            (!option.axisPointer || option.axisPointer.length === 0)
                && (option.axisPointer = {});
 
            var link = option.axisPointer.link;
            // Normalize to array to avoid object mergin. But if link
            // is not set, remain null/undefined, otherwise it will
            // override existent link setting.
            if (link && !zrUtil.isArray(link)) {
                option.axisPointer.link = [link];
            }
        }
    });
 
    // This process should proformed after coordinate systems created
    // and series data processed. So put it on statistic processing stage.
    echarts.registerProcessor(echarts.PRIORITY.PROCESSOR.STATISTIC, function (ecModel, api) {
        // Build axisPointerModel, mergin tooltip.axisPointer model for each axis.
        // allAxesInfo should be updated when setOption performed.
        ecModel.getComponent('axisPointer').coordSysAxesInfo
            = axisPointerModelHelper.collect(ecModel, api);
    });
 
    // Broadcast to all views.
    echarts.registerAction({
        type: 'updateAxisPointer',
        event: 'updateAxisPointer',
        update: ':updateAxisPointer'
    }, function (payload, ecModel, api) {
        var outputFinder = axisTrigger(
            ecModel.getComponent('axisPointer').coordSysAxesInfo,
            payload.currTrigger,
            [payload.x, payload.y],
            payload,
            payload.dispatchAction || zrUtil.bind(api.dispatchAction, api),
            ecModel,
            api,
            payload.tooltipOption,
            payload.highDownKey
        );
 
        return outputFinder;
    });
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/brush.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/brush.js

Statements: 100% (6 / 6)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (6 / 6)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18          1       1 1 1 1   1      
/**
 * Brush component entry
 */
 
 
    require('../echarts').registerPreprocessor(
        require('./brush/preprocessor')
    );
 
    require('./brush/visualEncoding');
    require('./brush/BrushModel');
    require('./brush/BrushView');
    require('./brush/brushAction');
 
    require('./toolbox/feature/Brush');
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/calendar.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/calendar.js

Statements: 100% (3 / 3)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (3 / 3)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15                1 1 1        
'use strict';
/**
 * @file calendar.js
 * @author dxh
 */
 
 
 
    require('../coord/calendar/Calendar');
    require('../coord/calendar/CalendarModel');
    require('./calendar/CalendarView');
 
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom.js

Statements: 100% (9 / 9)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (9 / 9)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21          1   1 1   1 1   1 1   1 1      
/**
 * DataZoom component entry
 */
 
 
    require('./dataZoom/typeDefaulter');
 
    require('./dataZoom/DataZoomModel');
    require('./dataZoom/DataZoomView');
 
    require('./dataZoom/SliderZoomModel');
    require('./dataZoom/SliderZoomView');
 
    require('./dataZoom/InsideZoomModel');
    require('./dataZoom/InsideZoomView');
 
    require('./dataZoom/dataZoomProcessor');
    require('./dataZoom/dataZoomAction');
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoomInside.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoomInside.js

Statements: 100% (7 / 7)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (7 / 7)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18          1   1 1   1 1   1 1      
/**
 * DataZoom component entry
 */
 
 
    require('./dataZoom/typeDefaulter');
 
    require('./dataZoom/DataZoomModel');
    require('./dataZoom/DataZoomView');
 
    require('./dataZoom/InsideZoomModel');
    require('./dataZoom/InsideZoomView');
 
    require('./dataZoom/dataZoomProcessor');
    require('./dataZoom/dataZoomAction');
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoomSelect.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoomSelect.js

Statements: 100% (7 / 7)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (7 / 7)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18          1   1 1   1 1   1 1      
/**
 * DataZoom component entry
 */
 
 
    require('./dataZoom/typeDefaulter');
 
    require('./dataZoom/DataZoomModel');
    require('./dataZoom/DataZoomView');
 
    require('./dataZoom/SelectZoomModel');
    require('./dataZoom/SelectZoomView');
 
    require('./dataZoom/dataZoomProcessor');
    require('./dataZoom/dataZoomAction');
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/geo.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/geo.js

Statements: 63.16% (12 / 19)      Branches: 0% (0 / 2)      Functions: 25% (1 / 4)      Lines: 63.16% (12 / 19)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50    1   1   1   1   1 1   1 3 3                                         1       1       1          
 
 
    require('../coord/geo/GeoModel');
 
    require('../coord/geo/geoCreator');
 
    require('./geo/GeoView');
 
    require('../action/geoRoam');
 
    var echarts = require('../echarts');
    var zrUtil = require('zrender/lib/core/util');
 
    function makeAction(method, actionInfo) {
        actionInfo.update = 'updateView';
        echarts.registerAction(actionInfo, function (payload, ecModel) {
            var selected = {};
 
            ecModel.eachComponent(
                { mainType: 'geo', query: payload},
                function (geoModel) {
                    geoModel[method](payload.name);
                    var geo = geoModel.coordinateSystem;
                    zrUtil.each(geo.regions, function (region) {
                        selected[region.name] = geoModel.isSelected(region.name) || false;
                    });
                }
            );
 
            return {
                selected: selected,
                name: payload.name
            };
        });
    }
 
    makeAction('toggleSelected', {
        type: 'geoToggleSelect',
        event: 'geoselectchanged'
    });
    makeAction('select', {
        type: 'geoSelect',
        event: 'geoselected'
    });
    makeAction('unSelect', {
        type: 'geoUnSelect',
        event: 'geounselected'
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/graphic.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/graphic.js

Statements: 8.98% (15 / 167)      Branches: 0% (0 / 111)      Functions: 0% (0 / 25)      Lines: 8.98% (15 / 167)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503    1 1 1 1 1           1                                                       1                                                                                                                                                                                                                                                                                                                                         1                                                                                                                                                                                                                                                                                                                                                 1                                     1                       1                     1               1                                           1                                                                           1                                    
 
 
    var echarts = require('../echarts');
    var zrUtil = require('zrender/lib/core/util');
    var modelUtil = require('../util/model');
    var graphicUtil = require('../util/graphic');
    var layoutUtil = require('../util/layout');
 
    // -------------
    // Preprocessor
    // -------------
 
    echarts.registerPreprocessor(function (option) {
        var graphicOption = option.graphic;
 
        // Convert
        // {graphic: [{left: 10, type: 'circle'}, ...]}
        // or
        // {graphic: {left: 10, type: 'circle'}}
        // to
        // {graphic: [{elements: [{left: 10, type: 'circle'}, ...]}]}
        if (zrUtil.isArray(graphicOption)) {
            if (!graphicOption[0] || !graphicOption[0].elements) {
                option.graphic = [{elements: graphicOption}];
            }
            else {
                // Only one graphic instance can be instantiated. (We dont
                // want that too many views are created in echarts._viewMap)
                option.graphic = [option.graphic[0]];
            }
        }
        else if (graphicOption && !graphicOption.elements) {
            option.graphic = [{elements: [graphicOption]}];
        }
    });
 
    // ------
    // Model
    // ------
 
    var GraphicModel = echarts.extendComponentModel({
 
        type: 'graphic',
 
        defaultOption: {
 
            // Extra properties for each elements:
            //
            // left/right/top/bottom: (like 12, '22%', 'center', default undefined)
            //      If left/rigth is set, shape.x/shape.cx/position will not be used.
            //      If top/bottom is set, shape.y/shape.cy/position will not be used.
            //      This mechanism is useful when you want to position a group/element
            //      against the right side or the center of this container.
            //
            // width/height: (can only be pixel value, default 0)
            //      Only be used to specify contianer(group) size, if needed. And
            //      can not be percentage value (like '33%'). See the reason in the
            //      layout algorithm below.
            //
            // bounding: (enum: 'all' (default) | 'raw')
            //      Specify how to calculate boundingRect when locating.
            //      'all': Get uioned and transformed boundingRect
            //          from both itself and its descendants.
            //          This mode simplies confining a group of elements in the bounding
            //          of their ancester container (e.g., using 'right: 0').
            //      'raw': Only use the boundingRect of itself and before transformed.
            //          This mode is similar to css behavior, which is useful when you
            //          want an element to be able to overflow its container. (Consider
            //          a rotated circle needs to be located in a corner.)
 
            // Note: elements is always behind its ancestors in this elements array.
            elements: [],
            parentId: null
        },
 
        /**
         * Save el options for the sake of the performance (only update modified graphics).
         * The order is the same as those in option. (ancesters -> descendants)
         *
         * @private
         * @type {Array.<Object>}
         */
        _elOptionsToUpdate: null,
 
        /**
         * @override
         */
        mergeOption: function (option) {
            // Prevent default merge to elements
            var elements = this.option.elements;
            this.option.elements = null;
 
            GraphicModel.superApply(this, 'mergeOption', arguments);
 
            this.option.elements = elements;
        },
 
        /**
         * @override
         */
        optionUpdated: function (newOption, isInit) {
            var thisOption = this.option;
            var newList = (isInit ? thisOption : newOption).elements;
            var existList = thisOption.elements = isInit ? [] : thisOption.elements;
 
            var flattenedList = [];
            this._flatten(newList, flattenedList);
 
            var mappingResult = modelUtil.mappingToExists(existList, flattenedList);
            modelUtil.makeIdAndName(mappingResult);
 
            // Clear elOptionsToUpdate
            var elOptionsToUpdate = this._elOptionsToUpdate = [];
 
            zrUtil.each(mappingResult, function (resultItem, index) {
                var newElOption = resultItem.option;
 
                if (__DEV__) {
                    zrUtil.assert(
                        zrUtil.isObject(newElOption) || resultItem.exist,
                        'Empty graphic option definition'
                    );
                }
 
                if (!newElOption) {
                    return;
                }
 
                elOptionsToUpdate.push(newElOption);
 
                setKeyInfoToNewElOption(resultItem, newElOption);
 
                mergeNewElOptionToExist(existList, index, newElOption);
 
                setLayoutInfoToExist(existList[index], newElOption);
 
            }, this);
 
            // Clean
            for (var i = existList.length - 1; i >= 0; i--) {
                if (existList[i] == null) {
                    existList.splice(i, 1);
                }
                else {
                    // $action should be volatile, otherwise option gotten from
                    // `getOption` will contain unexpected $action.
                    delete existList[i].$action;
                }
            }
        },
 
        /**
         * Convert
         * [{
         *  type: 'group',
         *  id: 'xx',
         *  children: [{type: 'circle'}, {type: 'polygon'}]
         * }]
         * to
         * [
         *  {type: 'group', id: 'xx'},
         *  {type: 'circle', parentId: 'xx'},
         *  {type: 'polygon', parentId: 'xx'}
         * ]
         *
         * @private
         * @param {Array.<Object>} optionList option list
         * @param {Array.<Object>} result result of flatten
         * @param {Object} parentOption parent option
         */
        _flatten: function (optionList, result, parentOption) {
            zrUtil.each(optionList, function (option) {
                if (!option) {
                    return;
                }
 
                if (parentOption) {
                    option.parentOption = parentOption;
                }
 
                result.push(option);
 
                var children = option.children;
                if (option.type === 'group' && children) {
                    this._flatten(children, result, option);
                }
                // Deleting for JSON output, and for not affecting group creation.
                delete option.children;
            }, this);
        },
 
        // FIXME
        // Pass to view using payload? setOption has a payload?
        useElOptionsToUpdate: function () {
            var els = this._elOptionsToUpdate;
            // Clear to avoid render duplicately when zooming.
            this._elOptionsToUpdate = null;
            return els;
        }
    });
 
    // -----
    // View
    // -----
 
    echarts.extendComponentView({
 
        type: 'graphic',
 
        /**
         * @override
         */
        init: function (ecModel, api) {
 
            /**
             * @private
             * @type {Object}
             */
            this._elMap = {};
 
            /**
             * @private
             * @type {module:echarts/graphic/GraphicModel}
             */
            this._lastGraphicModel;
        },
 
        /**
         * @override
         */
        render: function (graphicModel, ecModel, api) {
 
            // Having leveraged between use cases and algorithm complexity, a very
            // simple layout mechanism is used:
            // The size(width/height) can be determined by itself or its parent (not
            // implemented yet), but can not by its children. (Top-down travel)
            // The location(x/y) can be determined by the bounding rect of itself
            // (can including its descendants or not) and the size of its parent.
            // (Bottom-up travel)
 
            // When `chart.clear()` or `chart.setOption({...}, true)` with the same id,
            // view will be reused.
            if (graphicModel !== this._lastGraphicModel) {
                this._clear();
            }
            this._lastGraphicModel = graphicModel;
 
            this._updateElements(graphicModel, api);
            this._relocate(graphicModel, api);
        },
 
        /**
         * Update graphic elements.
         *
         * @private
         * @param {Object} graphicModel graphic model
         * @param {module:echarts/ExtensionAPI} api extension API
         */
        _updateElements: function (graphicModel, api) {
            var elOptionsToUpdate = graphicModel.useElOptionsToUpdate();
 
            if (!elOptionsToUpdate) {
                return;
            }
 
            var elMap = this._elMap;
            var rootGroup = this.group;
 
            // Top-down tranverse to assign graphic settings to each elements.
            zrUtil.each(elOptionsToUpdate, function (elOption) {
                var $action = elOption.$action;
                var id = elOption.id;
                var existEl = elMap[id];
                var parentId = elOption.parentId;
                var targetElParent = parentId != null ? elMap[parentId] : rootGroup;
 
                // In top/bottom mode, textVertical should not be used. And textBaseline
                // should not be 'alphabetic', which cause inaccurately locating.
                if (elOption.hv && elOption.hv[1] && elOption.type === 'text') {
                    elOption.style = zrUtil.defaults({textBaseline: 'middle'}, elOption.style);
                    elOption.style.textVerticalAlign = null;
                }
 
                // Remove unnecessary props to avoid potential problems.
                var elOptionCleaned = getCleanedElOption(elOption);
 
                // For simple, do not support parent change, otherwise reorder is needed.
                if (__DEV__) {
                    existEl && zrUtil.assert(
                        targetElParent === existEl.parent,
                        'Changing parent is not supported.'
                    );
                }
 
                if (!$action || $action === 'merge') {
                    existEl
                        ? existEl.attr(elOptionCleaned)
                        : createEl(id, targetElParent, elOptionCleaned, elMap);
                }
                else if ($action === 'replace') {
                    removeEl(existEl, elMap);
                    createEl(id, targetElParent, elOptionCleaned, elMap);
                }
                else if ($action === 'remove') {
                    removeEl(existEl, elMap);
                }
 
                if (elMap[id]) {
                    elMap[id].__ecGraphicWidth = elOption.width;
                    elMap[id].__ecGraphicHeight = elOption.height;
                }
            });
        },
 
        /**
         * Locate graphic elements.
         *
         * @private
         * @param {Object} graphicModel graphic model
         * @param {module:echarts/ExtensionAPI} api extension API
         */
        _relocate: function (graphicModel, api) {
            var elOptions = graphicModel.option.elements;
            var rootGroup = this.group;
            var elMap = this._elMap;
 
            // Bottom-up tranvese all elements (consider ec resize) to locate elements.
            for (var i = elOptions.length - 1; i >= 0; i--) {
                var elOption = elOptions[i];
                var el = elMap[elOption.id];
 
                if (!el) {
                    continue;
                }
 
                var parentEl = el.parent;
                var containerInfo = parentEl === rootGroup
                    ? {
                        width: api.getWidth(),
                        height: api.getHeight()
                    }
                    : { // Like 'position:absolut' in css, default 0.
                        width: parentEl.__ecGraphicWidth || 0,
                        height: parentEl.__ecGraphicHeight || 0
                    };
 
                layoutUtil.positionElement(
                    el, elOption, containerInfo, null,
                    {hv: elOption.hv, boundingMode: elOption.bounding}
                );
            }
        },
 
        /**
         * Clear all elements.
         *
         * @private
         */
        _clear: function () {
            var elMap = this._elMap;
            zrUtil.each(elMap, function (el) {
                removeEl(el, elMap);
            });
            this._elMap = {};
        },
 
        /**
         * @override
         */
        dispose: function () {
            this._clear();
        }
    });
 
    function createEl(id, targetElParent, elOption, elMap) {
        var graphicType = elOption.type;
 
        if (__DEV__) {
            zrUtil.assert(graphicType, 'graphic type MUST be set');
        }
 
        var Clz = graphicUtil[graphicType.charAt(0).toUpperCase() + graphicType.slice(1)];
 
        if (__DEV__) {
            zrUtil.assert(Clz, 'graphic type can not be found');
        }
 
        var el = new Clz(elOption);
        targetElParent.add(el);
        elMap[id] = el;
        el.__ecGraphicId = id;
    }
 
    function removeEl(existEl, elMap) {
        var existElParent = existEl && existEl.parent;
        if (existElParent) {
            existEl.type === 'group' && existEl.traverse(function (el) {
                removeEl(el, elMap);
            });
            delete elMap[existEl.__ecGraphicId];
            existElParent.remove(existEl);
        }
    }
 
    // Remove unnecessary props to avoid potential problems.
    function getCleanedElOption(elOption) {
        elOption = zrUtil.extend({}, elOption);
        zrUtil.each(
            ['id', 'parentId', '$action', 'hv', 'bounding'].concat(layoutUtil.LOCATION_PARAMS),
            function (name) {
                delete elOption[name];
            }
        );
        return elOption;
    }
 
    function isSetLoc(obj, props) {
        var isSet;
        zrUtil.each(props, function (prop) {
            obj[prop] != null && obj[prop] !== 'auto' && (isSet = true);
        });
        return isSet;
    }
 
    function setKeyInfoToNewElOption(resultItem, newElOption) {
        var existElOption = resultItem.exist;
 
        // Set id and type after id assigned.
        newElOption.id = resultItem.keyInfo.id;
        !newElOption.type && existElOption && (newElOption.type = existElOption.type);
 
        // Set parent id if not specified
        if (newElOption.parentId == null) {
            var newElParentOption = newElOption.parentOption;
            if (newElParentOption) {
                newElOption.parentId = newElParentOption.id;
            }
            else if (existElOption) {
                newElOption.parentId = existElOption.parentId;
            }
        }
 
        // Clear
        newElOption.parentOption = null;
    }
 
    function mergeNewElOptionToExist(existList, index, newElOption) {
        // Update existing options, for `getOption` feature.
        var newElOptCopy = zrUtil.extend({}, newElOption);
        var existElOption = existList[index];
 
        var $action = newElOption.$action || 'merge';
        if ($action === 'merge') {
            if (existElOption) {
 
                if (__DEV__) {
                    var newType = newElOption.type;
                    zrUtil.assert(
                        !newType || existElOption.type === newType,
                        'Please set $action: "replace" to change `type`'
                    );
                }
 
                // We can ensure that newElOptCopy and existElOption are not
                // the same object, so `merge` will not change newElOptCopy.
                zrUtil.merge(existElOption, newElOptCopy, true);
                // Rigid body, use ignoreSize.
                layoutUtil.mergeLayoutParam(existElOption, newElOptCopy, {ignoreSize: true});
                // Will be used in render.
                layoutUtil.copyLayoutParams(newElOption, existElOption);
            }
            else {
                existList[index] = newElOptCopy;
            }
        }
        else if ($action === 'replace') {
            existList[index] = newElOptCopy;
        }
        else if ($action === 'remove') {
            // null will be cleaned later.
            existElOption && (existList[index] = null);
        }
    }
 
    function setLayoutInfoToExist(existItem, newElOption) {
        if (!existItem) {
            return;
        }
        existItem.hv = newElOption.hv = [
            // Rigid body, dont care `width`.
            isSetLoc(newElOption, ['left', 'right']),
            // Rigid body, dont care `height`.
            isSetLoc(newElOption, ['top', 'bottom'])
        ];
        // Give default group size. Otherwise layout error may occur.
        if (existItem.type === 'group') {
            existItem.width == null && (existItem.width = newElOption.width = 0);
            existItem.height == null && (existItem.height = newElOption.height = 0);
        }
    }
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/grid.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/grid.js

Statements: 100% (3 / 3)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (3 / 3)      Ignored: none     

1 2 3 4 5 6 7 8 9 10    1   1   1      
 
 
    require('./gridSimple');
 
    require('./axisPointer/CartesianAxisPointer');
 
    require('./axisPointer');
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/gridSimple.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/gridSimple.js

Statements: 58.33% (7 / 12)      Branches: 0% (0 / 7)      Functions: 0% (0 / 2)      Lines: 58.33% (7 / 12)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40      1 1 1   1   1     1                                       1              
'use strict';
 
 
    var graphic = require('../util/graphic');
    var zrUtil = require('zrender/lib/core/util');
    var echarts = require('../echarts');
 
    require('../coord/cartesian/Grid');
 
    require('./axis');
 
    // Grid view
    echarts.extendComponentView({
 
        type: 'grid',
 
        render: function (gridModel, ecModel) {
            this.group.removeAll();
            if (gridModel.get('show')) {
                this.group.add(new graphic.Rect({
                    shape: gridModel.coordinateSystem.getRect(),
                    style: zrUtil.defaults({
                        fill: gridModel.get('backgroundColor')
                    }, gridModel.getItemStyle()),
                    silent: true,
                    z2: -1
                }));
            }
        }
 
    });
 
    echarts.registerPreprocessor(function (option) {
        // Only create grid when need
        if (option.xAxis && option.yAxis && !option.grid) {
            option.grid = {};
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/legend.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/legend.js

Statements: 100% (5 / 5)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (5 / 5)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14          1 1 1   1   1    
/**
 * Legend component entry file8
 */
 
 
    require('./legend/LegendModel');
    require('./legend/legendAction');
    require('./legend/LegendView');
 
    var echarts = require('../echarts');
    // Series Filter
    echarts.registerProcessor(require('./legend/legendFilter'));
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/markArea.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/markArea.js

Statements: 75% (3 / 4)      Branches: 0% (0 / 2)      Functions: 0% (0 / 1)      Lines: 75% (3 / 4)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11    1 1   1          
 
 
    require('./marker/MarkAreaModel');
    require('./marker/MarkAreaView');
 
    require('../echarts').registerPreprocessor(function (opt) {
        // Make sure markArea component is enabled
        opt.markArea = opt.markArea || {};
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/markLine.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/markLine.js

Statements: 75% (3 / 4)      Branches: 0% (0 / 2)      Functions: 0% (0 / 1)      Lines: 75% (3 / 4)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11    1 1   1          
 
 
    require('./marker/MarkLineModel');
    require('./marker/MarkLineView');
 
    require('../echarts').registerPreprocessor(function (opt) {
        // Make sure markLine component is enabled
        opt.markLine = opt.markLine || {};
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/markPoint.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/markPoint.js

Statements: 75% (3 / 4)      Branches: 0% (0 / 2)      Functions: 0% (0 / 1)      Lines: 75% (3 / 4)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12      1 1   1          
// HINT Markpoint can't be used too much
 
 
    require('./marker/MarkPointModel');
    require('./marker/MarkPointView');
 
    require('../echarts').registerPreprocessor(function (opt) {
        // Make sure markPoint component is enabled
        opt.markPoint = opt.markPoint || {};
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/parallel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/parallel.js

Statements: 25.58% (11 / 43)      Branches: 0% (0 / 26)      Functions: 0% (0 / 10)      Lines: 25.58% (11 / 43)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124    1 1 1   1 1 1   1     1                                                                                       1                                                                                                               1         1          
 
 
    require('../coord/parallel/parallelCreator');
    require('../coord/parallel/ParallelModel');
    require('./parallelAxis');
 
    var echarts = require('../echarts');
    var zrUtil = require('zrender/lib/core/util');
    var throttle = require('../util/throttle');
 
    var CLICK_THRESHOLD = 5; // > 4
 
    // Parallel view
    echarts.extendComponentView({
        type: 'parallel',
 
        render: function (parallelModel, ecModel, api) {
            this._model = parallelModel;
            this._api = api;
 
            if (!this._handlers) {
                this._handlers = {};
                zrUtil.each(handlers, function (handler, eventName) {
                    api.getZr().on(eventName, this._handlers[eventName] = zrUtil.bind(handler, this));
                }, this);
            }
 
            throttle.createOrUpdate(
                this,
                '_throttledDispatchExpand',
                parallelModel.get('axisExpandRate'),
                'fixRate'
            );
        },
 
        dispose: function (ecModel, api) {
            zrUtil.each(this._handlers, function (handler, eventName) {
                api.getZr().off(eventName, handler);
            });
            this._handlers = null;
        },
 
        /**
         * @param {Object} [opt] If null, cancle the last action triggering for debounce.
         */
        _throttledDispatchExpand: function (opt) {
            this._dispatchExpand(opt);
        },
 
        _dispatchExpand: function (opt) {
            opt && this._api.dispatchAction(
                zrUtil.extend({type: 'parallelAxisExpand'}, opt)
            );
        }
 
    });
 
    var handlers = {
 
        mousedown: function (e) {
            if (checkTrigger(this, 'click')) {
                this._mouseDownPoint = [e.offsetX, e.offsetY];
            }
        },
 
        mouseup: function (e) {
            var mouseDownPoint = this._mouseDownPoint;
 
            if (checkTrigger(this, 'click') && mouseDownPoint) {
                var point = [e.offsetX, e.offsetY];
                var dist = Math.pow(mouseDownPoint[0] - point[0], 2)
                    + Math.pow(mouseDownPoint[1] - point[1], 2);
 
                if (dist > CLICK_THRESHOLD) {
                    return;
                }
 
                var result = this._model.coordinateSystem.getSlidedAxisExpandWindow(
                    [e.offsetX, e.offsetY]
                );
 
                result.behavior !== 'none' && this._dispatchExpand({
                    axisExpandWindow: result.axisExpandWindow
                });
            }
 
            this._mouseDownPoint = null;
        },
 
        mousemove: function (e) {
            // Should do nothing when brushing.
            if (this._mouseDownPoint || !checkTrigger(this, 'mousemove')) {
                return;
            }
            var model = this._model;
            var result = model.coordinateSystem.getSlidedAxisExpandWindow(
                [e.offsetX, e.offsetY]
            );
 
            var behavior = result.behavior;
            behavior === 'jump' && this._throttledDispatchExpand.debounceNextCall(model.get('axisExpandDebounce'));
            this._throttledDispatchExpand(
                behavior === 'none'
                    ? null // Cancle the last trigger, in case that mouse slide out of the area quickly.
                    : {
                        axisExpandWindow: result.axisExpandWindow,
                        // Jumping uses animation, and sliding suppresses animation.
                        animation: behavior === 'jump'  ? null : false
                    }
            );
        }
    };
 
    function checkTrigger(view, triggerOn) {
        var model = view._model;
        return model.get('axisExpandable') && model.get('axisExpandTriggerOn') === triggerOn;
    }
 
    echarts.registerPreprocessor(
        require('../coord/parallel/parallelPreprocessor')
    );
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/parallelAxis.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/parallelAxis.js

Statements: 100% (3 / 3)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (3 / 3)      Ignored: none     

1 2 3 4 5 6 7 8    1 1 1      
 
 
    require('../coord/parallel/parallelCreator');
    require('./axis/parallelAxisAction');
    require('./axis/ParallelAxisView');
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/polar.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/polar.js

Statements: 100% (6 / 6)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (6 / 6)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16      1 1 1 1   1     1        
'use strict';
 
 
    require('../coord/polar/polarCreator');
    require('./angleAxis');
    require('./radiusAxis');
    require('./axisPointer');
 
    require('./axisPointer/PolarAxisPointer');
 
    // Polar view
    require('../echarts').extendComponentView({
        type: 'polar'
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/radar.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/radar.js

Statements: 100% (3 / 3)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (3 / 3)      Ignored: none     

1 2 3 4 5 6 7 8    1 1   1    
 
 
    require('../coord/radar/Radar');
    require('../coord/radar/RadarModel');
 
    require('./radar/RadarView');
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/radiusAxis.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/radiusAxis.js

Statements: 100% (2 / 2)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (2 / 2)      Ignored: none     

1 2 3 4 5 6 7    1   1    
 
 
    require('../coord/polar/polarCreator');
 
    require('./axis/RadiusAxisView');
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/single.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/single.js

Statements: 100% (4 / 4)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (4 / 4)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13    1 1   1   1          
 
 
    require('../coord/single/singleCreator');
    require('./singleAxis');
 
    var echarts = require('../echarts');
 
    echarts.extendComponentView({
        type: 'single'
    });
    
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/singleAxis.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/singleAxis.js

Statements: 100% (7 / 7)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (7 / 7)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17    1 1 1 1   1   1   1          
 
 
    require('../coord/single/singleCreator');
    require('./axis/SingleAxisView');
    require('../coord/single/AxisModel');
    require('./axisPointer');
 
    require('./axisPointer/SingleAxisPointer');
 
    var echarts = require('../echarts');
 
    echarts.extendComponentView({
        type: 'single'
    });
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/timeline.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/timeline.js

Statements: 100% (6 / 6)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (6 / 6)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16          1   1   1 1 1 1      
/**
 * DataZoom component entry
 */
 
 
    var echarts = require('../echarts');
 
    echarts.registerPreprocessor(require('./timeline/preprocessor'));
 
    require('./timeline/typeDefaulter');
    require('./timeline/timelineAction');
    require('./timeline/SliderTimelineModel');
    require('./timeline/SliderTimelineView');
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/title.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/title.js

Statements: 8.06% (5 / 62)      Branches: 0% (0 / 30)      Functions: 0% (0 / 3)      Lines: 8.06% (5 / 62)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210      1 1 1     1                                                                                                                                       1                                                                                                                                                                                                                                                                          
'use strict';
 
 
    var echarts = require('../echarts');
    var graphic = require('../util/graphic');
    var layout = require('../util/layout');
 
    // Model
    echarts.extendComponentModel({
 
        type: 'title',
 
        layoutMode: {type: 'box', ignoreSize: true},
 
        defaultOption: {
            // 一级层叠
            zlevel: 0,
            // 二级层叠
            z: 6,
            show: true,
 
            text: '',
            // 超链接跳转
            // link: null,
            // 仅支持self | blank
            target: 'blank',
            subtext: '',
 
            // 超链接跳转
            // sublink: null,
            // 仅支持self | blank
            subtarget: 'blank',
 
            // 'center' ¦ 'left' ¦ 'right'
            // ¦ {number}(x坐标,单位px)
            left: 0,
            // 'top' ¦ 'bottom' ¦ 'center'
            // ¦ {number}(y坐标,单位px)
            top: 0,
 
            // 水平对齐
            // 'auto' | 'left' | 'right' | 'center'
            // 默认根据 left 的位置判断是左对齐还是右对齐
            // textAlign: null
            //
            // 垂直对齐
            // 'auto' | 'top' | 'bottom' | 'middle'
            // 默认根据 top 位置判断是上对齐还是下对齐
            // textBaseline: null
 
            backgroundColor: 'rgba(0,0,0,0)',
 
            // 标题边框颜色
            borderColor: '#ccc',
 
            // 标题边框线宽,单位px,默认为0(无边框)
            borderWidth: 0,
 
            // 标题内边距,单位px,默认各方向内边距为5,
            // 接受数组分别设定上右下左边距,同css
            padding: 5,
 
            // 主副标题纵向间隔,单位px,默认为10,
            itemGap: 10,
            textStyle: {
                fontSize: 18,
                fontWeight: 'bolder',
                color: '#333'
            },
            subtextStyle: {
                color: '#aaa'
            }
        }
    });
 
    // View
    echarts.extendComponentView({
 
        type: 'title',
 
        render: function (titleModel, ecModel, api) {
            this.group.removeAll();
 
            if (!titleModel.get('show')) {
                return;
            }
 
            var group = this.group;
 
            var textStyleModel = titleModel.getModel('textStyle');
            var subtextStyleModel = titleModel.getModel('subtextStyle');
 
            var textAlign = titleModel.get('textAlign');
            var textBaseline = titleModel.get('textBaseline');
 
            var textEl = new graphic.Text({
                style: {
                    text: titleModel.get('text'),
                    textFont: textStyleModel.getFont(),
                    fill: textStyleModel.getTextColor()
                },
                z2: 10
            });
 
            var textRect = textEl.getBoundingRect();
 
            var subText = titleModel.get('subtext');
            var subTextEl = new graphic.Text({
                style: {
                    text: subText,
                    textFont: subtextStyleModel.getFont(),
                    fill: subtextStyleModel.getTextColor(),
                    y: textRect.height + titleModel.get('itemGap'),
                    textBaseline: 'top'
                },
                z2: 10
            });
 
            var link = titleModel.get('link');
            var sublink = titleModel.get('sublink');
 
            textEl.silent = !link;
            subTextEl.silent = !sublink;
 
            if (link) {
                textEl.on('click', function () {
                    window.open(link, '_' + titleModel.get('target'));
                });
            }
            if (sublink) {
                subTextEl.on('click', function () {
                    window.open(sublink, '_' + titleModel.get('subtarget'));
                });
            }
 
            group.add(textEl);
            subText && group.add(subTextEl);
            // If no subText, but add subTextEl, there will be an empty line.
 
            var groupRect = group.getBoundingRect();
            var layoutOption = titleModel.getBoxLayoutParams();
            layoutOption.width = groupRect.width;
            layoutOption.height = groupRect.height;
            var layoutRect = layout.getLayoutRect(
                layoutOption, {
                    width: api.getWidth(),
                    height: api.getHeight()
                }, titleModel.get('padding')
            );
            // Adjust text align based on position
            if (!textAlign) {
                // Align left if title is on the left. center and right is same
                textAlign = titleModel.get('left') || titleModel.get('right');
                if (textAlign === 'middle') {
                    textAlign = 'center';
                }
                // Adjust layout by text align
                if (textAlign === 'right') {
                    layoutRect.x += layoutRect.width;
                }
                else if (textAlign === 'center') {
                    layoutRect.x += layoutRect.width / 2;
                }
            }
            if (!textBaseline) {
                textBaseline = titleModel.get('top') || titleModel.get('bottom');
                if (textBaseline === 'center') {
                    textBaseline = 'middle';
                }
                if (textBaseline === 'bottom') {
                    layoutRect.y += layoutRect.height;
                }
                else if (textBaseline === 'middle') {
                    layoutRect.y += layoutRect.height / 2;
                }
 
                textBaseline = textBaseline || 'top';
            }
 
            group.attr('position', [layoutRect.x, layoutRect.y]);
            var alignStyle = {
                textAlign: textAlign,
                textVerticalAlign: textBaseline
            };
            textEl.setStyle(alignStyle);
            subTextEl.setStyle(alignStyle);
 
            // Render background
            // Get groupRect again because textAlign has been changed
            groupRect = group.getBoundingRect();
            var padding = layoutRect.margin;
            var style = titleModel.getItemStyle(['color', 'opacity']);
            style.fill = titleModel.get('backgroundColor');
            var rect = new graphic.Rect({
                shape: {
                    x: groupRect.x - padding[3],
                    y: groupRect.y - padding[0],
                    width: groupRect.width + padding[1] + padding[3],
                    height: groupRect.height + padding[0] + padding[2]
                },
                style: style,
                silent: true
            });
            graphic.subPixelOptimizeRect(rect);
 
            group.add(rect);
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox.js

Statements: 100% (7 / 7)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (7 / 7)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12    1 1   1 1 1 1 1    
 
 
    require('./toolbox/ToolboxModel');
    require('./toolbox/ToolboxView');
 
    require('./toolbox/feature/SaveAsImage');
    require('./toolbox/feature/MagicType');
    require('./toolbox/feature/DataView');
    require('./toolbox/feature/DataZoom');
    require('./toolbox/feature/Restore');
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/tooltip.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/tooltip.js

Statements: 100% (5 / 5)      Branches: 100% (0 / 0)      Functions: 0% (0 / 2)      Lines: 100% (5 / 5)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40      1   1   1                       1                   1                    
// FIXME Better way to pack data in graphic element
 
 
    require('./axisPointer');
 
    require('./tooltip/TooltipModel');
 
    require('./tooltip/TooltipView');
 
 
    // Show tip action
    /**
     * @action
     * @property {string} type
     * @property {number} seriesIndex
     * @property {number} dataIndex
     * @property {number} [x]
     * @property {number} [y]
     */
    require('../echarts').registerAction(
        {
            type: 'showTip',
            event: 'showTip',
            update: 'tooltip:manuallyShowTip'
        },
        // noop
        function () {}
    );
    // Hide tip action
    require('../echarts').registerAction(
        {
            type: 'hideTip',
            event: 'hideTip',
            update: 'tooltip:manuallyHideTip'
        },
        // noop
        function () {}
    );
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap.js

Statements: 100% (2 / 2)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (2 / 2)      Ignored: none     

1 2 3 4 5 6 7 8 9 10          1 1      
/**
 * visualMap component entry
 */
 
 
    require('./visualMapContinuous');
    require('./visualMapPiecewise');
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMapContinuous.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMapContinuous.js

Statements: 100% (6 / 6)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (6 / 6)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17          1       1 1 1 1 1      
/**
 * DataZoom component entry
 */
 
 
    require('../echarts').registerPreprocessor(
        require('./visualMap/preprocessor')
    );
 
    require('./visualMap/typeDefaulter');
    require('./visualMap/visualEncoding');
    require('./visualMap/ContinuousModel');
    require('./visualMap/ContinuousView');
    require('./visualMap/visualMapAction');
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMapPiecewise.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMapPiecewise.js

Statements: 100% (6 / 6)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (6 / 6)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17          1       1 1 1 1 1      
/**
 * DataZoom component entry
 */
 
 
    require('../echarts').registerPreprocessor(
        require('./visualMap/preprocessor')
    );
 
    require('./visualMap/typeDefaulter');
    require('./visualMap/visualEncoding');
    require('./visualMap/PiecewiseModel');
    require('./visualMap/PiecewiseView');
    require('./visualMap/visualMapAction');
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/

Statements: 14.44% (94 / 651)      Branches: 0.66% (2 / 301)      Functions: 1.56% (1 / 64)      Lines: 14.44% (94 / 651)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/component/axis/
File Statements Branches Functions Lines
AngleAxisView.js 7.69% (6 / 78) 0% (0 / 34) 0% (0 / 9) 7.69% (6 / 78)
AxisBuilder.js 10.96% (24 / 219) 0% (0 / 152) 0% (0 / 18) 10.96% (24 / 219)
AxisView.js 36.67% (11 / 30) 11.11% (2 / 18) 12.5% (1 / 8) 36.67% (11 / 30)
CartesianAxisView.js 12.63% (12 / 95) 0% (0 / 20) 0% (0 / 4) 12.63% (12 / 95)
ParallelAxisView.js 19.64% (11 / 56) 0% (0 / 17) 0% (0 / 11) 19.64% (11 / 56)
RadiusAxisView.js 14% (7 / 50) 0% (0 / 14) 0% (0 / 5) 14% (7 / 50)
SingleAxisView.js 18.87% (10 / 53) 0% (0 / 12) 0% (0 / 2) 18.87% (10 / 53)
cartesianAxisHelper.js 14.71% (5 / 34) 0% (0 / 20) 0% (0 / 2) 14.71% (5 / 34)
parallelAxisAction.js 50% (4 / 8) 100% (0 / 0) 0% (0 / 4) 50% (4 / 8)
singleAxisHelper.js 14.29% (4 / 28) 0% (0 / 14) 0% (0 / 1) 14.29% (4 / 28)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/AngleAxisView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/AngleAxisView.js

Statements: 7.69% (6 / 78)      Branches: 0% (0 / 34)      Functions: 0% (0 / 9)      Lines: 7.69% (6 / 78)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234      1 1 1   1   1                       1                                                                                                                                                                                                                                                                                                                                                                                                                                        
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
    var graphic = require('../../util/graphic');
    var Model = require('../../model/Model');
 
    var elementList = ['axisLine', 'axisLabel', 'axisTick', 'splitLine', 'splitArea'];
 
    function getAxisLineShape(polar, r0, r, angle) {
        var start = polar.coordToPoint([r0, angle]);
        var end = polar.coordToPoint([r, angle]);
 
        return {
            x1: start[0],
            y1: start[1],
            x2: end[0],
            y2: end[1]
        };
    }
 
    require('./AxisView').extend({
 
        type: 'angleAxis',
 
        axisPointerClass: 'PolarAxisPointer',
 
        render: function (angleAxisModel, ecModel) {
            this.group.removeAll();
            if (!angleAxisModel.get('show')) {
                return;
            }
 
            var angleAxis = angleAxisModel.axis;
            var polar = angleAxis.polar;
            var radiusExtent = polar.getRadiusAxis().getExtent();
            var ticksAngles = angleAxis.getTicksCoords();
 
            if (angleAxis.type !== 'category') {
                // Remove the last tick which will overlap the first tick
                ticksAngles.pop();
            }
 
            zrUtil.each(elementList, function (name) {
                if (angleAxisModel.get(name +'.show')
                    && (!angleAxis.scale.isBlank() || name === 'axisLine')
                ) {
                    this['_' + name](angleAxisModel, polar, ticksAngles, radiusExtent);
                }
            }, this);
        },
 
        /**
         * @private
         */
        _axisLine: function (angleAxisModel, polar, ticksAngles, radiusExtent) {
            var lineStyleModel = angleAxisModel.getModel('axisLine.lineStyle');
 
            var circle = new graphic.Circle({
                shape: {
                    cx: polar.cx,
                    cy: polar.cy,
                    r: radiusExtent[1]
                },
                style: lineStyleModel.getLineStyle(),
                z2: 1,
                silent: true
            });
            circle.style.fill = null;
 
            this.group.add(circle);
        },
 
        /**
         * @private
         */
        _axisTick: function (angleAxisModel, polar, ticksAngles, radiusExtent) {
            var tickModel = angleAxisModel.getModel('axisTick');
 
            var tickLen = (tickModel.get('inside') ? -1 : 1) * tickModel.get('length');
 
            var lines = zrUtil.map(ticksAngles, function (tickAngle) {
                return new graphic.Line({
                    shape: getAxisLineShape(polar, radiusExtent[1], radiusExtent[1] + tickLen, tickAngle)
                });
            });
            this.group.add(graphic.mergePath(
                lines, {
                    style: zrUtil.defaults(
                        tickModel.getModel('lineStyle').getLineStyle(),
                        {
                            stroke: angleAxisModel.get('axisLine.lineStyle.color')
                        }
                    )
                }
            ));
        },
 
        /**
         * @private
         */
        _axisLabel: function (angleAxisModel, polar, ticksAngles, radiusExtent) {
            var axis = angleAxisModel.axis;
 
            var categoryData = angleAxisModel.get('data');
 
            var labelModel = angleAxisModel.getModel('axisLabel');
            var axisTextStyleModel = labelModel.getModel('textStyle');
 
            var labels = angleAxisModel.getFormattedLabels();
 
            var labelMargin = labelModel.get('margin');
            var labelsAngles = axis.getLabelsCoords();
 
            // Use length of ticksAngles because it may remove the last tick to avoid overlapping
            for (var i = 0; i < ticksAngles.length; i++) {
                var r = radiusExtent[1];
                var p = polar.coordToPoint([r + labelMargin, labelsAngles[i]]);
                var cx = polar.cx;
                var cy = polar.cy;
 
                var labelTextAlign = Math.abs(p[0] - cx) / r < 0.3
                    ? 'center' : (p[0] > cx ? 'left' : 'right');
                var labelTextBaseline = Math.abs(p[1] - cy) / r < 0.3
                    ? 'middle' : (p[1] > cy ? 'top' : 'bottom');
 
                var textStyleModel = axisTextStyleModel;
                if (categoryData && categoryData[i] && categoryData[i].textStyle) {
                    textStyleModel = new Model(
                        categoryData[i].textStyle, axisTextStyleModel
                    );
                }
                this.group.add(new graphic.Text({
                    style: {
                        x: p[0],
                        y: p[1],
                        fill: textStyleModel.getTextColor() || angleAxisModel.get('axisLine.lineStyle.color'),
                        text: labels[i],
                        textAlign: labelTextAlign,
                        textVerticalAlign: labelTextBaseline,
                        textFont: textStyleModel.getFont()
                    },
                    silent: true
                }));
            }
        },
 
        /**
         * @private
         */
        _splitLine: function (angleAxisModel, polar, ticksAngles, radiusExtent) {
            var splitLineModel = angleAxisModel.getModel('splitLine');
            var lineStyleModel = splitLineModel.getModel('lineStyle');
            var lineColors = lineStyleModel.get('color');
            var lineCount = 0;
 
            lineColors = lineColors instanceof Array ? lineColors : [lineColors];
 
            var splitLines = [];
 
            for (var i = 0; i < ticksAngles.length; i++) {
                var colorIndex = (lineCount++) % lineColors.length;
                splitLines[colorIndex] = splitLines[colorIndex] || [];
                splitLines[colorIndex].push(new graphic.Line({
                    shape: getAxisLineShape(polar, radiusExtent[0], radiusExtent[1], ticksAngles[i])
                }));
            }
 
            // Simple optimization
            // Batching the lines if color are the same
            for (var i = 0; i < splitLines.length; i++) {
                this.group.add(graphic.mergePath(splitLines[i], {
                    style: zrUtil.defaults({
                        stroke: lineColors[i % lineColors.length]
                    }, lineStyleModel.getLineStyle()),
                    silent: true,
                    z: angleAxisModel.get('z')
                }));
            }
        },
 
        /**
         * @private
         */
        _splitArea: function (angleAxisModel, polar, ticksAngles, radiusExtent) {
 
            var splitAreaModel = angleAxisModel.getModel('splitArea');
            var areaStyleModel = splitAreaModel.getModel('areaStyle');
            var areaColors = areaStyleModel.get('color');
            var lineCount = 0;
 
            areaColors = areaColors instanceof Array ? areaColors : [areaColors];
 
            var splitAreas = [];
 
            var RADIAN = Math.PI / 180;
            var prevAngle = -ticksAngles[0] * RADIAN;
            var r0 = Math.min(radiusExtent[0], radiusExtent[1]);
            var r1 = Math.max(radiusExtent[0], radiusExtent[1]);
 
            var clockwise = angleAxisModel.get('clockwise');
 
            for (var i = 1; i < ticksAngles.length; i++) {
                var colorIndex = (lineCount++) % areaColors.length;
                splitAreas[colorIndex] = splitAreas[colorIndex] || [];
                splitAreas[colorIndex].push(new graphic.Sector({
                    shape: {
                        cx: polar.cx,
                        cy: polar.cy,
                        r0: r0,
                        r: r1,
                        startAngle: prevAngle,
                        endAngle: -ticksAngles[i] * RADIAN,
                        clockwise: clockwise
                    },
                    silent: true
                }));
                prevAngle = -ticksAngles[i] * RADIAN;
            }
 
            // Simple optimization
            // Batching the lines if color are the same
            for (var i = 0; i < splitAreas.length; i++) {
                this.group.add(graphic.mergePath(splitAreas[i], {
                    style: zrUtil.defaults({
                        fill: areaColors[i % areaColors.length]
                    }, areaStyleModel.getAreaStyle()),
                    silent: true
                }));
            }
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/AxisBuilder.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/AxisBuilder.js

Statements: 10.96% (24 / 219)      Branches: 0% (0 / 152)      Functions: 0% (0 / 18)      Lines: 10.96% (24 / 219)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637    1 1 1 1 1 1 1 1 1 1 1   1   1                                                                                               1                                                                                       1                                   1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             1                                                             1                                                                 1                 1                                                   1                                               1                                 1               1      
 
 
    var zrUtil = require('zrender/lib/core/util');
    var formatUtil = require('../../util/format');
    var graphic = require('../../util/graphic');
    var Model = require('../../model/Model');
    var numberUtil = require('../../util/number');
    var remRadian = numberUtil.remRadian;
    var isRadianAroundZero = numberUtil.isRadianAroundZero;
    var vec2 = require('zrender/lib/core/vector');
    var matrix = require('zrender/lib/core/matrix');
    var v2ApplyTransform = vec2.applyTransform;
    var retrieve = zrUtil.retrieve;
 
    var PI = Math.PI;
 
    function makeAxisEventDataBase(axisModel) {
        var eventData = {
            componentType: axisModel.mainType
        };
        eventData[axisModel.mainType + 'Index'] = axisModel.componentIndex;
        return eventData;
    }
 
    /**
     * A final axis is translated and rotated from a "standard axis".
     * So opt.position and opt.rotation is required.
     *
     * A standard axis is and axis from [0, 0] to [0, axisExtent[1]],
     * for example: (0, 0) ------------> (0, 50)
     *
     * nameDirection or tickDirection or labelDirection is 1 means tick
     * or label is below the standard axis, whereas is -1 means above
     * the standard axis. labelOffset means offset between label and axis,
     * which is useful when 'onZero', where axisLabel is in the grid and
     * label in outside grid.
     *
     * Tips: like always,
     * positive rotation represents anticlockwise, and negative rotation
     * represents clockwise.
     * The direction of position coordinate is the same as the direction
     * of screen coordinate.
     *
     * Do not need to consider axis 'inverse', which is auto processed by
     * axis extent.
     *
     * @param {module:zrender/container/Group} group
     * @param {Object} axisModel
     * @param {Object} opt Standard axis parameters.
     * @param {Array.<number>} opt.position [x, y]
     * @param {number} opt.rotation by radian
     * @param {number} [opt.nameDirection=1] 1 or -1 Used when nameLocation is 'middle'.
     * @param {number} [opt.tickDirection=1] 1 or -1
     * @param {number} [opt.labelDirection=1] 1 or -1
     * @param {number} [opt.labelOffset=0] Usefull when onZero.
     * @param {string} [opt.axisLabelShow] default get from axisModel.
     * @param {string} [opt.axisName] default get from axisModel.
     * @param {number} [opt.axisNameAvailableWidth]
     * @param {number} [opt.labelRotate] by degree, default get from axisModel.
     * @param {number} [opt.labelInterval] Default label interval when label
     *                                     interval from model is null or 'auto'.
     * @param {number} [opt.strokeContainThreshold] Default label interval when label
     * @param {number} [opt.nameTruncateMaxWidth]
     */
    var AxisBuilder = function (axisModel, opt) {
 
        /**
         * @readOnly
         */
        this.opt = opt;
 
        /**
         * @readOnly
         */
        this.axisModel = axisModel;
 
        // Default value
        zrUtil.defaults(
            opt,
            {
                labelOffset: 0,
                nameDirection: 1,
                tickDirection: 1,
                labelDirection: 1,
                silent: true
            }
        );
 
        /**
         * @readOnly
         */
        this.group = new graphic.Group();
 
        // FIXME Not use a seperate text group?
        var dumbGroup = new graphic.Group({
            position: opt.position.slice(),
            rotation: opt.rotation
        });
 
        // this.group.add(dumbGroup);
        // this._dumbGroup = dumbGroup;
 
        dumbGroup.updateTransform();
        this._transform = dumbGroup.transform;
 
        this._dumbGroup = dumbGroup;
    };
 
    AxisBuilder.prototype = {
 
        constructor: AxisBuilder,
 
        hasBuilder: function (name) {
            return !!builders[name];
        },
 
        add: function (name) {
            builders[name].call(this);
        },
 
        getGroup: function () {
            return this.group;
        }
 
    };
 
    var builders = {
 
        /**
         * @private
         */
        axisLine: function () {
            var opt = this.opt;
            var axisModel = this.axisModel;
 
            if (!axisModel.get('axisLine.show')) {
                return;
            }
 
            var extent = this.axisModel.axis.getExtent();
 
            var matrix = this._transform;
            var pt1 = [extent[0], 0];
            var pt2 = [extent[1], 0];
            if (matrix) {
                v2ApplyTransform(pt1, pt1, matrix);
                v2ApplyTransform(pt2, pt2, matrix);
            }
 
            this.group.add(new graphic.Line(graphic.subPixelOptimizeLine({
 
                // Id for animation
                anid: 'line',
 
                shape: {
                    x1: pt1[0],
                    y1: pt1[1],
                    x2: pt2[0],
                    y2: pt2[1]
                },
                style: zrUtil.extend(
                    {lineCap: 'round'},
                    axisModel.getModel('axisLine.lineStyle').getLineStyle()
                ),
                strokeContainThreshold: opt.strokeContainThreshold || 5,
                silent: true,
                z2: 1
            })));
        },
 
        /**
         * @private
         */
        axisTick: function () {
            var axisModel = this.axisModel;
            var axis = axisModel.axis;
 
            if (!axisModel.get('axisTick.show') || axis.scale.isBlank()) {
                return;
            }
 
            var tickModel = axisModel.getModel('axisTick');
            var opt = this.opt;
 
            var lineStyleModel = tickModel.getModel('lineStyle');
            var tickLen = tickModel.get('length');
 
            var tickInterval = getInterval(tickModel, opt.labelInterval);
            var ticksCoords = axis.getTicksCoords(tickModel.get('alignWithLabel'));
            var ticks = axis.scale.getTicks();
 
            var pt1 = [];
            var pt2 = [];
            var matrix = this._transform;
 
            for (var i = 0; i < ticksCoords.length; i++) {
                // Only ordinal scale support tick interval
                if (ifIgnoreOnTick(axis, i, tickInterval)) {
                     continue;
                }
 
                var tickCoord = ticksCoords[i];
 
                pt1[0] = tickCoord;
                pt1[1] = 0;
                pt2[0] = tickCoord;
                pt2[1] = opt.tickDirection * tickLen;
 
                if (matrix) {
                    v2ApplyTransform(pt1, pt1, matrix);
                    v2ApplyTransform(pt2, pt2, matrix);
                }
                // Tick line, Not use group transform to have better line draw
                this.group.add(new graphic.Line(graphic.subPixelOptimizeLine({
 
                    // Id for animation
                    anid: 'tick_' + ticks[i],
 
                    shape: {
                        x1: pt1[0],
                        y1: pt1[1],
                        x2: pt2[0],
                        y2: pt2[1]
                    },
                    style: zrUtil.defaults(
                        lineStyleModel.getLineStyle(),
                        {
                            stroke: axisModel.get('axisLine.lineStyle.color')
                        }
                    ),
                    z2: 2,
                    silent: true
                })));
            }
        },
 
        /**
         * @param {module:echarts/coord/cartesian/AxisModel} axisModel
         * @param {module:echarts/coord/cartesian/GridModel} gridModel
         * @private
         */
        axisLabel: function () {
            var opt = this.opt;
            var axisModel = this.axisModel;
            var axis = axisModel.axis;
            var show = retrieve(opt.axisLabelShow, axisModel.get('axisLabel.show'));
 
            if (!show || axis.scale.isBlank()) {
                return;
            }
 
            var labelModel = axisModel.getModel('axisLabel');
            var textStyleModel = labelModel.getModel('textStyle');
            var labelMargin = labelModel.get('margin');
            var ticks = axis.scale.getTicks();
            var labels = axisModel.getFormattedLabels();
 
            // Special label rotate.
            var labelRotation = (
                retrieve(opt.labelRotate, labelModel.get('rotate')) || 0
            ) * PI / 180;
 
            var labelLayout = innerTextLayout(opt.rotation, labelRotation, opt.labelDirection);
            var categoryData = axisModel.get('data');
 
            var textEls = [];
            var silent = isSilent(axisModel);
            var triggerEvent = axisModel.get('triggerEvent');
 
            zrUtil.each(ticks, function (tickVal, index) {
                if (ifIgnoreOnTick(axis, index, opt.labelInterval)) {
                     return;
                }
 
                var itemTextStyleModel = textStyleModel;
                if (categoryData && categoryData[tickVal] && categoryData[tickVal].textStyle) {
                    itemTextStyleModel = new Model(
                        categoryData[tickVal].textStyle, textStyleModel, axisModel.ecModel
                    );
                }
                var textColor = itemTextStyleModel.getTextColor()
                    || axisModel.get('axisLine.lineStyle.color');
 
                var tickCoord = axis.dataToCoord(tickVal);
                var pos = [
                    tickCoord,
                    opt.labelOffset + opt.labelDirection * labelMargin
                ];
                var labelStr = axis.scale.getLabel(tickVal);
 
                var textEl = new graphic.Text({
 
                    // Id for animation
                    anid: 'label_' + tickVal,
 
                    style: {
                        text: labels[index],
                        textAlign: itemTextStyleModel.get('align', true) || labelLayout.textAlign,
                        textVerticalAlign: itemTextStyleModel.get('baseline', true) || labelLayout.textVerticalAlign,
                        textFont: itemTextStyleModel.getFont(),
                        fill: typeof textColor === 'function'
                            ? textColor(
                                // (1) In category axis with data zoom, tick is not the original
                                // index of axis.data. So tick should not be exposed to user
                                // in category axis.
                                // (2) Compatible with previous version, which always returns labelStr.
                                // But in interval scale labelStr is like '223,445', which maked
                                // user repalce ','. So we modify it to return original val but remain
                                // it as 'string' to avoid error in replacing.
                                axis.type === 'category' ? labelStr : axis.type === 'value' ? tickVal + '' : tickVal,
                                index
                            )
                            : textColor
                    },
                    position: pos,
                    rotation: labelLayout.rotation,
                    silent: silent,
                    z2: 10
                });
 
                // Pack data for mouse event
                if (triggerEvent) {
                    textEl.eventData = makeAxisEventDataBase(axisModel);
                    textEl.eventData.targetType = 'axisLabel';
                    textEl.eventData.value = labelStr;
                }
 
                // FIXME
                this._dumbGroup.add(textEl);
                textEl.updateTransform();
 
                textEls.push(textEl);
                this.group.add(textEl);
 
                textEl.decomposeTransform();
 
            }, this);
 
            fixMinMaxLabelShow(axisModel, textEls);
        },
 
        /**
         * @private
         */
        axisName: function () {
            var opt = this.opt;
            var axisModel = this.axisModel;
            var name = retrieve(opt.axisName, axisModel.get('name'));
 
            if (!name) {
                return;
            }
 
            var nameLocation = axisModel.get('nameLocation');
            var nameDirection = opt.nameDirection;
            var textStyleModel = axisModel.getModel('nameTextStyle');
            var gap = axisModel.get('nameGap') || 0;
 
            var extent = this.axisModel.axis.getExtent();
            var gapSignal = extent[0] > extent[1] ? -1 : 1;
            var pos = [
                nameLocation === 'start'
                    ? extent[0] - gapSignal * gap
                    : nameLocation === 'end'
                    ? extent[1] + gapSignal * gap
                    : (extent[0] + extent[1]) / 2, // 'middle'
                // Reuse labelOffset.
                nameLocation === 'middle' ? opt.labelOffset + nameDirection * gap : 0
            ];
 
            var labelLayout;
 
            var nameRotation = axisModel.get('nameRotate');
            if (nameRotation != null) {
                nameRotation = nameRotation * PI / 180; // To radian.
            }
 
            var axisNameAvailableWidth;
 
            if (nameLocation === 'middle') {
                labelLayout = innerTextLayout(
                    opt.rotation,
                    nameRotation != null ? nameRotation : opt.rotation, // Adapt to axis.
                    nameDirection
                );
            }
            else {
                labelLayout = endTextLayout(
                    opt, nameLocation, nameRotation || 0, extent
                );
 
                axisNameAvailableWidth = opt.axisNameAvailableWidth;
                if (axisNameAvailableWidth != null) {
                    axisNameAvailableWidth = Math.abs(
                        axisNameAvailableWidth / Math.sin(labelLayout.rotation)
                    );
                    !isFinite(axisNameAvailableWidth) && (axisNameAvailableWidth = null);
                }
            }
 
            var textFont = textStyleModel.getFont();
 
            var truncateOpt = axisModel.get('nameTruncate', true) || {};
            var ellipsis = truncateOpt.ellipsis;
            var maxWidth = retrieve(
                opt.nameTruncateMaxWidth, truncateOpt.maxWidth, axisNameAvailableWidth
            );
            var truncatedText = (ellipsis != null && maxWidth != null)
                ? formatUtil.truncateText(
                    name, maxWidth, textFont, ellipsis,
                    {minChar: 2, placeholder: truncateOpt.placeholder}
                )
                : name;
 
            var tooltipOpt = axisModel.get('tooltip', true);
 
            var mainType = axisModel.mainType;
            var formatterParams = {
                componentType: mainType,
                name: name,
                $vars: ['name']
            };
            formatterParams[mainType + 'Index'] = axisModel.componentIndex;
 
            var textEl = new graphic.Text({
 
                // Id for animation
                anid: 'name',
 
                __fullText: name,
                __truncatedText: truncatedText,
 
                style: {
                    text: truncatedText,
                    textFont: textFont,
                    fill: textStyleModel.getTextColor()
                        || axisModel.get('axisLine.lineStyle.color'),
                    textAlign: labelLayout.textAlign,
                    textVerticalAlign: labelLayout.textVerticalAlign
                },
                position: pos,
                rotation: labelLayout.rotation,
                silent: isSilent(axisModel),
                z2: 1,
                tooltip: (tooltipOpt && tooltipOpt.show)
                    ? zrUtil.extend({
                        content: name,
                        formatter: function () {
                            return name;
                        },
                        formatterParams: formatterParams
                    }, tooltipOpt)
                    : null
            });
 
            if (axisModel.get('triggerEvent')) {
                textEl.eventData = makeAxisEventDataBase(axisModel);
                textEl.eventData.targetType = 'axisName';
                textEl.eventData.name = name;
            }
 
            // FIXME
            this._dumbGroup.add(textEl);
            textEl.updateTransform();
 
            this.group.add(textEl);
 
            textEl.decomposeTransform();
        }
 
    };
 
    /**
     * @public
     * @static
     * @param {Object} opt
     * @param {number} axisRotation in radian
     * @param {number} textRotation in radian
     * @param {number} direction
     * @return {Object} {
     *  rotation, // according to axis
     *  textAlign,
     *  textVerticalAlign
     * }
     */
    var innerTextLayout = AxisBuilder.innerTextLayout = function (axisRotation, textRotation, direction) {
        var rotationDiff = remRadian(textRotation - axisRotation);
        var textAlign;
        var textVerticalAlign;
 
        if (isRadianAroundZero(rotationDiff)) { // Label is parallel with axis line.
            textVerticalAlign = direction > 0 ? 'top' : 'bottom';
            textAlign = 'center';
        }
        else if (isRadianAroundZero(rotationDiff - PI)) { // Label is inverse parallel with axis line.
            textVerticalAlign = direction > 0 ? 'bottom' : 'top';
            textAlign = 'center';
        }
        else {
            textVerticalAlign = 'middle';
 
            if (rotationDiff > 0 && rotationDiff < PI) {
                textAlign = direction > 0 ? 'right' : 'left';
            }
            else {
                textAlign = direction > 0 ? 'left' : 'right';
            }
        }
 
        return {
            rotation: rotationDiff,
            textAlign: textAlign,
            textVerticalAlign: textVerticalAlign
        };
    };
 
    function endTextLayout(opt, textPosition, textRotate, extent) {
        var rotationDiff = remRadian(textRotate - opt.rotation);
        var textAlign;
        var textVerticalAlign;
        var inverse = extent[0] > extent[1];
        var onLeft = (textPosition === 'start' && !inverse)
            || (textPosition !== 'start' && inverse);
 
        if (isRadianAroundZero(rotationDiff - PI / 2)) {
            textVerticalAlign = onLeft ? 'bottom' : 'top';
            textAlign = 'center';
        }
        else if (isRadianAroundZero(rotationDiff - PI * 1.5)) {
            textVerticalAlign = onLeft ? 'top' : 'bottom';
            textAlign = 'center';
        }
        else {
            textVerticalAlign = 'middle';
            if (rotationDiff < PI * 1.5 && rotationDiff > PI / 2) {
                textAlign = onLeft ? 'left' : 'right';
            }
            else {
                textAlign = onLeft ? 'right' : 'left';
            }
        }
 
        return {
            rotation: rotationDiff,
            textAlign: textAlign,
            textVerticalAlign: textVerticalAlign
        };
    }
 
    function isSilent(axisModel) {
        var tooltipOpt = axisModel.get('tooltip');
        return axisModel.get('silent')
            // Consider mouse cursor, add these restrictions.
            || !(
                axisModel.get('triggerEvent') || (tooltipOpt && tooltipOpt.show)
            );
    }
 
    function fixMinMaxLabelShow(axisModel, textEls) {
        // If min or max are user set, we need to check
        // If the tick on min(max) are overlap on their neighbour tick
        // If they are overlapped, we need to hide the min(max) tick label
        var showMinLabel = axisModel.get('axisLabel.showMinLabel');
        var showMaxLabel = axisModel.get('axisLabel.showMaxLabel');
        var firstLabel = textEls[0];
        var nextLabel = textEls[1];
        var lastLabel = textEls[textEls.length - 1];
        var prevLabel = textEls[textEls.length - 2];
 
        if (showMinLabel === false) {
            firstLabel.ignore = true;
        }
        else if (axisModel.getMin() != null && isTwoLabelOverlapped(firstLabel, nextLabel)) {
            showMinLabel ? (nextLabel.ignore = true) : (firstLabel.ignore = true);
        }
 
        if (showMaxLabel === false) {
            lastLabel.ignore = true;
        }
        else if (axisModel.getMax() != null && isTwoLabelOverlapped(prevLabel, lastLabel)) {
            showMaxLabel ? (prevLabel.ignore = true) : (lastLabel.ignore = true);
        }
    }
 
    function isTwoLabelOverlapped(current, next, labelLayout) {
        // current and next has the same rotation.
        var firstRect = current && current.getBoundingRect().clone();
        var nextRect = next && next.getBoundingRect().clone();
 
        if (!firstRect || !nextRect) {
            return;
        }
 
        // When checking intersect of two rotated labels, we use mRotationBack
        // to avoid that boundingRect is enlarge when using `boundingRect.applyTransform`.
        var mRotationBack = matrix.identity([]);
        matrix.rotate(mRotationBack, mRotationBack, -current.rotation);
 
        firstRect.applyTransform(matrix.mul([], mRotationBack, current.getLocalTransform()));
        nextRect.applyTransform(matrix.mul([], mRotationBack, next.getLocalTransform()));
 
        return firstRect.intersect(nextRect);
    }
 
 
    /**
     * @static
     */
    var ifIgnoreOnTick = AxisBuilder.ifIgnoreOnTick = function (axis, i, interval) {
        var rawTick;
        var scale = axis.scale;
        return scale.type === 'ordinal'
            && (
                typeof interval === 'function'
                    ? (
                        rawTick = scale.getTicks()[i],
                        !interval(rawTick, scale.getLabel(rawTick))
                    )
                    : i % (interval + 1)
            );
    };
 
    /**
     * @static
     */
    var getInterval = AxisBuilder.getInterval = function (model, labelInterval) {
        var interval = model.get('interval');
        if (interval == null || interval == 'auto') {
            interval = labelInterval;
        }
        return interval;
    };
 
    module.exports = AxisBuilder;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/AxisView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/AxisView.js

Statements: 36.67% (11 / 30)      Branches: 11.11% (2 / 18)      Functions: 12.5% (1 / 8)      Lines: 36.67% (11 / 30)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105    1         1                                                                                                                           1                       1           1   1 3 3       3     1       1    
 
 
    var axisPointerModelHelper = require('../axisPointer/modelHelper');
 
    /**
     * Base class of AxisView.
     */
    var AxisView = require('../../echarts').extendComponentView({
 
        type: 'axis',
 
        /**
         * @private
         */
        _axisPointer: null,
 
        /**
         * @protected
         * @type {string}
         */
        axisPointerClass: null,
 
        /**
         * @override
         */
        render: function (axisModel, ecModel, api, payload) {
            // FIXME
            // This process should proformed after coordinate systems updated
            // (axis scale updated), and should be performed each time update.
            // So put it here temporarily, although it is not appropriate to
            // put a model-writing procedure in `view`.
            this.axisPointerClass && axisPointerModelHelper.fixValue(axisModel);
 
            AxisView.superApply(this, 'render', arguments);
 
            updateAxisPointer(this, axisModel, ecModel, api, payload, true);
        },
 
        /**
         * Action handler.
         * @public
         * @param {module:echarts/coord/cartesian/AxisModel} axisModel
         * @param {module:echarts/model/Global} ecModel
         * @param {module:echarts/ExtensionAPI} api
         * @param {Object} payload
         */
        updateAxisPointer: function (axisModel, ecModel, api, payload, force) {
            updateAxisPointer(this, axisModel, ecModel, api, payload, false);
        },
 
        /**
         * @override
         */
        remove: function (ecModel, api) {
            var axisPointer = this._axisPointer;
            axisPointer && axisPointer.remove(api);
            AxisView.superApply(this, 'remove', arguments);
        },
 
        /**
         * @override
         */
        dispose: function (ecModel, api) {
            disposeAxisPointer(this, api);
            AxisView.superApply(this, 'dispose', arguments);
        }
 
    });
 
    function updateAxisPointer(axisView, axisModel, ecModel, api, payload, forceRender) {
        var Clazz = AxisView.getAxisPointerClass(axisView.axisPointerClass);
        if (!Clazz) {
            return;
        }
        var axisPointerModel = axisPointerModelHelper.getAxisPointerModel(axisModel);
        axisPointerModel
            ? (axisView._axisPointer || (axisView._axisPointer = new Clazz()))
                .render(axisModel, axisPointerModel, api, forceRender)
            : disposeAxisPointer(axisView, api);
    }
 
    function disposeAxisPointer(axisView, ecModel, api) {
        var axisPointer = axisView._axisPointer;
        axisPointer && axisPointer.dispose(ecModel, api);
        axisView._axisPointer = null;
    }
 
    var axisPointerClazz = [];
 
    AxisView.registerAxisPointerClass = function (type, clazz) {
        Eif (__DEV__) {
            Iif (axisPointerClazz[type]) {
                throw new Error('axisPointer ' + type + ' exists');
            }
        }
        axisPointerClazz[type] = clazz;
    };
 
    AxisView.getAxisPointerClass = function (type) {
        return type && axisPointerClazz[type];
    };
 
    module.exports = AxisView;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/CartesianAxisView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/CartesianAxisView.js

Statements: 12.63% (12 / 95)      Branches: 0% (0 / 20)      Functions: 0% (0 / 4)      Lines: 12.63% (12 / 95)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231    1 1 1 1 1 1 1   1     1                       1                                                                                                                                                                                                                                                                                                                                                                                                         1     1          
 
 
    var zrUtil = require('zrender/lib/core/util');
    var graphic = require('../../util/graphic');
    var AxisBuilder = require('./AxisBuilder');
    var AxisView = require('./AxisView');
    var cartesianAxisHelper = require('./cartesianAxisHelper');
    var ifIgnoreOnTick = AxisBuilder.ifIgnoreOnTick;
    var getInterval = AxisBuilder.getInterval;
 
    var axisBuilderAttrs = [
        'axisLine', 'axisLabel', 'axisTick', 'axisName'
    ];
    var selfBuilderAttrs = [
        'splitArea', 'splitLine'
    ];
 
    // function getAlignWithLabel(model, axisModel) {
    //     var alignWithLabel = model.get('alignWithLabel');
    //     if (alignWithLabel === 'auto') {
    //         alignWithLabel = axisModel.get('axisTick.alignWithLabel');
    //     }
    //     return alignWithLabel;
    // }
 
    var CartesianAxisView = AxisView.extend({
 
        type: 'cartesianAxis',
 
        axisPointerClass: 'CartesianAxisPointer',
 
        /**
         * @override
         */
        render: function (axisModel, ecModel, api, payload) {
 
            this.group.removeAll();
 
            var oldAxisGroup = this._axisGroup;
            this._axisGroup = new graphic.Group();
 
            this.group.add(this._axisGroup);
 
            if (!axisModel.get('show')) {
                return;
            }
 
            var gridModel = axisModel.getCoordSysModel();
 
            var layout = cartesianAxisHelper.layout(gridModel, axisModel);
 
            var axisBuilder = new AxisBuilder(axisModel, layout);
 
            zrUtil.each(axisBuilderAttrs, axisBuilder.add, axisBuilder);
 
            this._axisGroup.add(axisBuilder.getGroup());
 
            zrUtil.each(selfBuilderAttrs, function (name) {
                if (axisModel.get(name + '.show')) {
                    this['_' + name](axisModel, gridModel, layout.labelInterval);
                }
            }, this);
 
            graphic.groupTransition(oldAxisGroup, this._axisGroup, axisModel);
 
            CartesianAxisView.superCall(this, 'render', axisModel, ecModel, api, payload);
        },
 
        /**
         * @param {module:echarts/coord/cartesian/AxisModel} axisModel
         * @param {module:echarts/coord/cartesian/GridModel} gridModel
         * @param {number|Function} labelInterval
         * @private
         */
        _splitLine: function (axisModel, gridModel, labelInterval) {
            var axis = axisModel.axis;
 
            if (axis.scale.isBlank()) {
                return;
            }
 
            var splitLineModel = axisModel.getModel('splitLine');
            var lineStyleModel = splitLineModel.getModel('lineStyle');
            var lineColors = lineStyleModel.get('color');
 
            var lineInterval = getInterval(splitLineModel, labelInterval);
 
            lineColors = zrUtil.isArray(lineColors) ? lineColors : [lineColors];
 
            var gridRect = gridModel.coordinateSystem.getRect();
            var isHorizontal = axis.isHorizontal();
 
            var lineCount = 0;
 
            var ticksCoords = axis.getTicksCoords(
                // splitLineModel.get('alignWithLabel')
            );
            var ticks = axis.scale.getTicks();
 
            var p1 = [];
            var p2 = [];
            // Simple optimization
            // Batching the lines if color are the same
            var lineStyle = lineStyleModel.getLineStyle();
            for (var i = 0; i < ticksCoords.length; i++) {
                if (ifIgnoreOnTick(axis, i, lineInterval)) {
                    continue;
                }
 
                var tickCoord = axis.toGlobalCoord(ticksCoords[i]);
 
                if (isHorizontal) {
                    p1[0] = tickCoord;
                    p1[1] = gridRect.y;
                    p2[0] = tickCoord;
                    p2[1] = gridRect.y + gridRect.height;
                }
                else {
                    p1[0] = gridRect.x;
                    p1[1] = tickCoord;
                    p2[0] = gridRect.x + gridRect.width;
                    p2[1] = tickCoord;
                }
 
                var colorIndex = (lineCount++) % lineColors.length;
                this._axisGroup.add(new graphic.Line(graphic.subPixelOptimizeLine({
                    anid: 'line_' + ticks[i],
 
                    shape: {
                        x1: p1[0],
                        y1: p1[1],
                        x2: p2[0],
                        y2: p2[1]
                    },
                    style: zrUtil.defaults({
                        stroke: lineColors[colorIndex]
                    }, lineStyle),
                    silent: true
                })));
            }
        },
 
        /**
         * @param {module:echarts/coord/cartesian/AxisModel} axisModel
         * @param {module:echarts/coord/cartesian/GridModel} gridModel
         * @param {number|Function} labelInterval
         * @private
         */
        _splitArea: function (axisModel, gridModel, labelInterval) {
            var axis = axisModel.axis;
 
            if (axis.scale.isBlank()) {
                return;
            }
 
            var splitAreaModel = axisModel.getModel('splitArea');
            var areaStyleModel = splitAreaModel.getModel('areaStyle');
            var areaColors = areaStyleModel.get('color');
 
            var gridRect = gridModel.coordinateSystem.getRect();
 
            var ticksCoords = axis.getTicksCoords(
                // splitAreaModel.get('alignWithLabel')
            );
            var ticks = axis.scale.getTicks();
 
            var prevX = axis.toGlobalCoord(ticksCoords[0]);
            var prevY = axis.toGlobalCoord(ticksCoords[0]);
 
            var count = 0;
 
            var areaInterval = getInterval(splitAreaModel, labelInterval);
 
            var areaStyle = areaStyleModel.getAreaStyle();
            areaColors = zrUtil.isArray(areaColors) ? areaColors : [areaColors];
 
            for (var i = 1; i < ticksCoords.length; i++) {
                if (ifIgnoreOnTick(axis, i, areaInterval)) {
                    continue;
                }
 
                var tickCoord = axis.toGlobalCoord(ticksCoords[i]);
 
                var x;
                var y;
                var width;
                var height;
                if (axis.isHorizontal()) {
                    x = prevX;
                    y = gridRect.y;
                    width = tickCoord - x;
                    height = gridRect.height;
                }
                else {
                    x = gridRect.x;
                    y = prevY;
                    width = gridRect.width;
                    height = tickCoord - y;
                }
 
                var colorIndex = (count++) % areaColors.length;
                this._axisGroup.add(new graphic.Rect({
                    anid: 'area_' + ticks[i],
 
                    shape: {
                        x: x,
                        y: y,
                        width: width,
                        height: height
                    },
                    style: zrUtil.defaults({
                        fill: areaColors[colorIndex]
                    }, areaStyle),
                    silent: true
                }));
 
                prevX = x + width;
                prevY = y + height;
            }
        }
    });
 
    CartesianAxisView.extend({
        type: 'xAxis'
    });
    CartesianAxisView.extend({
        type: 'yAxis'
    });
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/ParallelAxisView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/ParallelAxisView.js

Statements: 19.64% (11 / 56)      Branches: 0% (0 / 17)      Functions: 0% (0 / 11)      Lines: 19.64% (11 / 56)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185    1 1 1 1 1   1   1                                                                                                                                                                                                                                                                                               1               1                           1           1    
 
 
    var zrUtil = require('zrender/lib/core/util');
    var AxisBuilder = require('./AxisBuilder');
    var BrushController = require('../helper/BrushController');
    var brushHelper = require('../helper/brushHelper');
    var graphic = require('../../util/graphic');
 
    var elementList = ['axisLine', 'axisLabel', 'axisTick', 'axisName'];
 
    var AxisView = require('../../echarts').extendComponentView({
 
        type: 'parallelAxis',
 
        /**
         * @override
         */
        init: function (ecModel, api) {
            AxisView.superApply(this, 'init', arguments);
 
            /**
             * @type {module:echarts/component/helper/BrushController}
             */
            (this._brushController = new BrushController(api.getZr()))
                .on('brush', zrUtil.bind(this._onBrush, this));
        },
 
        /**
         * @override
         */
        render: function (axisModel, ecModel, api, payload) {
            if (fromAxisAreaSelect(axisModel, ecModel, payload)) {
                return;
            }
 
            this.axisModel = axisModel;
            this.api = api;
 
            this.group.removeAll();
 
            var oldAxisGroup = this._axisGroup;
            this._axisGroup = new graphic.Group();
            this.group.add(this._axisGroup);
 
            if (!axisModel.get('show')) {
                return;
            }
 
            var coordSysModel = getCoordSysModel(axisModel, ecModel);
            var coordSys = coordSysModel.coordinateSystem;
 
            var areaSelectStyle = axisModel.getAreaSelectStyle();
            var areaWidth = areaSelectStyle.width;
 
            var dim = axisModel.axis.dim;
            var axisLayout = coordSys.getAxisLayout(dim);
 
            var builderOpt = zrUtil.extend(
                {strokeContainThreshold: areaWidth},
                axisLayout
            );
 
            var axisBuilder = new AxisBuilder(axisModel, builderOpt);
 
            zrUtil.each(elementList, axisBuilder.add, axisBuilder);
 
            this._axisGroup.add(axisBuilder.getGroup());
 
            this._refreshBrushController(
                builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api
            );
 
            var animationModel = (payload && payload.animation === false) ? null : axisModel;
            graphic.groupTransition(oldAxisGroup, this._axisGroup, animationModel);
        },
 
        /**
         * @override
         */
        updateVisual: function (axisModel, ecModel, api, payload) {
            this._brushController && this._brushController
                .updateCovers(getCoverInfoList(axisModel));
        },
 
        _refreshBrushController: function (
            builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api
        ) {
            // After filtering, axis may change, select area needs to be update.
            var extent = axisModel.axis.getExtent();
            var extentLen = extent[1] - extent[0];
            var extra = Math.min(30, Math.abs(extentLen) * 0.1); // Arbitrary value.
 
            // width/height might be negative, which will be
            // normalized in BoundingRect.
            var rect = graphic.BoundingRect.create({
                x: extent[0],
                y: -areaWidth / 2,
                width: extentLen,
                height: areaWidth
            });
            rect.x -= extra;
            rect.width += 2 * extra;
 
            this._brushController
                .mount({
                    enableGlobalPan: true,
                    rotation: builderOpt.rotation,
                    position: builderOpt.position
                })
                .setPanels([{
                    panelId: 'pl',
                    clipPath: brushHelper.makeRectPanelClipPath(rect),
                    isTargetByCursor: brushHelper.makeRectIsTargetByCursor(rect, api, coordSysModel),
                    getLinearBrushOtherExtent: brushHelper.makeLinearBrushOtherExtent(rect, 0)
                }])
                .enableBrush({
                    brushType: 'lineX',
                    brushStyle: areaSelectStyle,
                    removeOnClick: true
                })
                .updateCovers(getCoverInfoList(axisModel));
        },
 
        _onBrush: function (coverInfoList, opt) {
            // Do not cache these object, because the mey be changed.
            var axisModel = this.axisModel;
            var axis = axisModel.axis;
            var intervals = zrUtil.map(coverInfoList, function (coverInfo) {
                return [
                    axis.coordToData(coverInfo.range[0], true),
                    axis.coordToData(coverInfo.range[1], true)
                ];
            });
 
            // If realtime is true, action is not dispatched on drag end, because
            // the drag end emits the same params with the last drag move event,
            // and may have some delay when using touch pad.
            if (!axisModel.option.realtime === opt.isEnd || opt.removeOnClick) { // jshint ignore:line
                this.api.dispatchAction({
                    type: 'axisAreaSelect',
                    parallelAxisId: axisModel.id,
                    intervals: intervals
                });
            }
        },
 
        /**
         * @override
         */
        dispose: function () {
            this._brushController.dispose();
        }
    });
 
    function fromAxisAreaSelect(axisModel, ecModel, payload) {
        return payload
            && payload.type === 'axisAreaSelect'
            && ecModel.findComponents(
                {mainType: 'parallelAxis', query: payload}
            )[0] === axisModel;
    }
 
    function getCoverInfoList(axisModel) {
        var axis = axisModel.axis;
        return zrUtil.map(axisModel.activeIntervals, function (interval) {
            return {
                brushType: 'lineX',
                panelId: 'pl',
                range: [
                    axis.dataToCoord(interval[0], true),
                    axis.dataToCoord(interval[1], true)
                ]
            };
        });
    }
 
    function getCoordSysModel(axisModel, ecModel) {
        return ecModel.getComponent(
            'parallel', axisModel.get('parallelIndex')
        );
    }
 
    module.exports = AxisView;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/RadiusAxisView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/RadiusAxisView.js

Statements: 14% (7 / 50)      Branches: 0% (0 / 14)      Functions: 0% (0 / 5)      Lines: 14% (7 / 50)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145      1 1 1   1     1       1                                                                                                                                                                                                                                         1                          
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
    var graphic = require('../../util/graphic');
    var AxisBuilder = require('./AxisBuilder');
 
    var axisBuilderAttrs = [
        'axisLine', 'axisLabel', 'axisTick', 'axisName'
    ];
    var selfBuilderAttrs = [
        'splitLine', 'splitArea'
    ];
 
    require('./AxisView').extend({
 
        type: 'radiusAxis',
 
        axisPointerClass: 'PolarAxisPointer',
 
        render: function (radiusAxisModel, ecModel) {
            this.group.removeAll();
            if (!radiusAxisModel.get('show')) {
                return;
            }
            var radiusAxis = radiusAxisModel.axis;
            var polar = radiusAxis.polar;
            var angleAxis = polar.getAngleAxis();
            var ticksCoords = radiusAxis.getTicksCoords();
            var axisAngle = angleAxis.getExtent()[0];
            var radiusExtent = radiusAxis.getExtent();
 
            var layout = layoutAxis(polar, radiusAxisModel, axisAngle);
            var axisBuilder = new AxisBuilder(radiusAxisModel, layout);
            zrUtil.each(axisBuilderAttrs, axisBuilder.add, axisBuilder);
            this.group.add(axisBuilder.getGroup());
 
            zrUtil.each(selfBuilderAttrs, function (name) {
                if (radiusAxisModel.get(name +'.show') && !radiusAxis.scale.isBlank()) {
                    this['_' + name](radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords);
                }
            }, this);
        },
 
        /**
         * @private
         */
        _splitLine: function (radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) {
            var splitLineModel = radiusAxisModel.getModel('splitLine');
            var lineStyleModel = splitLineModel.getModel('lineStyle');
            var lineColors = lineStyleModel.get('color');
            var lineCount = 0;
 
            lineColors = lineColors instanceof Array ? lineColors : [lineColors];
 
            var splitLines = [];
 
            for (var i = 0; i < ticksCoords.length; i++) {
                var colorIndex = (lineCount++) % lineColors.length;
                splitLines[colorIndex] = splitLines[colorIndex] || [];
                splitLines[colorIndex].push(new graphic.Circle({
                    shape: {
                        cx: polar.cx,
                        cy: polar.cy,
                        r: ticksCoords[i]
                    },
                    silent: true
                }));
            }
 
            // Simple optimization
            // Batching the lines if color are the same
            for (var i = 0; i < splitLines.length; i++) {
                this.group.add(graphic.mergePath(splitLines[i], {
                    style: zrUtil.defaults({
                        stroke: lineColors[i % lineColors.length],
                        fill: null
                    }, lineStyleModel.getLineStyle()),
                    silent: true
                }));
            }
        },
 
        /**
         * @private
         */
        _splitArea: function (radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) {
 
            var splitAreaModel = radiusAxisModel.getModel('splitArea');
            var areaStyleModel = splitAreaModel.getModel('areaStyle');
            var areaColors = areaStyleModel.get('color');
            var lineCount = 0;
 
            areaColors = areaColors instanceof Array ? areaColors : [areaColors];
 
            var splitAreas = [];
 
            var prevRadius = ticksCoords[0];
            for (var i = 1; i < ticksCoords.length; i++) {
                var colorIndex = (lineCount++) % areaColors.length;
                splitAreas[colorIndex] = splitAreas[colorIndex] || [];
                splitAreas[colorIndex].push(new graphic.Sector({
                    shape: {
                        cx: polar.cx,
                        cy: polar.cy,
                        r0: prevRadius,
                        r: ticksCoords[i],
                        startAngle: 0,
                        endAngle: Math.PI * 2
                    },
                    silent: true
                }));
                prevRadius = ticksCoords[i];
            }
 
            // Simple optimization
            // Batching the lines if color are the same
            for (var i = 0; i < splitAreas.length; i++) {
                this.group.add(graphic.mergePath(splitAreas[i], {
                    style: zrUtil.defaults({
                        fill: areaColors[i % areaColors.length]
                    }, areaStyleModel.getAreaStyle()),
                    silent: true
                }));
            }
        }
    });
 
    /**
     * @inner
     */
    function layoutAxis(polar, radiusAxisModel, axisAngle) {
        return {
            position: [polar.cx, polar.cy],
            rotation: axisAngle / 180 * Math.PI,
            labelDirection: -1,
            tickDirection: -1,
            nameDirection: 1,
            labelRotate: radiusAxisModel.getModel('axisLabel').get('rotate'),
            // Over splitLine and splitArea
            z2: 1
        };
    }
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/SingleAxisView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/SingleAxisView.js

Statements: 18.87% (10 / 53)      Branches: 0% (0 / 12)      Functions: 0% (0 / 2)      Lines: 18.87% (10 / 53)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119    1 1 1 1 1 1   1       1   1                                                                                                                                                                                                       1      
 
 
    var AxisBuilder = require('./AxisBuilder');
    var zrUtil =  require('zrender/lib/core/util');
    var graphic = require('../../util/graphic');
    var singleAxisHelper = require('./singleAxisHelper');
    var getInterval = AxisBuilder.getInterval;
    var ifIgnoreOnTick = AxisBuilder.ifIgnoreOnTick;
 
    var axisBuilderAttrs = [
        'axisLine', 'axisLabel', 'axisTick', 'axisName'
    ];
 
    var selfBuilderAttr = 'splitLine';
 
    var SingleAxisView = require('./AxisView').extend({
 
        type: 'singleAxis',
 
        axisPointerClass: 'SingleAxisPointer',
 
        render: function (axisModel, ecModel, api, payload) {
 
            var group = this.group;
 
            group.removeAll();
 
            var layout =  singleAxisHelper.layout(axisModel);
 
            var axisBuilder = new AxisBuilder(axisModel, layout);
 
            zrUtil.each(axisBuilderAttrs, axisBuilder.add, axisBuilder);
 
            group.add(axisBuilder.getGroup());
 
            if (axisModel.get(selfBuilderAttr + '.show')) {
                this['_' + selfBuilderAttr](axisModel, layout.labelInterval);
            }
 
            SingleAxisView.superCall(this, 'render', axisModel, ecModel, api, payload);
        },
 
        _splitLine: function(axisModel, labelInterval) {
            var axis = axisModel.axis;
 
            if (axis.scale.isBlank()) {
                return;
            }
 
            var splitLineModel = axisModel.getModel('splitLine');
            var lineStyleModel = splitLineModel.getModel('lineStyle');
            var lineWidth = lineStyleModel.get('width');
            var lineColors = lineStyleModel.get('color');
            var lineInterval = getInterval(splitLineModel, labelInterval);
 
            lineColors = lineColors instanceof Array ? lineColors : [lineColors];
 
            var gridRect = axisModel.coordinateSystem.getRect();
            var isHorizontal = axis.isHorizontal();
 
            var splitLines = [];
            var lineCount = 0;
 
            var ticksCoords = axis.getTicksCoords();
 
            var p1 = [];
            var p2 = [];
 
            for (var i = 0; i < ticksCoords.length; ++i) {
                if (ifIgnoreOnTick(axis, i, lineInterval)) {
                    continue;
                }
                var tickCoord = axis.toGlobalCoord(ticksCoords[i]);
                if (isHorizontal) {
                    p1[0] = tickCoord;
                    p1[1] = gridRect.y;
                    p2[0] = tickCoord;
                    p2[1] = gridRect.y + gridRect.height;
                }
                else {
                    p1[0] = gridRect.x;
                    p1[1] = tickCoord;
                    p2[0] = gridRect.x + gridRect.width;
                    p2[1] = tickCoord;
                }
                var colorIndex = (lineCount++) % lineColors.length;
                splitLines[colorIndex] = splitLines[colorIndex] || [];
                splitLines[colorIndex].push(new graphic.Line(
                    graphic.subPixelOptimizeLine({
                        shape: {
                            x1: p1[0],
                            y1: p1[1],
                            x2: p2[0],
                            y2: p2[1]
                        },
                        style: {
                            lineWidth: lineWidth
                        },
                        silent: true
                    })));
            }
 
            for (var i = 0; i < splitLines.length; ++i) {
                this.group.add(graphic.mergePath(splitLines[i], {
                    style: {
                        stroke: lineColors[i % lineColors.length],
                        lineDash: lineStyleModel.getLineDash(lineWidth),
                        lineWidth: lineWidth
                    },
                    silent: true
                }));
            }
        }
    });
 
    module.exports = SingleAxisView;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/cartesianAxisHelper.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/cartesianAxisHelper.js

Statements: 14.71% (5 / 34)      Branches: 0% (0 / 20)      Functions: 0% (0 / 2)      Lines: 14.71% (5 / 34)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81    1   1                 1                                               1                                                                               1      
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    var helper = {};
 
    /**
     * @param {Object} opt {labelInside}
     * @return {Object} {
     *  position, rotation, labelDirection, labelOffset,
     *  tickDirection, labelRotate, labelInterval, z2
     * }
     */
    helper.layout = function (gridModel, axisModel, opt) {
        opt = opt || {};
        var grid = gridModel.coordinateSystem;
        var axis = axisModel.axis;
        var layout = {};
 
        var rawAxisPosition = axis.position;
        var axisPosition = axis.onZero ? 'onZero' : rawAxisPosition;
        var axisDim = axis.dim;
 
        // [left, right, top, bottom]
        var rect = grid.getRect();
        var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height];
 
        var axisOffset = axisModel.get('offset') || 0;
 
        var posMap = {
            x: { top: rectBound[2] - axisOffset, bottom: rectBound[3] + axisOffset },
            y: { left: rectBound[0] - axisOffset, right: rectBound[1] + axisOffset }
        };
 
        posMap.x.onZero = Math.max(Math.min(getZero('y'), posMap.x.bottom), posMap.x.top);
        posMap.y.onZero = Math.max(Math.min(getZero('x'), posMap.y.right), posMap.y.left);
 
        function getZero(dim, val) {
            var theAxis = grid.getAxis(dim);
            return theAxis.toGlobalCoord(theAxis.dataToCoord(0));
        }
 
        // Axis position
        layout.position = [
            axisDim === 'y' ? posMap.y[axisPosition] : rectBound[0],
            axisDim === 'x' ? posMap.x[axisPosition] : rectBound[3]
        ];
 
        // Axis rotation
        layout.rotation = Math.PI / 2 * (axisDim === 'x' ? 0 : 1);
 
        // Tick and label direction, x y is axisDim
        var dirMap = {top: -1, bottom: 1, left: -1, right: 1};
 
        layout.labelDirection = layout.tickDirection = layout.nameDirection = dirMap[rawAxisPosition];
        layout.labelOffset = axis.onZero ? posMap[axisDim][rawAxisPosition] - posMap[axisDim].onZero : 0;
 
        if (axisModel.get('axisTick.inside')) {
            layout.tickDirection = -layout.tickDirection;
        }
        if (zrUtil.retrieve(opt.labelInside, axisModel.get('axisLabel.inside'))) {
            layout.labelDirection = -layout.labelDirection;
        }
 
        // Special label rotation
        var labelRotate = axisModel.get('axisLabel.rotate');
        layout.labelRotate = axisPosition === 'top' ? -labelRotate : labelRotate;
 
        // label interval when auto mode.
        layout.labelInterval = axis.getLabelInterval();
 
        // Over splitLine and splitArea
        layout.z2 = 1;
 
        return layout;
    };
 
    module.exports = helper;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/parallelAxisAction.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/parallelAxisAction.js

Statements: 50% (4 / 8)      Branches: 100% (0 / 0)      Functions: 0% (0 / 4)      Lines: 50% (4 / 8)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37    1             1         1                       1                    
 
 
    var echarts = require('../../echarts');
 
    /**
     * @payload
     * @property {string} parallelAxisId
     * @property {Array.<Array.<number>>} intervals
     */
    var actionInfo = {
        type: 'axisAreaSelect',
        event: 'axisAreaSelected',
        update: 'updateVisual'
    };
    echarts.registerAction(actionInfo, function (payload, ecModel) {
        ecModel.eachComponent(
            {mainType: 'parallelAxis', query: payload},
            function (parallelAxisModel) {
                parallelAxisModel.axis.model.setActiveIntervals(payload.intervals);
            }
        );
    });
 
    /**
     * @payload
     */
    echarts.registerAction('parallelAxisExpand', function (payload, ecModel) {
        ecModel.eachComponent(
            {mainType: 'parallel', query: payload},
            function (parallelModel) {
                parallelModel.setAxisExpand(payload);
            }
        );
 
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/singleAxisHelper.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axis/singleAxisHelper.js

Statements: 14.29% (4 / 28)      Branches: 0% (0 / 14)      Functions: 0% (0 / 1)      Lines: 14.29% (4 / 28)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71    1   1                 1                                                                                                           1      
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    var helper = {};
 
    /**
     * @param {Object} opt {labelInside}
     * @return {Object} {
     *  position, rotation, labelDirection, labelOffset,
     *  tickDirection, labelRotate, labelInterval, z2
     * }
     */
    helper.layout = function (axisModel, opt) {
        opt = opt || {};
        var single = axisModel.coordinateSystem;
        var axis = axisModel.axis;
        var layout = {};
 
        var axisPosition = axis.position;
        var orient = axis.orient;
 
        var rect = single.getRect();
        var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height];
 
        var positionMap = {
            horizontal: {top: rectBound[2], bottom: rectBound[3]},
            vertical: {left: rectBound[0], right: rectBound[1]}
        };
 
        layout.position = [
            orient === 'vertical'
                ? positionMap.vertical[axisPosition]
                : rectBound[0],
            orient === 'horizontal'
                ? positionMap.horizontal[axisPosition]
                : rectBound[3]
        ];
 
        var r = {horizontal: 0, vertical: 1};
        layout.rotation = Math.PI / 2 * r[orient];
 
        var directionMap = {top: -1, bottom: 1, right: 1, left: -1};
 
        layout.labelDirection = layout.tickDirection
            = layout.nameDirection
            = directionMap[axisPosition];
 
        if (axisModel.get('axisTick.inside')) {
            layout.tickDirection = -layout.tickDirection;
        }
 
        if (zrUtil.retrieve(opt.labelInside, axisModel.get('axisLabel.inside'))) {
            layout.labelDirection = -layout.labelDirection;
        }
 
        var labelRotation = opt.rotate;
        labelRotation == null && (labelRotation = axisModel.get('axisLabel.rotate'));
        layout.labelRotation = axisPosition === 'top' ? -labelRotation : labelRotation;
 
        layout.labelInterval = axis.getLabelInterval();
 
        layout.z2 = 1;
 
        return layout;
    };
 
    module.exports = helper;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/

Statements: 16.86% (134 / 795)      Branches: 0% (0 / 440)      Functions: 0% (0 / 113)      Lines: 16.86% (134 / 795)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/
File Statements Branches Functions Lines
AxisPointerModel.js 100% (3 / 3) 100% (0 / 0) 100% (0 / 0) 100% (3 / 3)
AxisPointerView.js 18.18% (2 / 11) 0% (0 / 13) 0% (0 / 4) 18.18% (2 / 11)
BaseAxisPointer.js 11.3% (20 / 177) 0% (0 / 100) 0% (0 / 27) 11.3% (20 / 177)
CartesianAxisPointer.js 21.57% (11 / 51) 0% (0 / 10) 0% (0 / 7) 21.57% (11 / 51)
PolarAxisPointer.js 20.69% (12 / 58) 0% (0 / 22) 0% (0 / 4) 20.69% (12 / 58)
SingleAxisPointer.js 25.49% (13 / 51) 0% (0 / 8) 0% (0 / 7) 25.49% (13 / 51)
axisTrigger.js 12.66% (20 / 158) 0% (0 / 101) 0% (0 / 25) 12.66% (20 / 158)
findPointFromSeries.js 12.5% (3 / 24) 0% (0 / 20) 0% (0 / 2) 12.5% (3 / 24)
globalListener.js 24.14% (14 / 58) 0% (0 / 24) 0% (0 / 11) 24.14% (14 / 58)
modelHelper.js 14.63% (18 / 123) 0% (0 / 100) 0% (0 / 16) 14.63% (18 / 123)
viewHelper.js 22.22% (18 / 81) 0% (0 / 42) 0% (0 / 10) 22.22% (18 / 81)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/AxisPointerModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/AxisPointerModel.js

Statements: 100% (3 / 3)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (3 / 3)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101    1   1                                                                                                                                                                                         1      
 
 
    var echarts = require('../../echarts');
 
    var AxisPointerModel = echarts.extendComponentModel({
 
        type: 'axisPointer',
 
        coordSysAxesInfo: null,
 
        defaultOption: {
            // 'auto' means that show when triggered by tooltip or handle.
            show: 'auto',
            // 'click' | 'mousemove' | 'none'
            triggerOn: null, // set default in AxisPonterView.js
 
            zlevel: 0,
            z: 50,
 
            type: 'line',
            // axispointer triggered by tootip determine snap automatically,
            // see `modelHelper`.
            snap: false,
            triggerTooltip: true,
 
            value: null,
            status: null, // Init value depends on whether handle is used.
 
            // [group0, group1, ...]
            // Each group can be: {
            //      mapper: function () {},
            //      singleTooltip: 'multiple',  // 'multiple' or 'single'
            //      xAxisId: ...,
            //      yAxisName: ...,
            //      angleAxisIndex: ...
            // }
            // mapper: can be ignored.
            //      input: {axisInfo, value}
            //      output: {axisInfo, value}
            link: [],
 
            // Do not set 'auto' here, otherwise global animation: false
            // will not effect at this axispointer.
            animation: null,
            animationDurationUpdate: 200,
 
            lineStyle: {
                color: '#aaa',
                width: 1,
                type: 'solid'
            },
 
            shadowStyle: {
                color: 'rgba(150,150,150,0.3)'
            },
 
            label: {
                show: true,
                formatter: null, // string | Function
                precision: 'auto', // Or a number like 0, 1, 2 ...
                margin: 3,
                textStyle: {
                    color: '#fff'
                },
                padding: [5, 7, 5, 7],
                backgroundColor: 'auto', // default: axis line color
                borderColor: null,
                borderWidth: 0,
                shadowBlur: 3,
                shadowColor: '#aaa'
                // Considering applicability, common style should
                // better not have shadowOffset.
                // shadowOffsetX: 0,
                // shadowOffsetY: 2
            },
 
            handle: {
                show: false,
                icon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z', // jshint ignore:line
                size: 45,
                // handle margin is from symbol center to axis, which is stable when circular move.
                margin: 50,
                // color: '#1b8bbd'
                // color: '#2f4554'
                color: '#333',
                shadowBlur: 3,
                shadowColor: '#aaa',
                shadowOffsetX: 0,
                shadowOffsetY: 2,
 
                // For mobile performance
                throttle: 40
            }
        }
 
    });
 
    module.exports = AxisPointerModel;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/AxisPointerView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/AxisPointerView.js

Statements: 18.18% (2 / 11)      Branches: 0% (0 / 13)      Functions: 0% (0 / 4)      Lines: 18.18% (2 / 11)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54    1   1                                                                                                  
 
 
    var globalListener = require('./globalListener');
 
    var AxisPonterView = require('../../echarts').extendComponentView({
 
        type: 'axisPointer',
 
        render: function (globalAxisPointerModel, ecModel, api) {
            var globalTooltipModel = ecModel.getComponent('tooltip');
            var triggerOn = globalAxisPointerModel.get('triggerOn')
                || (globalTooltipModel && globalTooltipModel.get('triggerOn') || 'mousemove|click');
 
            // Register global listener in AxisPointerView to enable
            // AxisPointerView to be independent to Tooltip.
            globalListener.register(
                'axisPointer',
                api,
                function (currTrigger, e, dispatchAction) {
                    // If 'none', it is not controlled by mouse totally.
                    if (triggerOn !== 'none'
                        && (currTrigger === 'leave' || triggerOn.indexOf(currTrigger) >= 0)
                    ) {
                        dispatchAction({
                            type: 'updateAxisPointer',
                            currTrigger: currTrigger,
                            x: e && e.offsetX,
                            y: e && e.offsetY
                        });
                    }
                }
            );
        },
 
        /**
         * @override
         */
        remove: function (ecModel, api) {
            globalListener.disopse(api.getZr(), 'axisPointer');
            AxisPonterView.superApply(this._model, 'remove', arguments);
        },
 
        /**
         * @override
         */
        dispose: function (ecModel, api) {
            globalListener.unregister('axisPointer', api);
            AxisPonterView.superApply(this._model, 'dispose', arguments);
        }
 
    });
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/BaseAxisPointer.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/BaseAxisPointer.js

Statements: 11.3% (20 / 177)      Branches: 0% (0 / 100)      Functions: 0% (0 / 27)      Lines: 11.3% (20 / 177)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543      1 1 1 1 1 1 1   1 1           1     1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             1     1                   1                         1       1             1                                                       1                         1   1    
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
    var clazzUtil = require('../../util/clazz');
    var graphic = require('../../util/graphic');
    var get = require('../../util/model').makeGetter();
    var axisPointerModelHelper = require('./modelHelper');
    var eventTool = require('zrender/lib/core/event');
    var throttle = require('../../util/throttle');
 
    var clone = zrUtil.clone;
    var bind = zrUtil.bind;
 
    /**
     * Base axis pointer class in 2D.
     * Implemenents {module:echarts/component/axis/IAxisPointer}.
     */
    function BaseAxisPointer () {
    }
 
    BaseAxisPointer.prototype = {
 
        /**
         * @private
         */
        _group: null,
 
        /**
         * @private
         */
        _lastGraphicKey: null,
 
        /**
         * @private
         */
        _handle: null,
 
        /**
         * @private
         */
        _dragging: false,
 
        /**
         * @private
         */
        _lastValue: null,
 
        /**
         * @private
         */
        _lastStatus: null,
 
        /**
         * @private
         */
        _payloadInfo: null,
 
        /**
         * In px, arbitrary value. Do not set too small,
         * no animation is ok for most cases.
         * @protected
         */
        animationThreshold: 15,
 
        /**
         * @implement
         */
        render: function (axisModel, axisPointerModel, api, forceRender) {
            var value = axisPointerModel.get('value');
            var status = axisPointerModel.get('status');
 
            // Bind them to `this`, not in closure, otherwise they will not
            // be replaced when user calling setOption in not merge mode.
            this._axisModel = axisModel;
            this._axisPointerModel = axisPointerModel;
            this._api = api;
 
            // Optimize: `render` will be called repeatly during mouse move.
            // So it is power consuming if performing `render` each time,
            // especially on mobile device.
            if (!forceRender
                && this._lastValue === value
                && this._lastStatus === status
            ) {
                return;
            }
            this._lastValue = value;
            this._lastStatus = status;
 
            var group = this._group;
            var handle = this._handle;
 
            if (!status || status === 'hide') {
                // Do not clear here, for animation better.
                group && group.hide();
                handle && handle.hide();
                return;
            }
            group && group.show();
            handle && handle.show();
 
            // Otherwise status is 'show'
            var elOption = {};
            this.makeElOption(elOption, value, axisModel, axisPointerModel, api);
 
            // Enable change axis pointer type.
            var graphicKey = elOption.graphicKey;
            if (graphicKey !== this._lastGraphicKey) {
                this.clear(api);
            }
            this._lastGraphicKey = graphicKey;
 
            var moveAnimation = this._moveAnimation =
                this.determineAnimation(axisModel, axisPointerModel);
 
            if (!group) {
                group = this._group = new graphic.Group();
                this.createPointerEl(group, elOption, axisModel, axisPointerModel);
                this.createLabelEl(group, elOption, axisModel, axisPointerModel);
                api.getZr().add(group);
            }
            else {
                var doUpdateProps = zrUtil.curry(updateProps, axisPointerModel, moveAnimation);
                this.updatePointerEl(group, elOption, doUpdateProps, axisPointerModel);
                this.updateLabelEl(group, elOption, doUpdateProps, axisPointerModel);
            }
 
            updateMandatoryProps(group, axisPointerModel, true);
 
            this._renderHandle(value);
        },
 
        /**
         * @implement
         */
        remove: function (api) {
            this.clear(api);
        },
 
        /**
         * @implement
         */
        dispose: function (api) {
            this.clear(api);
        },
 
        /**
         * @protected
         */
        determineAnimation: function (axisModel, axisPointerModel) {
            var animation = axisPointerModel.get('animation');
            var axis = axisModel.axis;
            var isCategoryAxis = axis.type === 'category';
            var useSnap = axisPointerModel.get('snap');
 
            // Value axis without snap always do not snap.
            if (!useSnap && !isCategoryAxis) {
                return false;
            }
 
            if (animation === 'auto' || animation == null) {
                var animationThreshold = this.animationThreshold;
                if (isCategoryAxis && axis.getBandWidth() > animationThreshold) {
                    return true;
                }
 
                // It is important to auto animation when snap used. Consider if there is
                // a dataZoom, animation will be disabled when too many points exist, while
                // it will be enabled for better visual effect when little points exist.
                if (useSnap) {
                    var seriesDataCount = axisPointerModelHelper.getAxisInfo(axisModel).seriesDataCount;
                    var axisExtent = axis.getExtent();
                    // Approximate band width
                    return Math.abs(axisExtent[0] - axisExtent[1]) / seriesDataCount > animationThreshold;
                }
 
                return false;
            }
 
            return animation === true;
        },
 
        /**
         * add {pointer, label, graphicKey} to elOption
         * @protected
         */
        makeElOption: function (elOption, value, axisModel, axisPointerModel, api) {
            // Shoule be implemenented by sub-class.
        },
 
        /**
         * @protected
         */
        createPointerEl: function (group, elOption, axisModel, axisPointerModel) {
            var pointerOption = elOption.pointer;
            if (pointerOption) {
                var pointerEl = get(group).pointerEl = new graphic[pointerOption.type](
                    clone(elOption.pointer)
                );
                group.add(pointerEl);
            }
        },
 
        /**
         * @protected
         */
        createLabelEl: function (group, elOption, axisModel, axisPointerModel) {
            if (elOption.label) {
                var labelEl = get(group).labelEl = new graphic.Rect(
                    clone(elOption.label)
                );
 
                group.add(labelEl);
                updateLabelShowHide(labelEl, axisPointerModel);
            }
        },
 
        /**
         * @protected
         */
        updatePointerEl: function (group, elOption, updateProps) {
            var pointerEl = get(group).pointerEl;
            if (pointerEl) {
                pointerEl.setStyle(elOption.pointer.style);
                updateProps(pointerEl, {shape: elOption.pointer.shape});
            }
        },
 
        /**
         * @protected
         */
        updateLabelEl: function (group, elOption, updateProps, axisPointerModel) {
            var labelEl = get(group).labelEl;
            if (labelEl) {
                labelEl.setStyle(elOption.label.style);
                updateProps(labelEl, {
                    // Consider text length change in vertical axis, animation should
                    // be used on shape, otherwise the effect will be weird.
                    shape: elOption.label.shape,
                    position: elOption.label.position
                });
 
                updateLabelShowHide(labelEl, axisPointerModel);
            }
        },
 
        /**
         * @private
         */
        _renderHandle: function (value) {
            if (this._dragging || !this.updateHandleTransform) {
                return;
            }
 
            var axisPointerModel = this._axisPointerModel;
            var zr = this._api.getZr();
            var handle = this._handle;
            var handleModel = axisPointerModel.getModel('handle');
 
            var status = axisPointerModel.get('status');
            if (!handleModel.get('show') || !status || status === 'hide') {
                handle && zr.remove(handle);
                this._handle = null;
                return;
            }
 
            var isInit;
            if (!this._handle) {
                isInit = true;
                handle = this._handle = createIcon(handleModel, {
                    onmousemove: function (e) {
                        // Fot mobile devicem, prevent screen slider on the button.
                        eventTool.stop(e.event);
                    },
                    onmousedown: bind(this._onHandleDragMove, this, 0, 0),
                    drift: bind(this._onHandleDragMove, this),
                    ondragend: bind(this._onHandleDragEnd, this)
                });
                zr.add(handle);
            }
 
            updateMandatoryProps(handle, axisPointerModel, false);
 
            // update style
            var includeStyles = [
                'color', 'borderColor', 'borderWidth', 'opacity',
                'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY'
            ];
            handle.setStyle(handleModel.getItemStyle(null, includeStyles));
 
            // update position
            var handleSize = handleModel.get('size');
            if (!zrUtil.isArray(handleSize)) {
                handleSize = [handleSize, handleSize];
            }
            handle.attr('scale', [handleSize[0] / 2, handleSize[1] / 2]);
 
            throttle.createOrUpdate(
                this,
                '_doDispatchAxisPointer',
                handleModel.get('throttle') || 0,
                'fixRate'
            );
 
            this._moveHandleToValue(value, isInit);
        },
 
        /**
         * @private
         */
        _moveHandleToValue: function (value, isInit) {
            updateProps(
                this._axisPointerModel,
                !isInit && this._moveAnimation,
                this._handle,
                getHandleTransProps(this.getHandleTransform(
                    value, this._axisModel, this._axisPointerModel
                ))
            );
        },
 
        /**
         * @private
         */
        _onHandleDragMove: function (dx, dy) {
            var handle = this._handle;
            if (!handle) {
                return;
            }
 
            this._dragging = true;
 
            // Persistent for throttle.
            var trans = this.updateHandleTransform(
                getHandleTransProps(handle),
                [dx, dy],
                this._axisModel,
                this._axisPointerModel
            );
            this._payloadInfo = trans;
 
            handle.stopAnimation();
            handle.attr(getHandleTransProps(trans));
            get(handle).lastProp = null;
 
            this._doDispatchAxisPointer();
        },
 
        /**
         * Throttled method.
         * @private
         */
        _doDispatchAxisPointer: function () {
            var handle = this._handle;
            if (!handle) {
                return;
            }
 
            var payloadInfo = this._payloadInfo;
            var payload = {
                type: 'updateAxisPointer',
                x: payloadInfo.cursorPoint[0],
                y: payloadInfo.cursorPoint[1],
                tooltipOption: payloadInfo.tooltipOption,
                highDownKey: 'axisPointerHandle'
            };
            var axis = this._axisModel.axis;
            payload[axis.dim + 'AxisId'] = this._axisModel.id;
            this._api.dispatchAction(payload);
        },
 
        /**
         * @private
         */
        _onHandleDragEnd: function (moveAnimation) {
            this._dragging = false;
            var handle = this._handle;
            if (!handle) {
                return;
            }
 
            var value = this._axisPointerModel.get('value');
            // Consider snap or categroy axis, handle may be not consistent with
            // axisPointer. So move handle to align the exact value position when
            // drag ended.
            this._moveHandleToValue(value);
 
            // For the effect: tooltip will be shown when finger holding on handle
            // button, and will be hidden after finger left handle button.
            this._api.dispatchAction({
                type: 'hideTip'
            });
        },
 
        /**
         * Should be implemenented by sub-class if support `handle`.
         * @protected
         * @param {number} value
         * @param {module:echarts/model/Model} axisModel
         * @param {module:echarts/model/Model} axisPointerModel
         * @return {Object} {position: [x, y], rotation: 0}
         */
        getHandleTransform: null,
 
        /**
         * * Should be implemenented by sub-class if support `handle`.
         * @protected
         * @param {Object} transform {position, rotation}
         * @param {Array.<number>} delta [dx, dy]
         * @param {module:echarts/model/Model} axisModel
         * @param {module:echarts/model/Model} axisPointerModel
         * @return {Object} {position: [x, y], rotation: 0, cursorPoint: [x, y]}
         */
        updateHandleTransform: null,
 
        /**
         * @private
         */
        clear: function (api) {
            this._lastValue = null;
            this._lastStatus = null;
 
            var zr = api.getZr();
            var group = this._group;
            var handle = this._handle;
            if (zr && group) {
                this._lastGraphicKey = null;
                group && zr.remove(group);
                handle && zr.remove(handle);
                this._group = null;
                this._handle = null;
                this._payloadInfo = null;
            }
        },
 
        /**
         * @protected
         */
        doClear: function () {
            // Implemented by sub-class if necessary.
        },
 
        /**
         * @protected
         * @param {Array.<number>} xy
         * @param {Array.<number>} wh
         * @param {number} [xDimIndex=0] or 1
         */
        buildLabel: function (xy, wh, xDimIndex) {
            xDimIndex = xDimIndex || 0;
            return {
                x: xy[xDimIndex],
                y: xy[1 - xDimIndex],
                width: wh[xDimIndex],
                height: wh[1 - xDimIndex]
            };
        }
    };
 
    BaseAxisPointer.prototype.constructor = BaseAxisPointer;
 
 
    function updateProps(animationModel, moveAnimation, el, props) {
        // Animation optimize.
        if (!propsEqual(get(el).lastProp, props)) {
            get(el).lastProp = props;
            moveAnimation
                ? graphic.updateProps(el, props, animationModel)
                : (el.stopAnimation(), el.attr(props));
        }
    }
 
    function propsEqual(lastProps, newProps) {
        if (zrUtil.isObject(lastProps) && zrUtil.isObject(newProps)) {
            var equals = true;
            zrUtil.each(newProps, function (item, key) {
                equals &= propsEqual(lastProps[key], item);
            });
            return !!equals;
        }
        else {
            return lastProps === newProps;
        }
    }
 
    function updateLabelShowHide(labelEl, axisPointerModel) {
        labelEl[axisPointerModel.get('label.show') ? 'show' : 'hide']();
    }
 
    function getHandleTransProps(trans) {
        return {
            position: trans.position.slice(),
            rotation: trans.rotation || 0
        };
    }
 
    function createIcon(handleModel, handlers) {
        var iconStr = handleModel.get('icon');
        var style = {
            x: -1, y: -1, width: 2, height: 2
        };
        var opt = zrUtil.extend({
            style: {
                strokeNoScale: true
            },
            rectHover: true,
            cursor: 'move',
            draggable: true
        }, handlers);
 
        return iconStr.indexOf('image://') === 0
            ? (
                style.image = iconStr.slice(8),
                opt.style = style,
                new graphic.Image(opt)
            )
            : graphic.makePath(
                iconStr.replace('path://', ''),
                opt,
                style,
                'center'
            );
    }
 
    function updateMandatoryProps(group, axisPointerModel, silent) {
        var z = axisPointerModel.get('z');
        var zlevel = axisPointerModel.get('zlevel');
 
        group && group.traverse(function (el) {
            if (el.type !== 'group') {
                z != null && (el.z = z);
                zlevel != null && (el.zlevel = zlevel);
                el.silent = silent;
            }
        });
    }
 
    clazzUtil.enableClassExtend(BaseAxisPointer);
 
    module.exports = BaseAxisPointer;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/CartesianAxisPointer.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/CartesianAxisPointer.js

Statements: 21.57% (11 / 51)      Branches: 0% (0 / 10)      Functions: 0% (0 / 7)      Lines: 21.57% (11 / 51)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130      1 1 1 1 1   1                                                                                                                                                   1           1                                                               1       1   1    
'use strict';
 
 
    var graphic = require('../../util/graphic');
    var BaseAxisPointer = require('./BaseAxisPointer');
    var viewHelper = require('./viewHelper');
    var cartesianAxisHelper = require('../axis/cartesianAxisHelper');
    var AxisView = require('../axis/AxisView');
 
    var CartesianAxisPointer = BaseAxisPointer.extend({
 
        /**
         * @override
         */
        makeElOption: function (elOption, value, axisModel, axisPointerModel, api) {
            var axis = axisModel.axis;
            var grid = axis.grid;
            var axisPointerType = axisPointerModel.get('type');
            var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent();
            var pixelValue = axis.toGlobalCoord(axis.dataToCoord(value, true));
 
            if (axisPointerType && axisPointerType !== 'none') {
                var elStyle = viewHelper.buildElStyle(axisPointerModel);
                var pointerOption = pointerShapeBuilder[axisPointerType](
                    axis, pixelValue, otherExtent, elStyle
                );
                pointerOption.style = elStyle;
                elOption.graphicKey = pointerOption.type;
                elOption.pointer = pointerOption;
            }
 
            var layoutInfo = cartesianAxisHelper.layout(grid.model, axisModel);
            viewHelper.buildCartesianSingleLabelElOption(
                value, elOption, layoutInfo, axisModel, axisPointerModel, api
            );
        },
 
        /**
         * @override
         */
        getHandleTransform: function (value, axisModel, axisPointerModel) {
            var layoutInfo = cartesianAxisHelper.layout(axisModel.axis.grid.model, axisModel, {
                labelInside: false
            });
            layoutInfo.labelMargin = axisPointerModel.get('handle.margin');
            return {
                position: viewHelper.getTransformedPosition(axisModel.axis, value, layoutInfo),
                rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0)
            };
        },
 
        /**
         * @override
         */
        updateHandleTransform: function (transform, delta, axisModel, axisPointerModel) {
            var axis = axisModel.axis;
            var grid = axis.grid;
            var axisExtent = axis.getGlobalExtent(true);
            var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent();
            var dimIndex = axis.dim === 'x' ? 0 : 1;
 
            var currPosition = transform.position;
            currPosition[dimIndex] += delta[dimIndex];
            currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]);
            currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]);
 
            var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2;
            var cursorPoint = [cursorOtherValue, cursorOtherValue];
            cursorPoint[dimIndex] = currPosition[dimIndex];
 
            // Make tooltip do not overlap axisPointer and in the middle of the grid.
            var tooltipOptions = [{verticalAlign: 'middle'}, {align: 'center'}];
 
            return {
                position: currPosition,
                rotation: transform.rotation,
                cursorPoint: cursorPoint,
                tooltipOption: tooltipOptions[dimIndex]
            };
        }
 
    });
 
    function getCartesian(grid, axis) {
        var opt = {};
        opt[axis.dim + 'AxisIndex'] = axis.index;
        return grid.getCartesian(opt);
    }
 
    var pointerShapeBuilder = {
 
        line: function (axis, pixelValue, otherExtent, elStyle) {
            var targetShape = viewHelper.makeLineShape(
                [pixelValue, otherExtent[0]],
                [pixelValue, otherExtent[1]],
                getAxisDimIndex(axis)
            );
            graphic.subPixelOptimizeLine({
                shape: targetShape,
                style: elStyle
            });
            return {
                type: 'Line',
                shape: targetShape
            };
        },
 
        shadow: function (axis, pixelValue, otherExtent, elStyle) {
            var bandWidth = axis.getBandWidth();
            var span = otherExtent[1] - otherExtent[0];
            return {
                type: 'Rect',
                shape: viewHelper.makeRectShape(
                    [pixelValue - bandWidth / 2, otherExtent[0]],
                    [bandWidth, span],
                    getAxisDimIndex(axis)
                )
            };
        }
    };
 
    function getAxisDimIndex(axis) {
        return axis.dim === 'x' ? 0 : 1;
    }
 
    AxisView.registerAxisPointerClass('CartesianAxisPointer', CartesianAxisPointer);
 
    module.exports = CartesianAxisPointer;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/PolarAxisPointer.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/PolarAxisPointer.js

Statements: 20.69% (12 / 58)      Branches: 0% (0 / 22)      Functions: 0% (0 / 4)      Lines: 20.69% (12 / 58)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145      1 1 1 1 1 1 1   1                                                                             1                                                                                   1                                                                                               1   1    
'use strict';
 
 
    var formatUtil = require('../../util/format');
    var BaseAxisPointer = require('./BaseAxisPointer');
    var graphic = require('../../util/graphic');
    var viewHelper = require('./viewHelper');
    var matrix = require('zrender/lib/core/matrix');
    var AxisBuilder = require('../axis/AxisBuilder');
    var AxisView = require('../axis/AxisView');
 
    var PolarAxisPointer = BaseAxisPointer.extend({
 
        /**
         * @override
         */
        makeElOption: function (elOption, value, axisModel, axisPointerModel, api) {
            var axis = axisModel.axis;
 
            if (axis.dim === 'angle') {
                this.animationThreshold = Math.PI / 18;
            }
 
            var polar = axis.polar;
            var otherAxis = polar.getOtherAxis(axis);
            var otherExtent = otherAxis.getExtent();
 
            var coordValue;
            coordValue = axis['dataTo' + formatUtil.capitalFirst(axis.dim)](value);
 
            var axisPointerType = axisPointerModel.get('type');
            if (axisPointerType && axisPointerType !== 'none') {
                var elStyle = viewHelper.buildElStyle(axisPointerModel);
                var pointerOption = pointerShapeBuilder[axisPointerType](
                    axis, polar, coordValue, otherExtent, elStyle
                );
                pointerOption.style = elStyle;
                elOption.graphicKey = pointerOption.type;
                elOption.pointer = pointerOption;
            }
 
            var labelMargin = axisPointerModel.get('label.margin');
            var labelPos = getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin);
            viewHelper.buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos);
        }
 
        // Do not support handle, utill any user requires it.
 
    });
 
    function getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin) {
        var axis = axisModel.axis;
        var coord = axis.dataToCoord(value);
        var axisAngle = polar.getAngleAxis().getExtent()[0];
        axisAngle = axisAngle / 180 * Math.PI;
        var radiusExtent = polar.getRadiusAxis().getExtent();
        var position;
        var align;
        var verticalAlign;
 
        if (axis.dim === 'radius') {
            var transform = matrix.create();
            matrix.rotate(transform, transform, axisAngle);
            matrix.translate(transform, transform, [polar.cx, polar.cy]);
            position = graphic.applyTransform([coord, -labelMargin], transform);
 
            var labelRotation = axisModel.getModel('axisLabel').get('rotate') || 0;
            var labelLayout = AxisBuilder.innerTextLayout(
                axisAngle, labelRotation * Math.PI / 180, -1
            );
            align = labelLayout.textAlign;
            verticalAlign = labelLayout.textVerticalAlign;
        }
        else { // angle axis
            var r = radiusExtent[1];
            position = polar.coordToPoint([r + labelMargin, coord]);
            var cx = polar.cx;
            var cy = polar.cy;
            align = Math.abs(position[0] - cx) / r < 0.3
                ? 'center' : (position[0] > cx ? 'left' : 'right');
            verticalAlign = Math.abs(position[1] - cy) / r < 0.3
                ? 'middle' : (position[1] > cy ? 'top' : 'bottom');
        }
 
        return {
            position: position,
            align: align,
            verticalAlign: verticalAlign
        };
    }
 
 
    var pointerShapeBuilder = {
 
        line: function (axis, polar, coordValue, otherExtent, elStyle) {
            return axis.dim === 'angle'
                ? {
                    type: 'Line',
                    shape: viewHelper.makeLineShape(
                        polar.coordToPoint([otherExtent[0], coordValue]),
                        polar.coordToPoint([otherExtent[1], coordValue])
                    )
                }
                : {
                    type: 'Circle',
                    shape: {
                        cx: polar.cx,
                        cy: polar.cy,
                        r: coordValue
                    }
                };
        },
 
        shadow: function (axis, polar, coordValue, otherExtent, elStyle) {
            var bandWidth = axis.getBandWidth();
            var radian = Math.PI / 180;
 
            return axis.dim === 'angle'
                ? {
                    type: 'Sector',
                    shape: viewHelper.makeSectorShape(
                        polar.cx, polar.cy,
                        otherExtent[0], otherExtent[1],
                        // In ECharts y is negative if angle is positive
                        (-coordValue - bandWidth / 2) * radian,
                        (-coordValue + bandWidth / 2) * radian
                    )
                }
                : {
                    type: 'Sector',
                    shape: viewHelper.makeSectorShape(
                        polar.cx, polar.cy,
                        coordValue - bandWidth / 2,
                        coordValue + bandWidth / 2,
                        0, Math.PI * 2
                    )
                };
        }
    };
 
    AxisView.registerAxisPointerClass('PolarAxisPointer', PolarAxisPointer);
 
    module.exports = PolarAxisPointer;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/SingleAxisPointer.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/SingleAxisPointer.js

Statements: 25.49% (13 / 51)      Branches: 0% (0 / 8)      Functions: 0% (0 / 7)      Lines: 25.49% (13 / 51)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127      1 1 1 1 1   1 1   1                                                                                                                                         1                                                               1       1         1   1    
'use strict';
 
 
    var graphic = require('../../util/graphic');
    var BaseAxisPointer = require('./BaseAxisPointer');
    var viewHelper = require('./viewHelper');
    var singleAxisHelper = require('../axis/singleAxisHelper');
    var AxisView = require('../axis/AxisView');
 
    var XY = ['x', 'y'];
    var WH = ['width', 'height'];
 
    var SingleAxisPointer = BaseAxisPointer.extend({
 
        /**
         * @override
         */
        makeElOption: function (elOption, value, axisModel, axisPointerModel, api) {
            var axis = axisModel.axis;
            var coordSys = axis.coordinateSystem;
            var otherExtent = getGlobalExtent(coordSys, 1 - getPointDimIndex(axis));
            var pixelValue = coordSys.dataToPoint(value)[0];
 
            var axisPointerType = axisPointerModel.get('type');
            if (axisPointerType && axisPointerType !== 'none') {
                var elStyle = viewHelper.buildElStyle(axisPointerModel);
                var pointerOption = pointerShapeBuilder[axisPointerType](
                    axis, pixelValue, otherExtent, elStyle
                );
                pointerOption.style = elStyle;
 
                elOption.graphicKey = pointerOption.type;
                elOption.pointer = pointerOption;
            }
 
            var layoutInfo = singleAxisHelper.layout(axisModel);
            viewHelper.buildCartesianSingleLabelElOption(
                value, elOption, layoutInfo, axisModel, axisPointerModel, api
            );
        },
 
        /**
         * @override
         */
        getHandleTransform: function (value, axisModel, axisPointerModel) {
            var layoutInfo = singleAxisHelper.layout(axisModel, {labelInside: false});
            layoutInfo.labelMargin = axisPointerModel.get('handle.margin');
            return {
                position: viewHelper.getTransformedPosition(axisModel.axis, value, layoutInfo),
                rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0)
            };
        },
 
        /**
         * @override
         */
        updateHandleTransform: function (transform, delta, axisModel, axisPointerModel) {
            var axis = axisModel.axis;
            var coordSys = axis.coordinateSystem;
            var dimIndex = getPointDimIndex(axis);
            var axisExtent = getGlobalExtent(coordSys, dimIndex);
            var currPosition = transform.position;
            currPosition[dimIndex] += delta[dimIndex];
            currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]);
            currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]);
            var otherExtent = getGlobalExtent(coordSys, 1 - dimIndex);
            var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2;
            var cursorPoint = [cursorOtherValue, cursorOtherValue];
            cursorPoint[dimIndex] = currPosition[dimIndex];
 
            return {
                position: currPosition,
                rotation: transform.rotation,
                cursorPoint: cursorPoint,
                tooltipOption: {
                    verticalAlign: 'middle'
                }
            };
        }
    });
 
    var pointerShapeBuilder = {
 
        line: function (axis, pixelValue, otherExtent, elStyle) {
            var targetShape = viewHelper.makeLineShape(
                [pixelValue, otherExtent[0]],
                [pixelValue, otherExtent[1]],
                getPointDimIndex(axis)
            );
            graphic.subPixelOptimizeLine({
                shape: targetShape,
                style: elStyle
            });
            return {
                type: 'Line',
                shape: targetShape
            };
        },
 
        shadow: function (axis, pixelValue, otherExtent, elStyle) {
            var bandWidth = axis.getBandWidth();
            var span = otherExtent[1] - otherExtent[0];
            return {
                type: 'Rect',
                shape: viewHelper.makeRectShape(
                    [pixelValue - bandWidth / 2, otherExtent[0]],
                    [bandWidth, span],
                    getPointDimIndex(axis)
                )
            };
        }
    };
 
    function getPointDimIndex(axis) {
        return axis.isHorizontal() ? 0 : 1;
    }
 
    function getGlobalExtent(coordSys, dimIndex) {
        var rect = coordSys.getRect();
        return [rect[XY[dimIndex]], rect[XY[dimIndex]] + rect[WH[dimIndex]]];
    }
 
    AxisView.registerAxisPointerClass('SingleAxisPointer', SingleAxisPointer);
 
    module.exports = SingleAxisPointer;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/axisTrigger.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/axisTrigger.js

Statements: 12.66% (20 / 158)      Branches: 0% (0 / 101)      Functions: 0% (0 / 25)      Lines: 12.66% (20 / 158)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373    1 1 1 1   1 1 1                                   1                                                                                                                                           1                                                                           1                                                                                                                           1       1                                                                                       1       1                                           1                                                   1                                                                                   1                                 1                   1       1    
 
 
    var zrUtil = require('zrender/lib/core/util');
    var modelUtil = require('../../util/model');
    var modelHelper = require('./modelHelper');
    var findPointFromSeries = require('./findPointFromSeries');
 
    var each = zrUtil.each;
    var curry = zrUtil.curry;
    var get = modelUtil.makeGetter();
 
    /**
     * Basic logic: check all axis, if they do not demand show/highlight,
     * then hide/downplay them.
     *
     * @param {Object} coordSysAxesInfo
     * @param {string} [currTrigger] 'click' | 'mousemove' | 'leave'
     * @param {Array.<number>} [point] x and y, which are mandatory, specify a point to
     *              tigger axisPointer and tooltip.
     * @param {Object} [finder] {xAxisId: ...[], yAxisName: ...[], angleAxisIndex: ...[]}
     *              These properties, which are optional, restrict target axes.
     * @param {Function} dispatchAction
     * @param {module:echarts/ExtensionAPI} api
     * @param {Object} [tooltipOption]
     * @param {string} [highDownKey]
     * @return {Object} content of event obj for echarts.connect.
     */
    function axisTrigger(
        coordSysAxesInfo, currTrigger, point, finder, dispatchAction,
        ecModel, api, tooltipOption, highDownKey
    ) {
        finder = finder || {};
        if (!point || point[0] == null || point[1] == null) {
            point = findPointFromSeries({
                seriesIndex: finder.seriesIndex,
                // Do not use dataIndexInside from other ec instance.
                // FIXME: auto detect it?
                dataIndex: finder.dataIndex
            }, ecModel).point;
        }
 
        var axesInfo = coordSysAxesInfo.axesInfo;
        var shouldHide = currTrigger === 'leave' || illegalPoint(point);
        var outputFinder = {};
 
        var showValueMap = {};
        var dataByCoordSys = {list: [], map: {}};
        var highlightBatch = [];
        var updaters = {
            showPointer: curry(showPointer, showValueMap),
            showTooltip: curry(showTooltip, dataByCoordSys),
            highlight: curry(highlight, highlightBatch)
        };
 
        // Process for triggered axes.
        each(coordSysAxesInfo.coordSysMap, function (coordSys, coordSysKey) {
            var coordSysContainsPoint = coordSys.containPoint(point);
 
            each(coordSysAxesInfo.coordSysAxesInfo[coordSysKey], function (axisInfo, key) {
                var axis = axisInfo.axis;
                if (!shouldHide && coordSysContainsPoint && !notTargetAxis(finder, axis)) {
                    processOnAxis(axisInfo, axis.pointToData(point), updaters, false, outputFinder);
                }
            });
        });
 
        // Process for linked axes.
        var linkTriggers = {};
        each(axesInfo, function (tarAxisInfo, tarKey) {
            var linkGroup = tarAxisInfo.linkGroup;
 
            // If axis has been triggered in the previous stage, it should not be triggered by link.
            if (linkGroup && !showValueMap[tarKey]) {
                each(linkGroup.axesInfo, function (srcAxisInfo, srcKey) {
                    var srcValItem = showValueMap[srcKey];
                    // If srcValItem exist, source axis is triggered, so link to target axis.
                    if (srcAxisInfo !== tarAxisInfo && srcValItem) {
                        var val = srcValItem.value;
                        linkGroup.mapper && (val = tarAxisInfo.axis.scale.parse(linkGroup.mapper(
                            val, makeMapperParam(srcAxisInfo), makeMapperParam(tarAxisInfo)
                        )));
                        linkTriggers[tarAxisInfo.key] = val;
                    }
                });
            }
        });
        each(linkTriggers, function (val, tarKey) {
            processOnAxis(axesInfo[tarKey], val, updaters, true, outputFinder);
        });
 
        updateModelActually(showValueMap, axesInfo);
        dispatchTooltipActually(dataByCoordSys, point, tooltipOption, dispatchAction);
        dispatchHighDownActually(highlightBatch, dispatchAction, api, highDownKey);
 
        return outputFinder;
    }
 
    function processOnAxis(axisInfo, newValue, updaters, dontSnap, outputFinder) {
        var axis = axisInfo.axis;
 
        if (axis.scale.isBlank() || !axis.containData(newValue)) {
            return;
        }
 
        if (!axisInfo.involveSeries) {
            updaters.showPointer(axisInfo, newValue);
            return;
        }
 
        // Heavy calculation. So put it after axis.containData checking.
        var payloadInfo = buildPayloadsBySeries(newValue, axisInfo);
        var payloadBatch = payloadInfo.payloadBatch;
        var snapToValue = payloadInfo.snapToValue;
 
        // Fill content of event obj for echarts.connect.
        // By defualt use the first involved series data as a sample to connect.
        if (payloadBatch[0] && outputFinder.seriesIndex == null) {
            zrUtil.extend(outputFinder, payloadBatch[0]);
        }
 
        // If no linkSource input, this process is for collecting link
        // target, where snap should not be accepted.
        if (!dontSnap && axisInfo.snap) {
            if (axis.containData(snapToValue) && snapToValue != null) {
                newValue = snapToValue;
            }
        }
 
        updaters.highlight('highlight', payloadBatch);
        updaters.showPointer(axisInfo, newValue, payloadBatch);
        // Tooltip should always be snapToValue, otherwise there will be
        // incorrect "axis value ~ series value" mapping displayed in tooltip.
        updaters.showTooltip(axisInfo, payloadInfo, snapToValue);
    }
 
    function buildPayloadsBySeries(value, axisInfo) {
        var axis = axisInfo.axis;
        var dim = axis.dim;
        var snapToValue = value;
        var payloadBatch = [];
        var minDist = Number.MAX_VALUE;
        var minDiff = -1;
 
        each(axisInfo.seriesModels, function (series, idx) {
            var dataDim = series.coordDimToDataDim(dim);
            var seriesNestestValue;
            var dataIndices;
 
            if (series.getAxisTooltipData) {
                var result = series.getAxisTooltipData(dataDim, value, axis);
                dataIndices = result.dataIndices;
                seriesNestestValue = result.nestestValue;
            }
            else {
                dataIndices = series.getData().indicesOfNearest(
                    dataDim[0],
                    value,
                    // Add a threshold to avoid find the wrong dataIndex
                    // when data length is not same.
                    false, axis.type === 'category' ? 0.5 : null
                );
                if (!dataIndices.length) {
                    return;
                }
                seriesNestestValue = series.getData().get(dataDim[0], dataIndices[0]);
            }
 
            if (seriesNestestValue == null || !isFinite(seriesNestestValue)) {
                return;
            }
 
            var diff = value - seriesNestestValue;
            var dist = Math.abs(diff);
            // Consider category case
            if (dist <= minDist) {
                if (dist < minDist || (diff >= 0 && minDiff < 0)) {
                    minDist = dist;
                    minDiff = diff;
                    snapToValue = seriesNestestValue;
                    payloadBatch.length = 0;
                }
                each(dataIndices, function (dataIndex) {
                    payloadBatch.push({
                        seriesIndex: series.seriesIndex,
                        dataIndexInside: dataIndex,
                        dataIndex: series.getData().getRawIndex(dataIndex)
                    });
                });
            }
        });
 
        return {
            payloadBatch: payloadBatch,
            snapToValue: snapToValue
        };
    }
 
    function showPointer(showValueMap, axisInfo, value, payloadBatch) {
        showValueMap[axisInfo.key] = {value: value, payloadBatch: payloadBatch};
    }
 
    function showTooltip(dataByCoordSys, axisInfo, payloadInfo, value) {
        var payloadBatch = payloadInfo.payloadBatch;
        var axis = axisInfo.axis;
        var axisModel = axis.model;
        var axisPointerModel = axisInfo.axisPointerModel;
 
        // If no data, do not create anything in dataByCoordSys,
        // whose length will be used to judge whether dispatch action.
        if (!axisInfo.triggerTooltip || !payloadBatch.length) {
            return;
        }
 
        var coordSysModel = axisInfo.coordSys.model;
        var coordSysKey = modelHelper.makeKey(coordSysModel);
        var coordSysItem = dataByCoordSys.map[coordSysKey];
        if (!coordSysItem) {
            coordSysItem = dataByCoordSys.map[coordSysKey] = {
                coordSysId: coordSysModel.id,
                coordSysIndex: coordSysModel.componentIndex,
                coordSysType: coordSysModel.type,
                coordSysMainType: coordSysModel.mainType,
                dataByAxis: []
            };
            dataByCoordSys.list.push(coordSysItem);
        }
 
        coordSysItem.dataByAxis.push({
            axisDim: axis.dim,
            axisIndex: axisModel.componentIndex,
            axisType: axisModel.type,
            axisId: axisModel.id,
            value: value,
            // Caustion: viewHelper.getValueLabel is actually on "view stage", which
            // depends that all models have been updated. So it should not be performed
            // here. Considering axisPointerModel used here is volatile, which is hard
            // to be retrieve in TooltipView, we prepare parameters here.
            valueLabelOpt: {
                precision: axisPointerModel.get('label.precision'),
                formatter: axisPointerModel.get('label.formatter')
            },
            seriesDataIndices: payloadBatch.slice()
        });
    }
 
    function highlight(highlightBatch, actionType, batch) {
        highlightBatch.push.apply(highlightBatch, batch);
    }
 
    function updateModelActually(showValueMap, axesInfo) {
        // Basic logic: If no 'show' required, 'hide' this axisPointer.
        each(axesInfo, function (axisInfo, key) {
            var option = axisInfo.axisPointerModel.option;
            var valItem = showValueMap[key];
 
            if (valItem) {
                !axisInfo.useHandle && (option.status = 'show');
                option.value = valItem.value;
                // For label formatter param.
                option.seriesDataIndices = (valItem.payloadBatch || []).slice();
            }
            // When always show (e.g., handle used), remain
            // original value and status.
            else {
                // If hide, value still need to be set, consider
                // click legend to toggle axis blank.
                !axisInfo.useHandle && (option.status = 'hide');
            }
        });
    }
 
    function dispatchTooltipActually(dataByCoordSys, point, tooltipOption, dispatchAction) {
        // Basic logic: If no showTip required, hideTip will be dispatched.
        if (illegalPoint(point) || !dataByCoordSys.list.length) {
            dispatchAction({type: 'hideTip'});
            return;
        }
 
        // In most case only one axis (or event one series is used). It is
        // convinient to fetch payload.seriesIndex and payload.dataIndex
        // dirtectly. So put the first seriesIndex and dataIndex of the first
        // axis on the payload.
        var sampleItem = ((dataByCoordSys.list[0].dataByAxis[0] || {}).seriesDataIndices || [])[0] || {};
 
        dispatchAction({
            type: 'showTip',
            escapeConnect: true,
            x: point[0],
            y: point[1],
            tooltipOption: tooltipOption,
            dataIndexInside: sampleItem.dataIndexInside,
            dataIndex: sampleItem.dataIndex,
            seriesIndex: sampleItem.seriesIndex,
            dataByCoordSys: dataByCoordSys.list
        });
    }
 
    function dispatchHighDownActually(highlightBatch, dispatchAction, api, highDownKey) {
        // Basic logic: If nothing highlighted, should downplay all highlighted items.
        // This case will occur when mouse leave coordSys.
 
        // FIXME
        // (1) highlight status shoule be managemented in series.getData()?
        // (2) If axisPointer A triggerOn 'handle' and axisPointer B triggerOn
        // 'mousemove', items highlighted by A will be downplayed by B.
        // It will not be fixed until someone requires this scenario.
 
        // Consider items area hightlighted by 'handle', and globalListener may
        // downplay all items (including just highlighted ones) when mousemove.
        // So we use a highDownKey to separate them as a temporary solution.
        var zr = api.getZr();
        highDownKey = 'lastHighlights' + (highDownKey || '');
        var lastHighlights = get(zr)[highDownKey] || {};
        var newHighlights = get(zr)[highDownKey] = {};
 
        // Build hash map and remove duplicate incidentally.
        zrUtil.each(highlightBatch, function (batchItem) {
            var key = batchItem.seriesIndex + ' | ' + batchItem.dataIndex;
            newHighlights[key] = batchItem;
        });
 
        // Diff.
        var toHighlight = [];
        var toDownplay = [];
        zrUtil.each(lastHighlights, function (batchItem, key) {
            !newHighlights[key] && toDownplay.push(batchItem);
        });
        zrUtil.each(newHighlights, function (batchItem, key) {
            !lastHighlights[key] && toHighlight.push(batchItem);
        });
 
        toDownplay.length && api.dispatchAction({
            type: 'downplay', escapeConnect: true, batch: toDownplay
        });
        toHighlight.length && api.dispatchAction({
            type: 'highlight', escapeConnect: true, batch: toHighlight
        });
    }
 
    function notTargetAxis(finder, axis) {
        var isTarget = 1;
        // If none of xxxAxisId and xxxAxisName and xxxAxisIndex exists in finder,
        // no axis is not target axis.
        each(finder, function (value, propName) {
            isTarget &= !(/^.+(AxisId|AxisName|AxisIndex)$/.test(propName));
        });
        !isTarget && each(
            [['AxisId', 'id'], ['AxisIndex', 'componentIndex'], ['AxisName', 'name']],
            function (prop) {
                var vals = modelUtil.normalizeToArray(finder[axis.dim + prop[0]]);
                isTarget |= zrUtil.indexOf(vals, axis.model[prop[1]]) >= 0;
            }
        );
        return !isTarget;
    }
 
    function makeMapperParam(axisInfo) {
        var axisModel = axisInfo.axis.model;
        var item = {};
        var dim = item.axisDim = axisInfo.axis.dim;
        item.axisIndex = item[dim + 'AxisIndex'] = axisModel.componentIndex;
        item.axisName = item[dim + 'AxisName'] = axisModel.name;
        item.axisId = item[dim + 'AxisId'] = axisModel.id;
        return item;
    }
 
    function illegalPoint(point) {
        return point[0] == null || isNaN(point[0]) || point[1] == null || isNaN(point[1]);
    }
 
    module.exports = axisTrigger;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/findPointFromSeries.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/findPointFromSeries.js

Statements: 12.5% (3 / 24)      Branches: 0% (0 / 20)      Functions: 0% (0 / 2)      Lines: 12.5% (3 / 24)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57    1 1             1                                                                                            
 
 
    var zrUtil = require('zrender/lib/core/util');
    var modelUtil = require('../../util/model');
 
    /**
     * @param {Object} finder contains {seriesIndex, dataIndex, dataIndexInside}
     * @param {module:echarts/model/Global} ecModel
     * @return {Object} {point: [x, y], el: ...} point Will not be null.
     */
    module.exports = function (finder, ecModel) {
        var point = [];
        var seriesIndex = finder.seriesIndex;
        var seriesModel;
        if (seriesIndex == null || !(
            seriesModel = ecModel.getSeriesByIndex(seriesIndex)
        )) {
            return {point: []};
        }
 
        var data = seriesModel.getData();
        var dataIndex = modelUtil.queryDataIndex(data, finder);
        if (dataIndex == null || zrUtil.isArray(dataIndex)) {
            return {point: []};
        }
 
        var el = data.getItemGraphicEl(dataIndex);
        var coordSys = seriesModel.coordinateSystem;
 
        if (seriesModel.getTooltipPosition) {
            point = seriesModel.getTooltipPosition(dataIndex) || [];
        }
        else if (coordSys && coordSys.dataToPoint) {
            point = coordSys.dataToPoint(
                data.getValues(
                    zrUtil.map(coordSys.dimensions, function (dim) {
                        return seriesModel.coordDimToDataDim(dim)[0];
                    }), dataIndex, true
                )
            ) || [];
        }
        else if (el) {
            // Use graphic bounding rect
            var rect = el.getBoundingRect().clone();
            rect.applyTransform(el.transform);
            point = [
                rect.x + rect.width / 2,
                rect.y + rect.height / 2
            ];
        }
 
        return {point: point, el: el};
    };
 
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/globalListener.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/globalListener.js

Statements: 24.14% (14 / 58)      Branches: 0% (0 / 24)      Functions: 0% (0 / 11)      Lines: 24.14% (14 / 58)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126    1 1 1   1   1                 1                           1                       1                         1                                 1       1       1                                                             1                     1    
 
 
    var env = require('zrender/lib/core/env');
    var zrUtil = require('zrender/lib/core/util');
    var get = require('../../util/model').makeGetter();
 
    var each = zrUtil.each;
 
    var globalListener = {};
 
    /**
     * @param {string} key
     * @param {module:echarts/ExtensionAPI} api
     * @param {Function} handler
     *      param: {string} currTrigger
     *      param: {Array.<number>} point
     */
    globalListener.register = function (key, api, handler) {
        if (env.node) {
            return;
        }
 
        var zr = api.getZr();
        get(zr).records || (get(zr).records = {});
 
        initGlobalListeners(zr, api);
 
        var record = get(zr).records[key] || (get(zr).records[key] = {});
        record.handler = handler;
    };
 
    function initGlobalListeners(zr, api) {
        if (get(zr).initialized) {
            return;
        }
 
        get(zr).initialized = true;
 
        useHandler('click', zrUtil.curry(doEnter, 'click'));
        useHandler('mousemove', zrUtil.curry(doEnter, 'mousemove'));
        // useHandler('mouseout', onLeave);
        useHandler('globalout', onLeave);
 
        function useHandler(eventType, cb) {
            zr.on(eventType, function (e) {
                var dis = makeDispatchAction(api);
 
                each(get(zr).records, function (record) {
                    record && cb(record, e, dis.dispatchAction);
                });
 
                dispatchTooltipFinally(dis.pendings, api);
            });
        }
    }
 
    function dispatchTooltipFinally(pendings, api) {
        var showLen = pendings.showTip.length;
        var hideLen = pendings.hideTip.length;
 
        var actuallyPayload;
        if (showLen) {
            actuallyPayload = pendings.showTip[showLen - 1];
        }
        else if (hideLen) {
            actuallyPayload = pendings.hideTip[hideLen - 1];
        }
        if (actuallyPayload) {
            actuallyPayload.dispatchAction = null;
            api.dispatchAction(actuallyPayload);
        }
    }
 
    function onLeave(record, e, dispatchAction) {
        record.handler('leave', null, dispatchAction);
    }
 
    function doEnter(currTrigger, record, e, dispatchAction) {
        record.handler(currTrigger, e, dispatchAction);
    }
 
    function makeDispatchAction(api) {
        var pendings = {
            showTip: [],
            hideTip: []
        };
        // FIXME
        // better approach?
        // 'showTip' and 'hideTip' can be triggered by axisPointer and tooltip,
        // which may be conflict, (axisPointer call showTip but tooltip call hideTip);
        // So we have to add "final stage" to merge those dispatched actions.
        var dispatchAction = function (payload) {
            var pendingList = pendings[payload.type];
            if (pendingList) {
                pendingList.push(payload);
            }
            else {
                payload.dispatchAction = dispatchAction;
                api.dispatchAction(payload);
            }
        };
 
        return {
            dispatchAction: dispatchAction,
            pendings: pendings
        };
    }
 
    /**
     * @param {string} key
     * @param {module:echarts/ExtensionAPI} api
     */
    globalListener.unregister = function (key, api) {
        if (env.node) {
            return;
        }
        var zr = api.getZr();
        var record = (get(zr).records || {})[key];
        if (record) {
            get(zr).records[key] = null;
        }
    };
 
    module.exports = globalListener;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/modelHelper.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/modelHelper.js

Statements: 14.63% (18 / 123)      Branches: 0% (0 / 100)      Functions: 0% (0 / 16)      Lines: 14.63% (18 / 123)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332    1 1 1 1   1       1                                                                 1                                                                                                   1                                                                                                         1                                                                                                   1                                                                                   1                           1           1                                                                                             1         1         1               1       1      
 
 
    var zrUtil = require('zrender/lib/core/util');
    var Model = require('../../model/Model');
    var each = zrUtil.each;
    var curry = zrUtil.curry;
 
    var helper = {};
 
    // Build axisPointerModel, mergin tooltip.axisPointer model for each axis.
    // allAxesInfo should be updated when setOption performed.
    helper.collect = function (ecModel, api) {
        var result = {
            /**
             * key: makeKey(axis.model)
             * value: {
             *      axis,
             *      coordSys,
             *      axisPointerModel,
             *      triggerTooltip,
             *      involveSeries,
             *      snap,
             *      seriesModels,
             *      seriesDataCount
             * }
             */
            axesInfo: {},
            seriesInvolved: false,
            /**
             * key: makeKey(coordSys.model)
             * value: Object: key makeKey(axis.model), value: axisInfo
             */
            coordSysAxesInfo: {},
            coordSysMap: {}
        };
 
        collectAxesInfo(result, ecModel, api);
 
        // Check seriesInvolved for performance, in case too many series in some chart.
        result.seriesInvolved && collectSeriesInfo(result, ecModel);
 
        return result;
    };
 
    function collectAxesInfo(result, ecModel, api) {
        var globalTooltipModel = ecModel.getComponent('tooltip');
        var globalAxisPointerModel = ecModel.getComponent('axisPointer');
        // links can only be set on global.
        var linksOption = globalAxisPointerModel.get('link', true) || [];
        var linkGroups = [];
 
        // Collect axes info.
        each(api.getCoordinateSystems(), function (coordSys) {
            // Some coordinate system do not support axes, like geo.
            if (!coordSys.axisPointerEnabled) {
                return;
            }
 
            var coordSysKey = makeKey(coordSys.model);
            var axesInfoInCoordSys = result.coordSysAxesInfo[coordSysKey] = {};
            result.coordSysMap[coordSysKey] = coordSys;
 
            // Set tooltip (like 'cross') is a convienent way to show axisPointer
            // for user. So we enable seting tooltip on coordSys model.
            var coordSysModel = coordSys.model;
            var baseTooltipModel = coordSysModel.getModel('tooltip', globalTooltipModel);
 
            each(coordSys.getAxes(), curry(saveTooltipAxisInfo, false, null));
 
            // If axis tooltip used, choose tooltip axis for each coordSys.
            // Notice this case: coordSys is `grid` but not `cartesian2D` here.
            if (coordSys.getTooltipAxes
                && globalTooltipModel
                // If tooltip.showContent is set as false, tooltip will not
                // show but axisPointer will show as normal.
                && baseTooltipModel.get('show')
            ) {
                // Compatible with previous logic. But series.tooltip.trigger: 'axis'
                // or series.data[n].tooltip.trigger: 'axis' are not support any more.
                var triggerAxis = baseTooltipModel.get('trigger') === 'axis';
                var cross = baseTooltipModel.get('axisPointer.type') === 'cross';
                var tooltipAxes = coordSys.getTooltipAxes(baseTooltipModel.get('axisPointer.axis'));
                if (triggerAxis || cross) {
                    each(tooltipAxes.baseAxes, curry(
                        saveTooltipAxisInfo, cross ? 'cross' : true, triggerAxis
                    ));
                }
                if (cross) {
                    each(tooltipAxes.otherAxes, curry(saveTooltipAxisInfo, 'cross', false));
                }
            }
 
            // fromTooltip: true | false | 'cross'
            // triggerTooltip: true | false | null
            function saveTooltipAxisInfo(fromTooltip, triggerTooltip, axis) {
                var axisPointerModel = axis.model.getModel('axisPointer', globalAxisPointerModel);
 
                var axisPointerShow = axisPointerModel.get('show');
                if (!axisPointerShow || (
                    axisPointerShow === 'auto'
                    && !fromTooltip
                    && !isHandleTrigger(axisPointerModel)
                )) {
                    return;
                }
 
                if (triggerTooltip == null) {
                    triggerTooltip = axisPointerModel.get('triggerTooltip');
                }
 
                axisPointerModel = fromTooltip
                    ? makeAxisPointerModel(
                        axis, baseTooltipModel, globalAxisPointerModel, ecModel,
                        fromTooltip, triggerTooltip
                    )
                    : axisPointerModel;
 
                var snap = axisPointerModel.get('snap');
                var key = makeKey(axis.model);
                var involveSeries = triggerTooltip || snap || axis.type === 'category';
 
                // If result.axesInfo[key] exist, override it (tooltip has higher priority).
                var axisInfo = result.axesInfo[key] = {
                    key: key,
                    axis: axis,
                    coordSys: coordSys,
                    axisPointerModel: axisPointerModel,
                    triggerTooltip: triggerTooltip,
                    involveSeries: involveSeries,
                    snap: snap,
                    useHandle: isHandleTrigger(axisPointerModel),
                    seriesModels: []
                };
                axesInfoInCoordSys[key] = axisInfo;
                result.seriesInvolved |= involveSeries;
 
                var groupIndex = getLinkGroupIndex(linksOption, axis);
                if (groupIndex != null) {
                    var linkGroup = linkGroups[groupIndex] || (linkGroups[groupIndex] = {axesInfo: {}});
                    linkGroup.axesInfo[key] = axisInfo;
                    linkGroup.mapper = linksOption[groupIndex].mapper;
                    axisInfo.linkGroup = linkGroup;
                }
            }
        });
    }
 
    function makeAxisPointerModel(
        axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip
    ) {
        var tooltipAxisPointerModel = baseTooltipModel.getModel('axisPointer');
        var volatileOption = {};
 
        each(
            [
                'type', 'snap', 'lineStyle', 'shadowStyle', 'label',
                'animation', 'animationDurationUpdate', 'animationEasingUpdate', 'z'
            ],
            function (field) {
                volatileOption[field] = zrUtil.clone(tooltipAxisPointerModel.get(field));
            }
        );
 
        // category axis do not auto snap, otherwise some tick that do not
        // has value can not be hovered. value/time/log axis default snap if
        // triggered from tooltip and trigger tooltip.
        volatileOption.snap = axis.type !== 'category' && !!triggerTooltip;
 
        // Compatibel with previous behavior, tooltip axis do not show label by default.
        // Only these properties can be overrided from tooltip to axisPointer.
        if (tooltipAxisPointerModel.get('type') === 'cross') {
            volatileOption.type = 'line';
        }
        var labelOption = volatileOption.label || (volatileOption.label = {});
        // Follow the convention, do not show label when triggered by tooltip by default.
        labelOption.show == null && (labelOption.show = false);
 
        if (fromTooltip === 'cross') {
            // When 'cross', both axes show labels.
            labelOption.show = true;
            // If triggerTooltip, this is a base axis, which should better not use cross style
            // (cross style is dashed by default)
            if (!triggerTooltip) {
                var crossStyle = volatileOption.lineStyle = tooltipAxisPointerModel.get('crossStyle');
                crossStyle && zrUtil.defaults(
                    labelOption.textStyle || (labelOption.textStyle = {}),
                    crossStyle.textStyle
                );
            }
        }
 
        return axis.model.getModel(
            'axisPointer',
            new Model(volatileOption, globalAxisPointerModel, ecModel)
        );
    }
 
    function collectSeriesInfo(result, ecModel) {
        // Prepare data for axis trigger
        ecModel.eachSeries(function (seriesModel) {
 
            // Notice this case: this coordSys is `cartesian2D` but not `grid`.
            var coordSys = seriesModel.coordinateSystem;
            var seriesTooltipTrigger = seriesModel.get('tooltip.trigger', true);
            if (!coordSys
                || seriesTooltipTrigger === 'none'
                || seriesTooltipTrigger === false
                || seriesTooltipTrigger === 'item'
                || seriesModel.get('axisPointer.show', true) === false
            ) {
                return;
            }
 
            each(result.coordSysAxesInfo[makeKey(coordSys.model)], function (axisInfo) {
                var axis = axisInfo.axis;
                if (coordSys.getAxis(axis.dim) === axis) {
                    axisInfo.seriesModels.push(seriesModel);
                    axisInfo.seriesDataCount == null && (axisInfo.seriesDataCount = 0);
                    axisInfo.seriesDataCount += seriesModel.getData().count();
                }
            });
 
        }, this);
    }
 
    /**
     * For example:
     * {
     *     axisPointer: {
     *         links: [{
     *             xAxisIndex: [2, 4],
     *             yAxisIndex: 'all'
     *         }, {
     *             xAxisId: ['a5', 'a7'],
     *             xAxisName: 'xxx'
     *         }]
     *     }
     * }
     */
    function getLinkGroupIndex(linksOption, axis) {
        var axisModel = axis.model;
        var dim = axis.dim;
        for (var i = 0; i < linksOption.length; i++) {
            var linkOption = linksOption[i] || {};
            if (checkPropInLink(linkOption[dim + 'AxisId'], axisModel.id)
                || checkPropInLink(linkOption[dim + 'AxisIndex'], axisModel.componentIndex)
                || checkPropInLink(linkOption[dim + 'AxisName'], axisModel.name)
            ) {
                return i;
            }
        }
    }
 
    function checkPropInLink(linkPropValue, axisPropValue) {
        return linkPropValue === 'all'
            || (zrUtil.isArray(linkPropValue) && zrUtil.indexOf(linkPropValue, axisPropValue) >= 0)
            || linkPropValue === axisPropValue;
    }
 
    helper.fixValue = function (axisModel) {
        var axisInfo = helper.getAxisInfo(axisModel);
        if (!axisInfo) {
            return;
        }
 
        var axisPointerModel = axisInfo.axisPointerModel;
        var scale = axisInfo.axis.scale;
        var option = axisPointerModel.option;
        var status = axisPointerModel.get('status');
        var value = axisPointerModel.get('value');
 
        // Parse init value for category and time axis.
        if (value != null) {
            value = scale.parse(value);
        }
 
        var useHandle = isHandleTrigger(axisPointerModel);
        // If `handle` used, `axisPointer` will always be displayed, so value
        // and status should be initialized.
        if (status == null) {
            option.status = useHandle ? 'show' : 'hide';
        }
 
        var extent = scale.getExtent().slice();
        extent[0] > extent[1] && extent.reverse();
 
        if (// Pick a value on axis when initializing.
            value == null
            // If both `handle` and `dataZoom` are used, value may be out of axis extent,
            // where we should re-pick a value to keep `handle` displaying normally.
            || value > extent[1]
        ) {
            // Make handle displayed on the end of the axis when init, which looks better.
            value = extent[1];
        }
        if (value < extent[0]) {
            value = extent[0];
        }
 
        option.value = value;
 
        if (useHandle) {
            option.status = axisInfo.axis.scale.isBlank() ? 'hide' : 'show';
        }
    };
 
    helper.getAxisInfo = function (axisModel) {
        var coordSysAxesInfo = (axisModel.ecModel.getComponent('axisPointer') || {}).coordSysAxesInfo;
        return coordSysAxesInfo && coordSysAxesInfo.axesInfo[makeKey(axisModel)];
    };
 
    helper.getAxisPointerModel = function (axisModel) {
        var axisInfo = helper.getAxisInfo(axisModel);
        return axisInfo && axisInfo.axisPointerModel;
    };
 
    function isHandleTrigger(axisPointerModel) {
        return !!axisPointerModel.get('handle.show');
    }
 
    /**
     * @param {module:echarts/model/Model} model
     * @return {string} unique key
     */
    var makeKey = helper.makeKey = function (model) {
        return model.type + '||' + model.id;
    };
 
    module.exports = helper;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/viewHelper.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/axisPointer/viewHelper.js

Statements: 22.22% (18 / 81)      Branches: 0% (0 / 42)      Functions: 0% (0 / 10)      Lines: 22.22% (18 / 81)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222      1 1 1 1 1 1 1   1         1                                   1                                                                                                                         1                                   1                                                                           1                       1                                     1                             1                   1                       1    
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
    var graphic = require('../../util/graphic');
    var textContain = require('zrender/lib/contain/text');
    var formatUtil = require('../../util/format');
    var matrix = require('zrender/lib/core/matrix');
    var axisHelper = require('../../coord/axisHelper');
    var AxisBuilder = require('../axis/AxisBuilder');
 
    var helper = {};
 
    /**
     * @param {module:echarts/model/Model} axisPointerModel
     */
    helper.buildElStyle = function (axisPointerModel) {
        var axisPointerType = axisPointerModel.get('type');
        var styleModel = axisPointerModel.getModel(axisPointerType + 'Style');
        var style;
        if (axisPointerType === 'line') {
            style = styleModel.getLineStyle();
            style.fill = null;
        }
        else if (axisPointerType === 'shadow') {
            style = styleModel.getAreaStyle();
            style.stroke = null;
        }
        return style;
    };
 
    /**
     * @param {Function} labelPos {align, verticalAlign, position}
     */
    helper.buildLabelElOption = function (
        elOption, axisModel, axisPointerModel, api, labelPos
    ) {
        var value = axisPointerModel.get('value');
        var text = helper.getValueLabel(
            value, axisModel.axis, axisModel.ecModel,
            axisPointerModel.get('seriesDataIndices'),
            {
                precision: axisPointerModel.get('label.precision'),
                formatter: axisPointerModel.get('label.formatter')
            }
        );
        var labelModel = axisPointerModel.getModel('label');
        var textStyleModel = labelModel.getModel('textStyle');
        var paddings = formatUtil.normalizeCssArray(labelModel.get('padding') || 0);
 
        var font = textStyleModel.getFont();
        var textRect = textContain.getBoundingRect(
            text, font, labelPos.textAlign, labelPos.textBaseline
        );
 
        var position = labelPos.position;
        var width = textRect.width + paddings[1] + paddings[3];
        var height = textRect.height + paddings[0] + paddings[2];
 
        // Adjust by align.
        var align = labelPos.align;
        align === 'right' && (position[0] -= width);
        align === 'center' && (position[0] -= width / 2);
        var verticalAlign = labelPos.verticalAlign;
        verticalAlign === 'bottom' && (position[1] -= height);
        verticalAlign === 'middle' && (position[1] -= height / 2);
 
        // Not overflow ec container
        confineInContainer(position, width, height, api);
 
        var bgColor = labelModel.get('backgroundColor');
        if (!bgColor || bgColor === 'auto') {
            bgColor = axisModel.get('axisLine.lineStyle.color');
        }
 
        elOption.label = {
            shape: {x: 0, y: 0, width: width, height: height, r: labelModel.get('borderRadius')},
            position: position.slice(),
            style: {
                text: text,
                textFont: font,
                textFill: textStyleModel.getTextColor(),
                textPosition: 'inside',
                fill: bgColor,
                stroke: labelModel.get('borderColor') || 'transparent',
                lineWidth: labelModel.get('borderWidth') || 0,
                shadowBlur: labelModel.get('shadowBlur'),
                shadowColor: labelModel.get('shadowColor'),
                shadowOffsetX: labelModel.get('shadowOffsetX'),
                shadowOffsetY: labelModel.get('shadowOffsetY')
            }
        };
    };
 
    // Do not overflow ec container
    function confineInContainer(position, width, height, api) {
        var viewWidth = api.getWidth();
        var viewHeight = api.getHeight();
        position[0] = Math.min(position[0] + width, viewWidth) - width;
        position[1] = Math.min(position[1] + height, viewHeight) - height;
        position[0] = Math.max(position[0], 0);
        position[1] = Math.max(position[1], 0);
    }
 
    /**
     * @param {number} value
     * @param {module:echarts/coord/Axis} axis
     * @param {module:echarts/model/Global} ecModel
     * @param {Object} opt
     * @param {Array.<Object>} seriesDataIndices
     * @param {number|string} opt.precision 'auto' or a number
     * @param {string|Function} opt.formatter label formatter
     */
    helper.getValueLabel = function (value, axis, ecModel, seriesDataIndices, opt) {
        var text = axis.scale.getLabel(
            // If `precision` is set, width can be fixed (like '12.00500'), which
            // helps to debounce when when moving label.
            value, {precision: opt.precision}
        );
        var formatter = opt.formatter;
 
        if (formatter) {
            var params = {
                value: axisHelper.getAxisRawValue(axis, value),
                seriesData: []
            };
            zrUtil.each(seriesDataIndices, function (idxItem) {
                var series = ecModel.getSeriesByIndex(idxItem.seriesIndex);
                var dataIndex = idxItem.dataIndexInside;
                var dataParams = series && series.getDataParams(dataIndex);
                dataParams && params.seriesData.push(dataParams);
            });
 
            if (zrUtil.isString(formatter)) {
                text = formatter.replace('{value}', text);
            }
            else if (zrUtil.isFunction(formatter)) {
                text = formatter(params);
            }
        }
 
        return text;
    };
 
    /**
     * @param {module:echarts/coord/Axis} axis
     * @param {number} value
     * @param {Object} layoutInfo {
     *  rotation, position, labelOffset, labelDirection, labelMargin
     * }
     */
    helper.getTransformedPosition = function (axis, value, layoutInfo) {
        var transform = matrix.create();
        matrix.rotate(transform, transform, layoutInfo.rotation);
        matrix.translate(transform, transform, layoutInfo.position);
 
        return graphic.applyTransform([
            axis.dataToCoord(value),
            (layoutInfo.labelOffset || 0)
                + (layoutInfo.labelDirection || 1) * (layoutInfo.labelMargin || 0)
        ], transform);
    };
 
    helper.buildCartesianSingleLabelElOption = function (
        value, elOption, layoutInfo, axisModel, axisPointerModel, api
    ) {
        var textLayout = AxisBuilder.innerTextLayout(
            layoutInfo.rotation, 0, layoutInfo.labelDirection
        );
        layoutInfo.labelMargin = axisPointerModel.get('label.margin');
        helper.buildLabelElOption(elOption, axisModel, axisPointerModel, api, {
            position: helper.getTransformedPosition(axisModel.axis, value, layoutInfo),
            align: textLayout.textAlign,
            verticalAlign: textLayout.textVerticalAlign
        });
    };
 
    /**
     * @param {Array.<number>} p1
     * @param {Array.<number>} p2
     * @param {number} [xDimIndex=0] or 1
     */
    helper.makeLineShape = function (p1, p2, xDimIndex) {
        xDimIndex = xDimIndex || 0;
        return {
            x1: p1[xDimIndex],
            y1: p1[1 - xDimIndex],
            x2: p2[xDimIndex],
            y2: p2[1 - xDimIndex]
        };
    };
 
    /**
     * @param {Array.<number>} xy
     * @param {Array.<number>} wh
     * @param {number} [xDimIndex=0] or 1
     */
    helper.makeRectShape = function (xy, wh, xDimIndex) {
        xDimIndex = xDimIndex || 0;
        return {
            x: xy[xDimIndex],
            y: xy[1 - xDimIndex],
            width: wh[xDimIndex],
            height: wh[1 - xDimIndex]
        };
    };
 
    helper.makeSectorShape = function (cx, cy, r0, r, startAngle, endAngle) {
        return {
            cx: cx,
            cy: cy,
            r0: r0,
            r: r,
            startAngle: startAngle,
            endAngle: endAngle,
            clockwise: true
        };
    };
 
    module.exports = helper;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/brush/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/brush/

Statements: 22.31% (58 / 260)      Branches: 0% (0 / 152)      Functions: 1.59% (1 / 63)      Lines: 22.31% (58 / 260)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/component/brush/
File Statements Branches Functions Lines
BrushModel.js 34.78% (8 / 23) 0% (0 / 10) 0% (0 / 6) 34.78% (8 / 23)
BrushView.js 31.25% (5 / 16) 0% (0 / 6) 0% (0 / 5) 31.25% (5 / 16)
brushAction.js 60% (3 / 5) 100% (0 / 0) 0% (0 / 3) 60% (3 / 5)
preprocessor.js 12.12% (4 / 33) 0% (0 / 28) 0% (0 / 5) 12.12% (4 / 33)
selector.js 25.49% (13 / 51) 0% (0 / 37) 8.33% (1 / 12) 25.49% (13 / 51)
visualEncoding.js 18.94% (25 / 132) 0% (0 / 71) 0% (0 / 32) 18.94% (25 / 132)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/brush/BrushModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/brush/BrushModel.js

Statements: 34.78% (8 / 23)      Branches: 0% (0 / 10)      Functions: 0% (0 / 6)      Lines: 34.78% (8 / 23)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148          1 1 1 1   1   1                                                                                                                                                                                                                                         1                             1      
/**
 * @file Brush model
 */
 
 
    var echarts = require('../../echarts');
    var zrUtil = require('zrender/lib/core/util');
    var visualSolution = require('../../visual/visualSolution');
    var Model = require('../../model/Model');
 
    var DEFAULT_OUT_OF_BRUSH_COLOR = ['#ddd'];
 
    var BrushModel = echarts.extendComponentModel({
 
        type: 'brush',
 
        dependencies: ['geo', 'grid', 'xAxis', 'yAxis', 'parallel', 'series'],
 
        /**
         * @protected
         */
        defaultOption: {
            // inBrush: null,
            // outOfBrush: null,
            toolbox: null,          // Default value see preprocessor.
            brushLink: null,        // Series indices array, broadcast using dataIndex.
                                    // or 'all', which means all series. 'none' or null means no series.
            seriesIndex: 'all',     // seriesIndex array, specify series controlled by this brush component.
            geoIndex: null,         //
            xAxisIndex: null,
            yAxisIndex: null,
 
            brushType: 'rect',      // Default brushType, see BrushController.
            brushMode: 'single',    // Default brushMode, 'single' or 'multiple'
            transformable: true,    // Default transformable.
            brushStyle: {           // Default brushStyle
                borderWidth: 1,
                color: 'rgba(120,140,180,0.3)',
                borderColor: 'rgba(120,140,180,0.8)'
            },
 
            throttleType: 'fixRate',// Throttle in brushSelected event. 'fixRate' or 'debounce'.
                                    // If null, no throttle. Valid only in the first brush component
            throttleDelay: 0,       // Unit: ms, 0 means every event will be triggered.
 
            // FIXME
            // 试验效果
            removeOnClick: true,
 
            z: 10000
        },
 
        /**
         * @readOnly
         * @type {Array.<Object>}
         */
        areas: [],
 
        /**
         * Current activated brush type.
         * If null, brush is inactived.
         * see module:echarts/component/helper/BrushController
         * @readOnly
         * @type {string}
         */
        brushType: null,
 
        /**
         * Current brush opt.
         * see module:echarts/component/helper/BrushController
         * @readOnly
         * @type {Object}
         */
        brushOption: {},
 
        /**
         * @readOnly
         * @type {Array.<Object>}
         */
        coordInfoList: [],
 
        optionUpdated: function (newOption, isInit) {
            var thisOption = this.option;
 
            !isInit && visualSolution.replaceVisualOption(
                thisOption, newOption, ['inBrush', 'outOfBrush']
            );
 
            thisOption.inBrush = thisOption.inBrush || {};
            // Always give default visual, consider setOption at the second time.
            thisOption.outOfBrush = thisOption.outOfBrush || {color: DEFAULT_OUT_OF_BRUSH_COLOR};
        },
 
        /**
         * If ranges is null/undefined, range state remain.
         *
         * @param {Array.<Object>} [ranges]
         */
        setAreas: function (areas) {
            if (__DEV__) {
                zrUtil.assert(zrUtil.isArray(areas));
                zrUtil.each(areas, function (area) {
                    zrUtil.assert(area.brushType, 'Illegal areas');
                });
            }
 
            // If ranges is null/undefined, range state remain.
            // This helps user to dispatchAction({type: 'brush'}) with no areas
            // set but just want to get the current brush select info from a `brush` event.
            if (!areas) {
                return;
            }
 
            this.areas = zrUtil.map(areas, function (area) {
                return generateBrushOption(this.option, area);
            }, this);
        },
 
        /**
         * see module:echarts/component/helper/BrushController
         * @param {Object} brushOption
         */
        setBrushOption: function (brushOption) {
            this.brushOption = generateBrushOption(this.option, brushOption);
            this.brushType = this.brushOption.brushType;
        }
 
    });
 
    function generateBrushOption(option, brushOption) {
        return zrUtil.merge(
            {
                brushType: option.brushType,
                brushMode: option.brushMode,
                transformable: option.transformable,
                brushStyle: new Model(option.brushStyle).getItemStyle(),
                removeOnClick: option.removeOnClick,
                z: option.z
            },
            brushOption,
            true
        );
    }
 
    module.exports = BrushModel;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/brush/BrushView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/brush/BrushView.js

Statements: 31.25% (5 / 16)      Branches: 0% (0 / 6)      Functions: 0% (0 / 5)      Lines: 31.25% (5 / 16)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101    1 1 1   1                                                                                                                                                                         1                  
 
 
    var zrUtil = require('zrender/lib/core/util');
    var BrushController = require('../helper/BrushController');
    var echarts = require('../../echarts');
 
    module.exports = echarts.extendComponentView({
 
        type: 'brush',
 
        init: function (ecModel, api) {
 
            /**
             * @readOnly
             * @type {module:echarts/model/Global}
             */
            this.ecModel = ecModel;
 
            /**
             * @readOnly
             * @type {module:echarts/ExtensionAPI}
             */
            this.api = api;
 
            /**
             * @readOnly
             * @type {module:echarts/component/brush/BrushModel}
             */
            this.model;
 
            /**
             * @private
             * @type {module:echarts/component/helper/BrushController}
             */
            (this._brushController = new BrushController(api.getZr()))
                .on('brush', zrUtil.bind(this._onBrush, this))
                .mount();
        },
 
        /**
         * @override
         */
        render: function (brushModel) {
            this.model = brushModel;
            return updateController.apply(this, arguments);
        },
 
        /**
         * @override
         */
        updateView: updateController,
 
        /**
         * @override
         */
        updateLayout: updateController,
 
        /**
         * @override
         */
        updateVisual: updateController,
 
        /**
         * @override
         */
        dispose: function () {
            this._brushController.dispose();
        },
 
        /**
         * @private
         */
        _onBrush: function (areas, opt) {
            var modelId = this.model.id;
 
            this.model.brushTargetManager.setOutputRanges(areas, this.ecModel);
 
            // Action is not dispatched on drag end, because the drag end
            // emits the same params with the last drag move event, and
            // may have some delay when using touch pad, which makes
            // animation not smooth (when using debounce).
            (!opt.isEnd || opt.removeOnClick) && this.api.dispatchAction({
                type: 'brush',
                brushId: modelId,
                areas: zrUtil.clone(areas),
                $from: modelId
            });
        }
 
    });
 
    function updateController(brushModel, ecModel, api, payload) {
        // Do not update controller when drawing.
        (!payload || payload.$from !== brushModel.id) && this._brushController
            .setPanels(brushModel.brushTargetManager.makePanelOpts(api))
            .enableBrush(brushModel.brushOption)
            .updateCovers(brushModel.areas.slice());
    }
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/brush/brushAction.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/brush/brushAction.js

Statements: 60% (3 / 5)      Branches: 100% (0 / 0)      Functions: 0% (0 / 3)      Lines: 60% (3 / 5)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51          1                   1                                                           1          
/**
 * @file Brush action
 */
 
 
    var echarts = require('../../echarts');
 
    /**
     * payload: {
     *      brushIndex: number, or,
     *      brushId: string, or,
     *      brushName: string,
     *      globalRanges: Array
     * }
     */
    echarts.registerAction(
         {type: 'brush', event: 'brush', update: 'updateView'},
        function (payload, ecModel) {
            ecModel.eachComponent({mainType: 'brush', query: payload}, function (brushModel) {
                brushModel.setAreas(payload.areas);
            });
        }
    );
 
    /**
     * payload: {
     *      brushComponents: [
     *          {
     *              brushId,
     *              brushIndex,
     *              brushName,
     *              series: [
     *                  {
     *                      seriesId,
     *                      seriesIndex,
     *                      seriesName,
     *                      rawIndices: [21, 34, ...]
     *                  },
     *                  ...
     *              ]
     *          },
     *          ...
     *      ]
     * }
     */
    echarts.registerAction(
         {type: 'brushSelect', event: 'brushSelected', update: 'none'},
        function () {}
    );
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/brush/preprocessor.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/brush/preprocessor.js

Statements: 12.12% (4 / 33)      Branches: 0% (0 / 28)      Functions: 0% (0 / 5)      Lines: 12.12% (4 / 33)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66          1   1   1                                                                                       1                        
/**
 * @file brush preprocessor
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    var DEFAULT_TOOLBOX_BTNS = ['rect', 'polygon', 'keep', 'clear'];
 
    module.exports = function (option, isNew) {
        var brushComponents = option && option.brush;
        if (!zrUtil.isArray(brushComponents)) {
            brushComponents = brushComponents ? [brushComponents] : [];
        }
 
        if (!brushComponents.length) {
            return;
        }
 
        var brushComponentSpecifiedBtns = [];
 
        zrUtil.each(brushComponents, function (brushOpt) {
            var tbs = brushOpt.hasOwnProperty('toolbox')
                ? brushOpt.toolbox : [];
 
            if (tbs instanceof Array) {
                brushComponentSpecifiedBtns = brushComponentSpecifiedBtns.concat(tbs);
            }
        });
 
        var toolbox = option && option.toolbox;
 
        if (zrUtil.isArray(toolbox)) {
            toolbox = toolbox[0];
        }
        if (!toolbox) {
            toolbox = {feature: {}};
            option.toolbox = [toolbox];
        }
 
        var toolboxFeature = (toolbox.feature || (toolbox.feature = {}));
        var toolboxBrush = toolboxFeature.brush || (toolboxFeature.brush = {});
        var brushTypes = toolboxBrush.type || (toolboxBrush.type = []);
 
        brushTypes.push.apply(brushTypes, brushComponentSpecifiedBtns);
 
        removeDuplicate(brushTypes);
 
        if (isNew && !brushTypes.length) {
            brushTypes.push.apply(brushTypes, DEFAULT_TOOLBOX_BTNS);
        }
    };
 
    function removeDuplicate(arr) {
        var map = {};
        zrUtil.each(arr, function (val) {
            map[val] = 1;
        });
        arr.length = 0;
        zrUtil.each(map, function (flag, val) {
            arr.push(val);
        });
    }
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/brush/selector.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/brush/selector.js

Statements: 25.49% (13 / 51)      Branches: 0% (0 / 37)      Functions: 8.33% (1 / 12)      Lines: 25.49% (13 / 51)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128    1 1                     1                                                                                         1 2 2   2                                         1       1                       1                               1       1       1      
 
 
    var polygonContain = require('zrender/lib/contain/polygon').contain;
    var BoundingRect = require('zrender/lib/core/BoundingRect');
 
    // Key of the first level is brushType: `line`, `rect`, `polygon`.
    // Key of the second level is chart element type: `point`, `rect`.
    // See moudule:echarts/component/helper/BrushController
    // function param:
    //      {Object} itemLayout fetch from data.getItemLayout(dataIndex)
    //      {Object} selectors {point: selector, rect: selector, ...}
    //      {Object} area {range: [[], [], ..], boudingRect}
    // function return:
    //      {boolean} Whether in the given brush.
    var selector = {
        lineX: getLineSelectors(0),
        lineY: getLineSelectors(1),
        rect: {
            point: function (itemLayout, selectors, area) {
                return area.boundingRect.contain(itemLayout[0], itemLayout[1]);
            },
            rect: function (itemLayout, selectors, area) {
                return area.boundingRect.intersect(itemLayout);
            }
        },
        polygon: {
            point: function (itemLayout, selectors, area) {
                return area.boundingRect.contain(itemLayout[0], itemLayout[1])
                    && polygonContain(area.range, itemLayout[0], itemLayout[1]);
            },
            rect: function (itemLayout, selectors, area) {
                var points = area.range;
 
                if (points.length <= 1) {
                    return false;
                }
 
                var x = itemLayout.x;
                var y = itemLayout.y;
                var width = itemLayout.width;
                var height = itemLayout.height;
                var p = points[0];
 
                if (polygonContain(points, x, y)
                    || polygonContain(points, x + width, y)
                    || polygonContain(points, x, y + height)
                    || polygonContain(points, x + width, y + height)
                    || BoundingRect.create(itemLayout).contain(p[0], p[1])
                    || lineIntersectPolygon(x, y, x + width, y, points)
                    || lineIntersectPolygon(x, y, x, y + height, points)
                    || lineIntersectPolygon(x + width, y, x + width, y + height, points)
                    || lineIntersectPolygon(x, y + height, x + width, y + height, points)
                ) {
                    return true;
                }
            }
        }
    };
 
    function getLineSelectors(xyIndex) {
        var xy = ['x', 'y'];
        var wh = ['width', 'height'];
 
        return {
            point: function (itemLayout, selectors, area) {
                var range = area.range;
                var p = itemLayout[xyIndex];
                return inLineRange(p, range);
            },
            rect: function (itemLayout, selectors, area) {
                var range = area.range;
                var layoutRange = [
                    itemLayout[xy[xyIndex]],
                    itemLayout[xy[xyIndex]] + itemLayout[wh[xyIndex]]
                ];
                layoutRange[1] < layoutRange[0] && layoutRange.reverse();
                return inLineRange(layoutRange[0], range)
                    || inLineRange(layoutRange[1], range)
                    || inLineRange(range[0], layoutRange)
                    || inLineRange(range[1], layoutRange);
            }
        };
    }
 
    function inLineRange(p, range) {
        return range[0] <= p && p <= range[1];
    }
 
    function lineIntersectPolygon(lx, ly, l2x, l2y, points) {
        for (var i = 0, p2 = points[points.length - 1]; i < points.length; i++) {
            var p = points[i];
            if (lineIntersect(lx, ly, l2x, l2y, p[0], p[1], p2[0], p2[1])) {
                return true;
            }
            p2 = p;
        }
    }
 
    // Code from <http://blog.csdn.net/rickliuxiao/article/details/6259322> with some fix.
    // See <https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection>
    function lineIntersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) {
        var delta = determinant(a2x - a1x, b1x - b2x, a2y - a1y, b1y - b2y);
        if (nearZero(delta)) { // parallel
            return false;
        }
        var namenda = determinant(b1x - a1x, b1x - b2x, b1y - a1y, b1y - b2y) / delta;
        if (namenda < 0 || namenda > 1) {
            return false;
        }
        var miu = determinant(a2x - a1x, b1x - a1x, a2y - a1y, b1y - a1y) / delta;
        if (miu < 0 || miu > 1) {
            return false;
        }
        return true;
    }
 
    function nearZero(val) {
        return val <= (1e-6) && val >= -(1e-6);
    }
 
    function determinant(v1, v2, v3, v4) {
        return v1 * v4 - v2 * v3;
    }
 
    module.exports = selector;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/brush/visualEncoding.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/brush/visualEncoding.js

Statements: 18.94% (25 / 132)      Branches: 0% (0 / 71)      Functions: 0% (0 / 32)      Lines: 18.94% (25 / 132)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327          1 1 1 1 1 1 1   1 1 1 1         1                               1                                                                                                     1           1                                                   1                       1                                                                                                                             1                                                     1                       1                     1                                           1                     1                     1                                                     1                    
/**
 * @file Brush visual coding.
 */
 
 
    var echarts = require('../../echarts');
    var visualSolution = require('../../visual/visualSolution');
    var zrUtil = require('zrender/lib/core/util');
    var BoundingRect = require('zrender/lib/core/BoundingRect');
    var selector = require('./selector');
    var throttle = require('../../util/throttle');
    var BrushTargetManager = require('../helper/BrushTargetManager');
 
    var STATE_LIST = ['inBrush', 'outOfBrush'];
    var DISPATCH_METHOD = '__ecBrushSelect';
    var DISPATCH_FLAG = '__ecInBrushSelectEvent';
    var PRIORITY_BRUSH = echarts.PRIORITY.VISUAL.BRUSH;
 
    /**
     * Layout for visual, the priority higher than other layout, and before brush visual.
     */
    echarts.registerLayout(PRIORITY_BRUSH, function (ecModel, api, payload) {
        ecModel.eachComponent({mainType: 'brush'}, function (brushModel) {
 
            payload && payload.type === 'takeGlobalCursor' && brushModel.setBrushOption(
                payload.key === 'brush' ? payload.brushOption : {brushType: false}
            );
 
            var brushTargetManager = brushModel.brushTargetManager = new BrushTargetManager(brushModel.option, ecModel);
 
            brushTargetManager.setInputRanges(brushModel.areas, ecModel);
        });
    });
 
    /**
     * Register the visual encoding if this modules required.
     */
    echarts.registerVisual(PRIORITY_BRUSH, function (ecModel, api, payload) {
 
        var brushSelected = [];
        var throttleType;
        var throttleDelay;
 
        ecModel.eachComponent({mainType: 'brush'}, function (brushModel, brushIndex) {
 
            var thisBrushSelected = {
                brushId: brushModel.id,
                brushIndex: brushIndex,
                brushName: brushModel.name,
                areas: zrUtil.clone(brushModel.areas),
                selected: []
            };
            // Every brush component exists in event params, convenient
            // for user to find by index.
            brushSelected.push(thisBrushSelected);
 
            var brushOption = brushModel.option;
            var brushLink = brushOption.brushLink;
            var linkedSeriesMap = [];
            var selectedDataIndexForLink = [];
            var rangeInfoBySeries = [];
            var hasBrushExists = 0;
 
            if (!brushIndex) { // Only the first throttle setting works.
                throttleType = brushOption.throttleType;
                throttleDelay = brushOption.throttleDelay;
            }
 
            // Add boundingRect and selectors to range.
            var areas = zrUtil.map(brushModel.areas, function (area) {
                return bindSelector(
                    zrUtil.defaults(
                        {boundingRect: boundingRectBuilders[area.brushType](area)},
                        area
                    )
                );
            });
 
            var visualMappings = visualSolution.createVisualMappings(
                brushModel.option, STATE_LIST, function (mappingOption) {
                    mappingOption.mappingMethod = 'fixed';
                }
            );
 
            zrUtil.isArray(brushLink) && zrUtil.each(brushLink, function (seriesIndex) {
                linkedSeriesMap[seriesIndex] = 1;
            });
 
            function linkOthers(seriesIndex) {
                return brushLink === 'all' || linkedSeriesMap[seriesIndex];
            }
 
            // If no supported brush or no brush on the series,
            // all visuals should be in original state.
            function brushed(rangeInfoList) {
                return !!rangeInfoList.length;
            }
 
            /**
             * Logic for each series: (If the logic has to be modified one day, do it carefully!)
             *
             * ( brushed ┬ && ┬hasBrushExist ┬ && linkOthers  ) => StepA: ┬record, ┬ StepB: ┬visualByRecord.
             *   !brushed┘    ├hasBrushExist ┤                            └nothing,┘        ├visualByRecord.
             *                └!hasBrushExist┘                                              └nothing.
             * ( !brushed  && ┬hasBrushExist ┬ && linkOthers  ) => StepA:  nothing,  StepB: ┬visualByRecord.
             *                └!hasBrushExist┘                                              └nothing.
             * ( brushed ┬ &&                     !linkOthers ) => StepA:  nothing,  StepB: ┬visualByCheck.
             *   !brushed┘                                                                  └nothing.
             * ( !brushed  &&                     !linkOthers ) => StepA:  nothing,  StepB:  nothing.
             */
 
            // Step A
            ecModel.eachSeries(function (seriesModel, seriesIndex) {
                var rangeInfoList = rangeInfoBySeries[seriesIndex] = [];
 
                seriesModel.subType === 'parallel'
                    ? stepAParallel(seriesModel, seriesIndex, rangeInfoList)
                    : stepAOthers(seriesModel, seriesIndex, rangeInfoList);
            });
 
            function stepAParallel(seriesModel, seriesIndex) {
                var coordSys = seriesModel.coordinateSystem;
                hasBrushExists |= coordSys.hasAxisBrushed();
 
                linkOthers(seriesIndex) && coordSys.eachActiveState(
                    seriesModel.getData(),
                    function (activeState, dataIndex) {
                        activeState === 'active' && (selectedDataIndexForLink[dataIndex] = 1);
                    }
                );
            }
 
            function stepAOthers(seriesModel, seriesIndex, rangeInfoList) {
                var selectorsByBrushType = getSelectorsByBrushType(seriesModel);
                if (!selectorsByBrushType || brushModelNotControll(brushModel, seriesIndex)) {
                    return;
                }
 
                zrUtil.each(areas, function (area) {
                    selectorsByBrushType[area.brushType]
                        && brushModel.brushTargetManager.controlSeries(area, seriesModel, ecModel)
                        && rangeInfoList.push(area);
                    hasBrushExists |= brushed(rangeInfoList);
                });
 
                if (linkOthers(seriesIndex) && brushed(rangeInfoList)) {
                    var data = seriesModel.getData();
                    data.each(function (dataIndex) {
                        if (checkInRange(selectorsByBrushType, rangeInfoList, data, dataIndex)) {
                            selectedDataIndexForLink[dataIndex] = 1;
                        }
                    });
                }
            }
 
            // Step B
            ecModel.eachSeries(function (seriesModel, seriesIndex) {
                var seriesBrushSelected = {
                    seriesId: seriesModel.id,
                    seriesIndex: seriesIndex,
                    seriesName: seriesModel.name,
                    dataIndex: []
                };
                // Every series exists in event params, convenient
                // for user to find series by seriesIndex.
                thisBrushSelected.selected.push(seriesBrushSelected);
 
                var selectorsByBrushType = getSelectorsByBrushType(seriesModel);
                var rangeInfoList = rangeInfoBySeries[seriesIndex];
 
                var data = seriesModel.getData();
                var getValueState = linkOthers(seriesIndex)
                    ? function (dataIndex) {
                        return selectedDataIndexForLink[dataIndex]
                            ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush')
                            : 'outOfBrush';
                    }
                    : function (dataIndex) {
                        return checkInRange(selectorsByBrushType, rangeInfoList, data, dataIndex)
                            ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush')
                            : 'outOfBrush';
                    };
 
                // If no supported brush or no brush, all visuals are in original state.
                (linkOthers(seriesIndex) ? hasBrushExists : brushed(rangeInfoList))
                    && visualSolution.applyVisual(
                        STATE_LIST, visualMappings, data, getValueState
                    );
            });
 
        });
 
        dispatchAction(api, throttleType, throttleDelay, brushSelected, payload);
    });
 
    function dispatchAction(api, throttleType, throttleDelay, brushSelected, payload) {
        // This event will not be triggered when `setOpion`, otherwise dead lock may
        // triggered when do `setOption` in event listener, which we do not find
        // satisfactory way to solve yet. Some considered resolutions:
        // (a) Diff with prevoius selected data ant only trigger event when changed.
        // But store previous data and diff precisely (i.e., not only by dataIndex, but
        // also detect value changes in selected data) might bring complexity or fragility.
        // (b) Use spectial param like `silent` to suppress event triggering.
        // But such kind of volatile param may be weird in `setOption`.
        if (!payload) {
            return;
        }
 
        var zr = api.getZr();
        if (zr[DISPATCH_FLAG]) {
            return;
        }
 
        if (!zr[DISPATCH_METHOD]) {
            zr[DISPATCH_METHOD] = doDispatch;
        }
 
        var fn = throttle.createOrUpdate(zr, DISPATCH_METHOD, throttleDelay, throttleType);
 
        fn(api, brushSelected);
    }
 
    function doDispatch(api, brushSelected) {
        if (!api.isDisposed()) {
            var zr = api.getZr();
            zr[DISPATCH_FLAG] = true;
            api.dispatchAction({
                type: 'brushSelect',
                batch: brushSelected
            });
            zr[DISPATCH_FLAG] = false;
        }
    }
 
    function checkInRange(selectorsByBrushType, rangeInfoList, data, dataIndex) {
        for (var i = 0, len = rangeInfoList.length; i < len; i++) {
            var area = rangeInfoList[i];
            if (selectorsByBrushType[area.brushType](
                dataIndex, data, area.selectors, area
            )) {
                return true;
            }
        }
    }
 
    function getSelectorsByBrushType(seriesModel) {
        var brushSelector = seriesModel.brushSelector;
        if (zrUtil.isString(brushSelector)) {
            var sels = [];
            zrUtil.each(selector, function (selectorsByElementType, brushType) {
                sels[brushType] = function (dataIndex, data, selectors, area) {
                    var itemLayout = data.getItemLayout(dataIndex);
                    return selectorsByElementType[brushSelector](itemLayout, selectors, area);
                };
            });
            return sels;
        }
        else if (zrUtil.isFunction(brushSelector)) {
            var bSelector = {};
            zrUtil.each(selector, function (sel, brushType) {
                bSelector[brushType] = brushSelector;
            });
            return bSelector;
        }
        return brushSelector;
    }
 
    function brushModelNotControll(brushModel, seriesIndex) {
        var seriesIndices = brushModel.option.seriesIndex;
        return seriesIndices != null
            && seriesIndices !== 'all'
            && (
                zrUtil.isArray(seriesIndices)
                ? zrUtil.indexOf(seriesIndices, seriesIndex) < 0
                : seriesIndex !== seriesIndices
            );
    }
 
    function bindSelector(area) {
        var selectors = area.selectors = {};
        zrUtil.each(selector[area.brushType], function (selFn, elType) {
            // Do not use function binding or curry for performance.
            selectors[elType] = function (itemLayout) {
                return selFn(itemLayout, selectors, area);
            };
        });
        return area;
    }
 
    var boundingRectBuilders = {
 
        lineX: zrUtil.noop,
 
        lineY: zrUtil.noop,
 
        rect: function (area) {
            return getBoundingRectFromMinMax(area.range);
        },
 
        polygon: function (area) {
            var minMax;
            var range = area.range;
 
            for (var i = 0, len = range.length; i < len; i++) {
                minMax = minMax || [[Infinity, -Infinity], [Infinity, -Infinity]];
                var rg = range[i];
                rg[0] < minMax[0][0] && (minMax[0][0] = rg[0]);
                rg[0] > minMax[0][1] && (minMax[0][1] = rg[0]);
                rg[1] < minMax[1][0] && (minMax[1][0] = rg[1]);
                rg[1] > minMax[1][1] && (minMax[1][1] = rg[1]);
            }
 
            return minMax && getBoundingRectFromMinMax(minMax);
        }
    };
 
    function getBoundingRectFromMinMax(minMax) {
        return new BoundingRect(
            minMax[0][0],
            minMax[1][0],
            minMax[0][1] - minMax[0][0],
            minMax[1][1] - minMax[1][0]
        );
    }
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/calendar/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/calendar/

Statements: 4.26% (8 / 188)      Branches: 0% (0 / 84)      Functions: 0% (0 / 14)      Lines: 4.26% (8 / 188)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/component/calendar/
File Statements Branches Functions Lines
CalendarView.js 4.26% (8 / 188) 0% (0 / 84) 0% (0 / 14) 4.26% (8 / 188)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/calendar/CalendarView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/calendar/CalendarView.js

Statements: 4.26% (8 / 188)      Branches: 0% (0 / 84)      Functions: 0% (0 / 14)      Lines: 4.26% (8 / 188)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499      1 1 1 1   1                             1         1                                                                                                                                                                                                                                       1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
    var graphic = require('../../util/graphic');
    var formatUtil = require('../../util/format');
    var numberUtil = require('../../util/number');
 
    var MONTH_TEXT = {
        EN: [
                'Jan', 'Feb', 'Mar',
                'Apr', 'May', 'Jun',
                'Jul', 'Aug', 'Sep',
                'Oct', 'Nov', 'Dec'
            ],
        CN: [
                '一月', '二月', '三月',
                '四月', '五月', '六月',
                '七月', '八月', '九月',
                '十月', '十一月', '十二月'
            ]
    };
 
    var WEEK_TEXT = {
        EN: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
        CN: ['日', '一', '二', '三', '四', '五', '六']
    };
 
    module.exports = require('../../echarts').extendComponentView({
 
        type: 'calendar',
 
        /**
         * top/left line points
         *  @private
         */
        _tlpoints: null,
 
        /**
         * bottom/right line points
         *  @private
         */
        _blpoints: null,
 
        /**
         * first day of month
         *  @private
         */
        _firstDayOfMonth: null,
 
        /**
         * first day point of month
         *  @private
         */
        _firstDayPoints: null,
 
        render: function (calendarModel, ecModel, api) {
 
            var group = this.group;
 
            group.removeAll();
 
            var coordSys = calendarModel.coordinateSystem;
 
            // range info
            var rangeData = coordSys.getHandledRangeInfo();
            var orient = coordSys.getOrient();
 
            this._renderDayRect(calendarModel, rangeData, group);
 
            // _renderLines must be called prior to following function
            this._renderLines(calendarModel, rangeData, orient, group);
 
            this._renderYearText(calendarModel, rangeData, orient, group);
 
            this._renderMonthText(calendarModel, orient, group);
 
            this._renderWeekText(calendarModel, rangeData, orient, group);
        },
 
        // render day rect
        _renderDayRect: function (calendarModel, rangeData, group) {
            var coordSys = calendarModel.coordinateSystem;
            var itemRectStyleModel = calendarModel.getModel('itemStyle.normal').getItemStyle();
            var sw = coordSys.getCellWidth();
            var sh = coordSys.getCellHeight();
 
            for (var i = rangeData.start.time;
                i <= rangeData.end.time;
                i = coordSys.getNextNDay(i, 1).time
            ) {
 
                var point = coordSys.dataToRect([i], true).tl;
 
                // every rect
                var rect = new graphic.Rect({
                    shape: {
                        x: point[0],
                        y: point[1],
                        width: sw,
                        height: sh
                    },
                    style: itemRectStyleModel
                });
 
                group.add(rect);
            }
 
        },
 
        // render separate line
        _renderLines: function (calendarModel, rangeData, orient, group) {
 
            var self = this;
 
            var coordSys = calendarModel.coordinateSystem;
 
            var lineStyleModel = calendarModel.getModel('splitLine.lineStyle').getLineStyle();
            var show = calendarModel.get('splitLine.show');
 
            var lineWidth = lineStyleModel.lineWidth;
 
            this._tlpoints = [];
            this._blpoints = [];
            this._firstDayOfMonth = [];
            this._firstDayPoints = [];
 
 
            var firstDay = rangeData.start;
 
            for (var i = 0; firstDay.time <= rangeData.end.time; i++) {
                addPoints(firstDay.formatedDate);
 
                if (i === 0) {
                    firstDay = coordSys.getDateInfo(rangeData.start.y + '-' + rangeData.start.m);
                }
 
                var date = firstDay.date;
                date.setMonth(date.getMonth() + 1);
                firstDay = coordSys.getDateInfo(date);
            }
 
            addPoints(coordSys.getNextNDay(rangeData.end.time, 1).formatedDate);
 
            function addPoints(date) {
 
                self._firstDayOfMonth.push(coordSys.getDateInfo(date));
                self._firstDayPoints.push(coordSys.dataToRect([date], true).tl);
 
                var points = self._getLinePointsOfOneWeek(calendarModel, date, orient);
 
                self._tlpoints.push(points[0]);
                self._blpoints.push(points[points.length - 1]);
 
                show && self._drawSplitline(points, lineStyleModel, group);
            }
 
 
            // render top/left line
            show && this._drawSplitline(self._getEdgesPoints(self._tlpoints, lineWidth, orient), lineStyleModel, group);
 
            // render bottom/right line
            show && this._drawSplitline(self._getEdgesPoints(self._blpoints, lineWidth, orient), lineStyleModel, group);
 
        },
 
        // get points at both ends
        _getEdgesPoints: function (points, lineWidth, orient) {
            var rs = [points[0].slice(), points[points.length - 1].slice()];
            var idx = orient === 'horizontal' ? 0 : 1;
 
            // both ends of the line are extend half lineWidth
            rs[0][idx] = rs[0][idx] - lineWidth / 2;
            rs[1][idx] = rs[1][idx] + lineWidth / 2;
 
            return rs;
        },
 
        // render split line
        _drawSplitline: function (points, lineStyleModel, group) {
 
            var poyline = new graphic.Polyline({
                z2: 20,
                shape: {
                    points: points
                },
                style: lineStyleModel
            });
 
            group.add(poyline);
        },
 
        // render month line of one week points
        _getLinePointsOfOneWeek: function (calendarModel, date, orient) {
 
            var coordSys = calendarModel.coordinateSystem;
            date = coordSys.getDateInfo(date);
 
            var points = [];
 
            for (var i = 0; i < 7; i++) {
 
                var tmpD = coordSys.getNextNDay(date.time, i);
                var point = coordSys.dataToRect([tmpD.time], true);
 
                points[2 * tmpD.day] = point.tl;
                points[2 * tmpD.day + 1] = point[orient === 'horizontal' ? 'bl' : 'tr'];
            }
 
            return points;
 
        },
 
        _formatterLabel: function (formatter, params) {
 
            if (typeof formatter === 'string' && formatter) {
                return formatUtil.formatTplSimple(formatter, params);
            }
 
            if (typeof formatter === 'function') {
                return formatter(params);
            }
 
            return params.nameMap;
 
        },
 
        _yearTextPositionControl: function (point, orient, position, margin) {
 
            point = point.slice();
            var aligns = ['center', 'bottom'];
 
            if (position === 'top') {
                point[1] -= margin;
            }
            if (position === 'bottom') {
                point[1] += margin;
                aligns = ['center', 'top'];
            }
            if (position === 'left') {
                point[0] -= margin;
            }
            if (position === 'right') {
                point[0] += margin;
                aligns = ['center', 'top'];
            }
 
            var rotate = 0;
            if (position === 'left' || position === 'right') {
                rotate = Math.PI / 2;
            }
 
            return {
                rotation: rotate,
                origin: point,
                style: {
                    x: point[0],
                    y: point[1],
                    textAlign: aligns[0],
                    textVerticalAlign: aligns[1]
                }
            };
        },
 
        // render year
        _renderYearText: function (calendarModel, rangeData, orient, group) {
            var yearLabel = calendarModel.getModel('yearLabel');
 
            if (!yearLabel.get('show')) {
                return;
            }
 
            var yearLabelStyleModel = calendarModel.getModel('yearLabel.textStyle');
            var margin = yearLabel.get('margin');
            var pos = yearLabel.get('position');
 
            if (!pos) {
                pos = orient !== 'horizontal' ? 'top' : 'left';
            }
 
            var points = [this._tlpoints[this._tlpoints.length - 1], this._blpoints[0]];
            var xc = (points[0][0] + points[1][0]) / 2;
            var yc = (points[0][1] + points[1][1]) / 2;
 
            var idx = orient === 'horizontal' ? 0 : 1;
 
 
            var posPoints = {
                top: [xc, points[idx][1]],
                bottom: [xc, points[1 - idx][1]],
                left: [points[1 - idx][0], yc],
                right: [points[idx][0], yc]
            };
 
            var name = rangeData.start.y;
 
            if (+rangeData.end.y > +rangeData.start.y) {
                name = name + '-' + rangeData.end.y;
            }
 
            var formatter = yearLabel.get('formatter');
 
            var params = {
                start: rangeData.start.y,
                end: rangeData.end.y,
                nameMap: name
            };
 
            var content = this._formatterLabel(formatter, params);
 
            var yearText = new graphic.Text(
                zrUtil.merge({
                    z2: 30,
                    style: {
                        text: content,
                        font: yearLabelStyleModel.getFont(),
                        fill: yearLabelStyleModel.getTextColor()
                    }
                }, this._yearTextPositionControl(posPoints[pos], orient, pos, margin))
            );
 
            group.add(yearText);
        },
 
        _monthTextPositionControl: function (point, isCenter, orient, position, margin) {
            var align = 'left';
            var vAlign = 'top';
            var x = point[0];
            var y = point[1];
 
            if (orient === 'horizontal') {
                y = y + margin;
 
                if (isCenter) {
                    align = 'center';
                }
 
                if (position === 'start') {
                    vAlign = 'bottom';
                }
            }
            else {
                x = x + margin;
 
                if (isCenter) {
                    vAlign = 'middle';
                }
 
                if (position === 'start') {
                    align = 'right';
                }
            }
 
            return {
                x: x,
                y: y,
                textAlign: align,
                textVerticalAlign: vAlign
            };
        },
 
        // render month and year text
        _renderMonthText: function (calendarModel, orient, group) {
            var monthLabel = calendarModel.getModel('monthLabel');
 
            if (!monthLabel.get('show')) {
                return;
            }
 
            var monthLabelStyleModel = calendarModel.getModel('monthLabel.textStyle');
            var nameMap = monthLabel.get('nameMap');
            var margin = monthLabel.get('margin');
            var pos = monthLabel.get('position');
            var align = monthLabel.get('align');
 
            var termPoints = [this._tlpoints, this._blpoints];
 
            if (zrUtil.isString(nameMap)) {
                nameMap = MONTH_TEXT[nameMap.toUpperCase()] || [];
            }
 
            var idx = pos === 'start' ? 0 : 1;
            var axis = orient === 'horizontal' ? 0 : 1;
            margin = pos === 'start' ? -margin : margin;
            var isCenter = (align === 'center');
 
            for (var i = 0; i < termPoints[idx].length - 1; i++) {
 
                var tmp = termPoints[idx][i].slice();
                var firstDay = this._firstDayOfMonth[i];
 
                if (isCenter) {
                    var firstDayPoints = this._firstDayPoints[i];
                    tmp[axis] = (firstDayPoints[axis] + termPoints[0][i + 1][axis]) / 2;
                }
 
                var formatter = monthLabel.get('formatter');
                var name = nameMap[+firstDay.m - 1];
                var params = {
                    yyyy: firstDay.y,
                    yy: (firstDay.y + '').slice(2),
                    MM: firstDay.m,
                    M: +firstDay.m,
                    nameMap: name
                };
 
                var content = this._formatterLabel(formatter, params);
 
                var monthText = new graphic.Text({
                    z2: 30,
                    style: zrUtil.extend({
                        text: content,
                        font: monthLabelStyleModel.getFont(),
                        fill: monthLabelStyleModel.getTextColor()
                    }, this._monthTextPositionControl(tmp, isCenter, orient, pos, margin))
                });
 
                group.add(monthText);
            }
        },
 
        _weekTextPositionControl: function (point, orient, position, margin, cellSize) {
            var align = 'center';
            var vAlign = 'middle';
            var x = point[0];
            var y = point[1];
            var isStart = position === 'start';
 
            if (orient === 'horizontal') {
                x = x + margin + (isStart ? 1 : -1) * cellSize[0] / 2;
                align = isStart ? 'right' : 'left';
            }
            else {
                y = y + margin + (isStart ? 1 : -1) * cellSize[1] / 2;
                vAlign = isStart ? 'bottom' : 'top';
            }
 
            return {
                x: x,
                y: y,
                textAlign: align,
                textVerticalAlign: vAlign
            };
        },
 
        // render weeks
        _renderWeekText: function (calendarModel, rangeData, orient, group) {
            var dayLabel = calendarModel.getModel('dayLabel');
 
            if (!dayLabel.get('show')) {
                return;
            }
 
            var coordSys = calendarModel.coordinateSystem;
            var dayLabelStyleModel = calendarModel.getModel('dayLabel.textStyle');
            var pos = dayLabel.get('position');
            var nameMap = dayLabel.get('nameMap');
            var margin = dayLabel.get('margin');
            var firstDayOfWeek = coordSys.getFirstDayOfWeek();
 
            if (zrUtil.isString(nameMap)) {
                nameMap = WEEK_TEXT[nameMap.toUpperCase()] || [];
            }
 
            var start = coordSys.getNextNDay(
                rangeData.end.time, (7 - rangeData.lweek)
            ).time;
 
            var cellSize = [coordSys.getCellWidth(), coordSys.getCellHeight()];
            margin = numberUtil.parsePercent(margin, cellSize[orient === 'horizontal' ? 0 : 1]);
 
            if (pos === 'start') {
                start = coordSys.getNextNDay(
                    rangeData.start.time, -(7 + rangeData.fweek)
                ).time;
                margin = -margin;
            }
 
            for (var i = 0; i < 7; i++) {
 
                var tmpD = coordSys.getNextNDay(start, i);
                var point = coordSys.dataToRect([tmpD.time], true).center;
                var day = i;
                day = Math.abs((i + firstDayOfWeek) % 7);
                var weekText = new graphic.Text({
                    z2: 30,
                    style: zrUtil.extend({
                        text: nameMap[day],
                        font: dayLabelStyleModel.getFont(),
                        fill: dayLabelStyleModel.getTextColor()
                    }, this._weekTextPositionControl(point, orient, pos, margin, cellSize))
                });
                group.add(weekText);
            }
        }
    });
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/

Statements: 13.66% (115 / 842)      Branches: 0.24% (1 / 416)      Functions: 0.62% (1 / 161)      Lines: 13.66% (115 / 842)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/
File Statements Branches Functions Lines
AxisProxy.js 9.02% (12 / 133) 0% (0 / 88) 0% (0 / 24) 9.02% (12 / 133)
DataZoomModel.js 7.5% (12 / 160) 0% (0 / 98) 0% (0 / 37) 7.5% (12 / 160)
DataZoomView.js 13.04% (3 / 23) 0% (0 / 10) 0% (0 / 4) 13.04% (3 / 23)
InsideZoomModel.js 100% (1 / 1) 100% (0 / 0) 100% (0 / 0) 100% (1 / 1)
InsideZoomView.js 9.28% (9 / 97) 0% (0 / 44) 0% (0 / 13) 9.28% (9 / 97)
SelectZoomModel.js 100% (2 / 2) 100% (0 / 0) 100% (0 / 0) 100% (2 / 2)
SelectZoomView.js 100% (1 / 1) 100% (0 / 0) 100% (0 / 0) 100% (1 / 1)
SliderZoomModel.js 100% (3 / 3) 100% (0 / 0) 100% (0 / 0) 100% (3 / 3)
SliderZoomView.js 9.92% (24 / 242) 0% (0 / 127) 0% (0 / 34) 9.92% (24 / 242)
dataZoomAction.js 36.36% (4 / 11) 100% (0 / 0) 0% (0 / 4) 36.36% (4 / 11)
dataZoomProcessor.js 28.57% (4 / 14) 100% (0 / 0) 0% (0 / 5) 28.57% (4 / 14)
helper.js 38% (19 / 50) 7.14% (1 / 14) 6.67% (1 / 15) 38% (19 / 50)
history.js 16.67% (6 / 36) 0% (0 / 12) 0% (0 / 7) 16.67% (6 / 36)
roams.js 20.9% (14 / 67) 0% (0 / 23) 0% (0 / 17) 20.9% (14 / 67)
typeDefaulter.js 50% (1 / 2) 100% (0 / 0) 0% (0 / 1) 50% (1 / 2)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/AxisProxy.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/AxisProxy.js

Statements: 9.02% (12 / 133)      Branches: 0% (0 / 88)      Functions: 0% (0 / 24)      Lines: 9.02% (12 / 133)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406          1 1 1 1 1                     1                                                                                       1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   1           1                                                               1                                                                         1                                         1      
/**
 * @file Axis operator
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
    var numberUtil = require('../../util/number');
    var helper = require('./helper');
    var each = zrUtil.each;
    var asc = numberUtil.asc;
 
    /**
     * Operate single axis.
     * One axis can only operated by one axis operator.
     * Different dataZoomModels may be defined to operate the same axis.
     * (i.e. 'inside' data zoom and 'slider' data zoom components)
     * So dataZoomModels share one axisProxy in that case.
     *
     * @class
     */
    var AxisProxy = function (dimName, axisIndex, dataZoomModel, ecModel) {
 
        /**
         * @private
         * @type {string}
         */
        this._dimName = dimName;
 
        /**
         * @private
         */
        this._axisIndex = axisIndex;
 
        /**
         * @private
         * @type {Array.<number>}
         */
        this._valueWindow;
 
        /**
         * @private
         * @type {Array.<number>}
         */
        this._percentWindow;
 
        /**
         * @private
         * @type {Array.<number>}
         */
        this._dataExtent;
 
        /**
         * @readOnly
         * @type {module: echarts/model/Global}
         */
        this.ecModel = ecModel;
 
        /**
         * @private
         * @type {module: echarts/component/dataZoom/DataZoomModel}
         */
        this._dataZoomModel = dataZoomModel;
    };
 
    AxisProxy.prototype = {
 
        constructor: AxisProxy,
 
        /**
         * Whether the axisProxy is hosted by dataZoomModel.
         *
         * @public
         * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel
         * @return {boolean}
         */
        hostedBy: function (dataZoomModel) {
            return this._dataZoomModel === dataZoomModel;
        },
 
        /**
         * @return {Array.<number>} Value can only be NaN or finite value.
         */
        getDataValueWindow: function () {
            return this._valueWindow.slice();
        },
 
        /**
         * @return {Array.<number>}
         */
        getDataPercentWindow: function () {
            return this._percentWindow.slice();
        },
 
        /**
         * @public
         * @param {number} axisIndex
         * @return {Array} seriesModels
         */
        getTargetSeriesModels: function () {
            var seriesModels = [];
            var ecModel = this.ecModel;
 
            ecModel.eachSeries(function (seriesModel) {
                if (helper.isCoordSupported(seriesModel.get('coordinateSystem'))) {
                    var dimName = this._dimName;
                    var axisModel = ecModel.queryComponents({
                        mainType: dimName + 'Axis',
                        index: seriesModel.get(dimName + 'AxisIndex'),
                        id: seriesModel.get(dimName + 'AxisId')
                    })[0];
                    if (this._axisIndex === (axisModel && axisModel.componentIndex)) {
                        seriesModels.push(seriesModel);
                    }
                }
            }, this);
 
            return seriesModels;
        },
 
        getAxisModel: function () {
            return this.ecModel.getComponent(this._dimName + 'Axis', this._axisIndex);
        },
 
        getOtherAxisModel: function () {
            var axisDim = this._dimName;
            var ecModel = this.ecModel;
            var axisModel = this.getAxisModel();
            var isCartesian = axisDim === 'x' || axisDim === 'y';
            var otherAxisDim;
            var coordSysIndexName;
            if (isCartesian) {
                coordSysIndexName = 'gridIndex';
                otherAxisDim = axisDim === 'x' ? 'y' : 'x';
            }
            else {
                coordSysIndexName = 'polarIndex';
                otherAxisDim = axisDim === 'angle' ? 'radius' : 'angle';
            }
            var foundOtherAxisModel;
            ecModel.eachComponent(otherAxisDim + 'Axis', function (otherAxisModel) {
                if ((otherAxisModel.get(coordSysIndexName) || 0)
                    === (axisModel.get(coordSysIndexName) || 0)
                ) {
                    foundOtherAxisModel = otherAxisModel;
                }
            });
            return foundOtherAxisModel;
        },
 
        /**
         * Only calculate by given range and this._dataExtent, do not change anything.
         *
         * @param {Object} opt
         * @param {number} [opt.start]
         * @param {number} [opt.end]
         * @param {number} [opt.startValue]
         * @param {number} [opt.endValue]
         */
        calculateDataWindow: function (opt) {
            var dataExtent = this._dataExtent;
            var axisModel = this.getAxisModel();
            var scale = axisModel.axis.scale;
            var rangePropMode = this._dataZoomModel.getRangePropMode();
            var percentExtent = [0, 100];
            var percentWindow = [
                opt.start,
                opt.end
            ];
            var valueWindow = [];
 
            each(['startValue', 'endValue'], function (prop) {
                valueWindow.push(opt[prop] != null ? scale.parse(opt[prop]) : null);
            });
 
            // Normalize bound.
            each([0, 1], function (idx) {
                var boundValue = valueWindow[idx];
                var boundPercent = percentWindow[idx];
 
                // Notice: dataZoom is based either on `percentProp` ('start', 'end') or
                // on `valueProp` ('startValue', 'endValue'). The former one is suitable
                // for cases that a dataZoom component controls multiple axes with different
                // unit or extent, and the latter one is suitable for accurate zoom by pixel
                // (e.g., in dataZoomSelect). `valueProp` can be calculated from `percentProp`,
                // but it is awkward that `percentProp` can not be obtained from `valueProp`
                // accurately (because all of values that are overflow the `dataExtent` will
                // be calculated to percent '100%'). So we have to use
                // `dataZoom.getRangePropMode()` to mark which prop is used.
                // `rangePropMode` is updated only when setOption or dispatchAction, otherwise
                // it remains its original value.
 
                if (rangePropMode[idx] === 'percent') {
                    if (boundPercent == null) {
                        boundPercent = percentExtent[idx];
                    }
                    // Use scale.parse to math round for category or time axis.
                    boundValue = scale.parse(numberUtil.linearMap(
                        boundPercent, percentExtent, dataExtent, true
                    ));
                }
                else {
                    // Calculating `percent` from `value` may be not accurate, because
                    // This calculation can not be inversed, because all of values that
                    // are overflow the `dataExtent` will be calculated to percent '100%'
                    boundPercent = numberUtil.linearMap(
                        boundValue, dataExtent, percentExtent, true
                    );
                }
 
                // valueWindow[idx] = round(boundValue);
                // percentWindow[idx] = round(boundPercent);
                valueWindow[idx] = boundValue;
                percentWindow[idx] = boundPercent;
            });
 
            return {
                valueWindow: asc(valueWindow),
                percentWindow: asc(percentWindow)
            };
        },
 
        /**
         * Notice: reset should not be called before series.restoreData() called,
         * so it is recommanded to be called in "process stage" but not "model init
         * stage".
         *
         * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel
         */
        reset: function (dataZoomModel) {
            if (dataZoomModel !== this._dataZoomModel) {
                return;
            }
 
            // Culculate data window and data extent, and record them.
            this._dataExtent = calculateDataExtent(
                this, this._dimName, this.getTargetSeriesModels()
            );
 
            var dataWindow = this.calculateDataWindow(dataZoomModel.option);
 
            this._valueWindow = dataWindow.valueWindow;
            this._percentWindow = dataWindow.percentWindow;
 
            // Update axis setting then.
            setAxisModel(this);
        },
 
        /**
         * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel
         */
        restore: function (dataZoomModel) {
            if (dataZoomModel !== this._dataZoomModel) {
                return;
            }
 
            this._valueWindow = this._percentWindow = null;
            setAxisModel(this, true);
        },
 
        /**
         * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel
         */
        filterData: function (dataZoomModel) {
            if (dataZoomModel !== this._dataZoomModel) {
                return;
            }
 
            var axisDim = this._dimName;
            var seriesModels = this.getTargetSeriesModels();
            var filterMode = dataZoomModel.get('filterMode');
            var valueWindow = this._valueWindow;
 
            // FIXME
            // Toolbox may has dataZoom injected. And if there are stacked bar chart
            // with NaN data, NaN will be filtered and stack will be wrong.
            // So we need to force the mode to be set empty.
            // In fect, it is not a big deal that do not support filterMode-'filter'
            // when using toolbox#dataZoom, utill tooltip#dataZoom support "single axis
            // selection" some day, which might need "adapt to data extent on the
            // otherAxis", which is disabled by filterMode-'empty'.
            var otherAxisModel = this.getOtherAxisModel();
            if (dataZoomModel.get('$fromToolbox')
                && otherAxisModel
                && otherAxisModel.get('type') === 'category'
            ) {
                filterMode = 'empty';
            }
 
            // Process series data
            each(seriesModels, function (seriesModel) {
                var seriesData = seriesModel.getData();
 
                seriesData && each(seriesModel.coordDimToDataDim(axisDim), function (dim) {
                    if (filterMode === 'empty') {
                        seriesModel.setData(
                            seriesData.map(dim, function (value) {
                                return !isInWindow(value) ? NaN : value;
                            })
                        );
                    }
                    else {
                        seriesData.filterSelf(dim, isInWindow);
                    }
                });
            });
 
            function isInWindow(value) {
                return value >= valueWindow[0] && value <= valueWindow[1];
            }
        }
    };
 
    function calculateDataExtent(axisProxy, axisDim, seriesModels) {
        var dataExtent = [Infinity, -Infinity];
 
        each(seriesModels, function (seriesModel) {
            var seriesData = seriesModel.getData();
            if (seriesData) {
                each(seriesModel.coordDimToDataDim(axisDim), function (dim) {
                    var seriesExtent = seriesData.getDataExtent(dim);
                    seriesExtent[0] < dataExtent[0] && (dataExtent[0] = seriesExtent[0]);
                    seriesExtent[1] > dataExtent[1] && (dataExtent[1] = seriesExtent[1]);
                });
            }
        });
 
        if (dataExtent[1] < dataExtent[0]) {
            dataExtent = [NaN, NaN];
        }
 
        // It is important to get "consistent" extent when more then one axes is
        // controlled by a `dataZoom`, otherwise those axes will not be synchronized
        // when zooming. But it is difficult to know what is "consistent", considering
        // axes have different type or even different meanings (For example, two
        // time axes are used to compare data of the same date in different years).
        // So basically dataZoom just obtains extent by series.data (in category axis
        // extent can be obtained from axis.data).
        // Nevertheless, user can set min/max/scale on axes to make extent of axes
        // consistent.
        fixExtentByAxis(axisProxy, dataExtent);
 
        return dataExtent;
    }
 
    function fixExtentByAxis(axisProxy, dataExtent) {
        var axisModel = axisProxy.getAxisModel();
        var min = axisModel.getMin(true);
 
        // For category axis, if min/max/scale are not set, extent is determined
        // by axis.data by default.
        var isCategoryAxis = axisModel.get('type') === 'category';
        var axisDataLen = isCategoryAxis && (axisModel.get('data') || []).length;
 
        if (min != null && min !== 'dataMin') {
            dataExtent[0] = min;
        }
        else if (isCategoryAxis) {
            dataExtent[0] = axisDataLen > 0 ? 0 : NaN;
        }
 
        var max = axisModel.getMax(true);
        if (max != null && max !== 'dataMax') {
            dataExtent[1] = max;
        }
        else if (isCategoryAxis) {
            dataExtent[1] = axisDataLen > 0 ? axisDataLen - 1 : NaN;
        }
 
        if (!axisModel.get('scale', true)) {
            dataExtent[0] > 0 && (dataExtent[0] = 0);
            dataExtent[1] < 0 && (dataExtent[1] = 0);
        }
 
        // For value axis, if min/max/scale are not set, we just use the extent obtained
        // by series data, which may be a little different from the extent calculated by
        // `axisHelper.getScaleExtent`. But the different just affects the experience a
        // little when zooming. So it will not be fixed until some users require it strongly.
 
        return dataExtent;
    }
 
    function setAxisModel(axisProxy, isRestore) {
        var axisModel = axisProxy.getAxisModel();
 
        var percentWindow = axisProxy._percentWindow;
        var valueWindow = axisProxy._valueWindow;
 
        if (!percentWindow) {
            return;
        }
 
        // [0, 500]: arbitrary value, guess axis extent.
        var precision = numberUtil.getPixelPrecision(valueWindow, [0, 500]);
        // isRestore or isFull
        var useOrigin = isRestore || (percentWindow[0] === 0 && percentWindow[1] === 100);
 
        axisModel.setRange(
            useOrigin ? null : +valueWindow[0].toFixed(precision),
            useOrigin ? null : +valueWindow[1].toFixed(precision)
        );
    }
 
    module.exports = AxisProxy;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/DataZoomModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/DataZoomModel.js

Statements: 7.5% (12 / 160)      Branches: 0% (0 / 98)      Functions: 0% (0 / 37)      Lines: 7.5% (12 / 160)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530          1 1 1 1 1 1 1 1   1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               1                     1                         1      
/**
 * @file Data zoom model
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
    var env = require('zrender/lib/core/env');
    var echarts = require('../../echarts');
    var modelUtil = require('../../util/model');
    var helper = require('./helper');
    var AxisProxy = require('./AxisProxy');
    var each = zrUtil.each;
    var eachAxisDim = helper.eachAxisDim;
 
    var DataZoomModel = echarts.extendComponentModel({
 
        type: 'dataZoom',
 
        dependencies: [
            'xAxis', 'yAxis', 'zAxis', 'radiusAxis', 'angleAxis', 'singleAxis', 'series'
        ],
 
        /**
         * @protected
         */
        defaultOption: {
            zlevel: 0,
            z: 4,                   // Higher than normal component (z: 2).
            orient: null,           // Default auto by axisIndex. Possible value: 'horizontal', 'vertical'.
            xAxisIndex: null,       // Default the first horizontal category axis.
            yAxisIndex: null,       // Default the first vertical category axis.
 
            filterMode: 'filter',   // Possible values: 'filter' or 'empty'.
                                    // 'filter': data items which are out of window will be removed.
                                    //           This option is applicable when filtering outliers.
                                    // 'empty': data items which are out of window will be set to empty.
                                    //          This option is applicable when user should not neglect
                                    //          that there are some data items out of window.
                                    // Taking line chart as an example, line will be broken in
                                    // the filtered points when filterModel is set to 'empty', but
                                    // be connected when set to 'filter'.
 
            throttle: null,         // Dispatch action by the fixed rate, avoid frequency.
                                    // default 100. Do not throttle when use null/undefined.
                                    // If animation === true and animationDurationUpdate > 0,
                                    // default value is 100, otherwise 20.
            start: 0,               // Start percent. 0 ~ 100
            end: 100,               // End percent. 0 ~ 100
            startValue: null,       // Start value. If startValue specified, start is ignored.
            endValue: null          // End value. If endValue specified, end is ignored.
        },
 
        /**
         * @override
         */
        init: function (option, parentModel, ecModel) {
 
            /**
             * key like x_0, y_1
             * @private
             * @type {Object}
             */
            this._dataIntervalByAxis = {};
 
            /**
             * @private
             */
            this._dataInfo = {};
 
            /**
             * key like x_0, y_1
             * @private
             */
            this._axisProxies = {};
 
            /**
             * @readOnly
             */
            this.textStyleModel;
 
            /**
             * @private
             */
            this._autoThrottle = true;
 
            /**
             * 'percent' or 'value'
             * @private
             */
            this._rangePropMode = ['percent', 'percent'];
 
            var rawOption = retrieveRaw(option);
 
            this.mergeDefaultAndTheme(option, ecModel);
 
            this.doInit(rawOption);
        },
 
        /**
         * @override
         */
        mergeOption: function (newOption) {
            var rawOption = retrieveRaw(newOption);
 
            //FIX #2591
            zrUtil.merge(this.option, newOption, true);
 
            this.doInit(rawOption);
        },
 
        /**
         * @protected
         */
        doInit: function (rawOption) {
            var thisOption = this.option;
 
            // Disable realtime view update if canvas is not supported.
            if (!env.canvasSupported) {
                thisOption.realtime = false;
            }
 
            this._setDefaultThrottle(rawOption);
 
            updateRangeUse(this, rawOption);
 
            each([['start', 'startValue'], ['end', 'endValue']], function (names, index) {
                // start/end has higher priority over startValue/endValue if they
                // both set, but we should make chart.setOption({endValue: 1000})
                // effective, rather than chart.setOption({endValue: 1000, end: null}).
                if (this._rangePropMode[index] === 'value') {
                    thisOption[names[0]] = null;
                }
                // Otherwise do nothing and use the merge result.
            }, this);
 
            this.textStyleModel = this.getModel('textStyle');
 
            this._resetTarget();
 
            this._giveAxisProxies();
        },
 
        /**
         * @private
         */
        _giveAxisProxies: function () {
            var axisProxies = this._axisProxies;
 
            this.eachTargetAxis(function (dimNames, axisIndex, dataZoomModel, ecModel) {
                var axisModel = this.dependentModels[dimNames.axis][axisIndex];
 
                // If exists, share axisProxy with other dataZoomModels.
                var axisProxy = axisModel.__dzAxisProxy || (
                    // Use the first dataZoomModel as the main model of axisProxy.
                    axisModel.__dzAxisProxy = new AxisProxy(
                        dimNames.name, axisIndex, this, ecModel
                    )
                );
                // FIXME
                // dispose __dzAxisProxy
 
                axisProxies[dimNames.name + '_' + axisIndex] = axisProxy;
            }, this);
        },
 
        /**
         * @private
         */
        _resetTarget: function () {
            var thisOption = this.option;
 
            var autoMode = this._judgeAutoMode();
 
            eachAxisDim(function (dimNames) {
                var axisIndexName = dimNames.axisIndex;
                thisOption[axisIndexName] = modelUtil.normalizeToArray(
                    thisOption[axisIndexName]
                );
            }, this);
 
            if (autoMode === 'axisIndex') {
                this._autoSetAxisIndex();
            }
            else if (autoMode === 'orient') {
                this._autoSetOrient();
            }
        },
 
        /**
         * @private
         */
        _judgeAutoMode: function () {
            // Auto set only works for setOption at the first time.
            // The following is user's reponsibility. So using merged
            // option is OK.
            var thisOption = this.option;
 
            var hasIndexSpecified = false;
            eachAxisDim(function (dimNames) {
                // When user set axisIndex as a empty array, we think that user specify axisIndex
                // but do not want use auto mode. Because empty array may be encountered when
                // some error occured.
                if (thisOption[dimNames.axisIndex] != null) {
                    hasIndexSpecified = true;
                }
            }, this);
 
            var orient = thisOption.orient;
 
            if (orient == null && hasIndexSpecified) {
                return 'orient';
            }
            else if (!hasIndexSpecified) {
                if (orient == null) {
                    thisOption.orient = 'horizontal';
                }
                return 'axisIndex';
            }
        },
 
        /**
         * @private
         */
        _autoSetAxisIndex: function () {
            var autoAxisIndex = true;
            var orient = this.get('orient', true);
            var thisOption = this.option;
            var dependentModels = this.dependentModels;
 
            if (autoAxisIndex) {
                // Find axis that parallel to dataZoom as default.
                var dimName = orient === 'vertical' ? 'y' : 'x';
 
                if (dependentModels[dimName + 'Axis'].length) {
                    thisOption[dimName + 'AxisIndex'] = [0];
                    autoAxisIndex = false;
                }
                else {
                    each(dependentModels.singleAxis, function (singleAxisModel) {
                        if (autoAxisIndex && singleAxisModel.get('orient', true) === orient) {
                            thisOption.singleAxisIndex = [singleAxisModel.componentIndex];
                            autoAxisIndex = false;
                        }
                    });
                }
            }
 
            if (autoAxisIndex) {
                // Find the first category axis as default. (consider polar)
                eachAxisDim(function (dimNames) {
                    if (!autoAxisIndex) {
                        return;
                    }
                    var axisIndices = [];
                    var axisModels = this.dependentModels[dimNames.axis];
                    if (axisModels.length && !axisIndices.length) {
                        for (var i = 0, len = axisModels.length; i < len; i++) {
                            if (axisModels[i].get('type') === 'category') {
                                axisIndices.push(i);
                            }
                        }
                    }
                    thisOption[dimNames.axisIndex] = axisIndices;
                    if (axisIndices.length) {
                        autoAxisIndex = false;
                    }
                }, this);
            }
 
            if (autoAxisIndex) {
                // FIXME
                // 这里是兼容ec2的写法(没指定xAxisIndex和yAxisIndex时把scatter和双数值轴折柱纳入dataZoom控制),
                // 但是实际是否需要Grid.js#getScaleByOption来判断(考虑time,log等axis type)?
 
                // If both dataZoom.xAxisIndex and dataZoom.yAxisIndex is not specified,
                // dataZoom component auto adopts series that reference to
                // both xAxis and yAxis which type is 'value'.
                this.ecModel.eachSeries(function (seriesModel) {
                    if (this._isSeriesHasAllAxesTypeOf(seriesModel, 'value')) {
                        eachAxisDim(function (dimNames) {
                            var axisIndices = thisOption[dimNames.axisIndex];
 
                            var axisIndex = seriesModel.get(dimNames.axisIndex);
                            var axisId = seriesModel.get(dimNames.axisId);
 
                            var axisModel = seriesModel.ecModel.queryComponents({
                                mainType: dimNames.axis,
                                index: axisIndex,
                                id: axisId
                            })[0];
 
                            if (__DEV__) {
                                if (!axisModel) {
                                    throw new Error(
                                        dimNames.axis + ' "' + zrUtil.retrieve(
                                            axisIndex,
                                            axisId,
                                            0
                                        ) + '" not found'
                                    );
                                }
                            }
                            axisIndex = axisModel.componentIndex;
 
                            if (zrUtil.indexOf(axisIndices, axisIndex) < 0) {
                                axisIndices.push(axisIndex);
                            }
                        });
                    }
                }, this);
            }
        },
 
        /**
         * @private
         */
        _autoSetOrient: function () {
            var dim;
 
            // Find the first axis
            this.eachTargetAxis(function (dimNames) {
                !dim && (dim = dimNames.name);
            }, this);
 
            this.option.orient = dim === 'y' ? 'vertical' : 'horizontal';
        },
 
        /**
         * @private
         */
        _isSeriesHasAllAxesTypeOf: function (seriesModel, axisType) {
            // FIXME
            // 需要series的xAxisIndex和yAxisIndex都首先自动设置上。
            // 例如series.type === scatter时。
 
            var is = true;
            eachAxisDim(function (dimNames) {
                var seriesAxisIndex = seriesModel.get(dimNames.axisIndex);
                var axisModel = this.dependentModels[dimNames.axis][seriesAxisIndex];
 
                if (!axisModel || axisModel.get('type') !== axisType) {
                    is = false;
                }
            }, this);
            return is;
        },
 
        /**
         * @private
         */
        _setDefaultThrottle: function (rawOption) {
            // When first time user set throttle, auto throttle ends.
            if (rawOption.hasOwnProperty('throttle')) {
                this._autoThrottle = false;
            }
            if (this._autoThrottle) {
                var globalOption = this.ecModel.option;
                this.option.throttle =
                    (globalOption.animation && globalOption.animationDurationUpdate > 0)
                    ? 100 : 20;
            }
        },
 
        /**
         * @public
         */
        getFirstTargetAxisModel: function () {
            var firstAxisModel;
            eachAxisDim(function (dimNames) {
                if (firstAxisModel == null) {
                    var indices = this.get(dimNames.axisIndex);
                    if (indices.length) {
                        firstAxisModel = this.dependentModels[dimNames.axis][indices[0]];
                    }
                }
            }, this);
 
            return firstAxisModel;
        },
 
        /**
         * @public
         * @param {Function} callback param: axisModel, dimNames, axisIndex, dataZoomModel, ecModel
         */
        eachTargetAxis: function (callback, context) {
            var ecModel = this.ecModel;
            eachAxisDim(function (dimNames) {
                each(
                    this.get(dimNames.axisIndex),
                    function (axisIndex) {
                        callback.call(context, dimNames, axisIndex, this, ecModel);
                    },
                    this
                );
            }, this);
        },
 
        /**
         * @param {string} dimName
         * @param {number} axisIndex
         * @return {module:echarts/component/dataZoom/AxisProxy} If not found, return null/undefined.
         */
        getAxisProxy: function (dimName, axisIndex) {
            return this._axisProxies[dimName + '_' + axisIndex];
        },
 
        /**
         * @param {string} dimName
         * @param {number} axisIndex
         * @return {module:echarts/model/Model} If not found, return null/undefined.
         */
        getAxisModel: function (dimName, axisIndex) {
            var axisProxy = this.getAxisProxy(dimName, axisIndex);
            return axisProxy && axisProxy.getAxisModel();
        },
 
        /**
         * If not specified, set to undefined.
         *
         * @public
         * @param {Object} opt
         * @param {number} [opt.start]
         * @param {number} [opt.end]
         * @param {number} [opt.startValue]
         * @param {number} [opt.endValue]
         * @param {boolean} [ignoreUpdateRangeUsg=false]
         */
        setRawRange: function (opt, ignoreUpdateRangeUsg) {
            each(['start', 'end', 'startValue', 'endValue'], function (name) {
                // If any of those prop is null/undefined, we should alos set
                // them, because only one pair between start/end and
                // startValue/endValue can work.
                this.option[name] = opt[name];
            }, this);
 
            !ignoreUpdateRangeUsg && updateRangeUse(this, opt);
        },
 
        /**
         * @public
         * @return {Array.<number>} [startPercent, endPercent]
         */
        getPercentRange: function () {
            var axisProxy = this.findRepresentativeAxisProxy();
            if (axisProxy) {
                return axisProxy.getDataPercentWindow();
            }
        },
 
        /**
         * @public
         * For example, chart.getModel().getComponent('dataZoom').getValueRange('y', 0);
         *
         * @param {string} [axisDimName]
         * @param {number} [axisIndex]
         * @return {Array.<number>} [startValue, endValue] value can only be '-' or finite number.
         */
        getValueRange: function (axisDimName, axisIndex) {
            if (axisDimName == null && axisIndex == null) {
                var axisProxy = this.findRepresentativeAxisProxy();
                if (axisProxy) {
                    return axisProxy.getDataValueWindow();
                }
            }
            else {
                return this.getAxisProxy(axisDimName, axisIndex).getDataValueWindow();
            }
        },
 
        /**
         * @public
         * @return {module:echarts/component/dataZoom/AxisProxy}
         */
        findRepresentativeAxisProxy: function () {
            // Find the first hosted axisProxy
            var axisProxies = this._axisProxies;
            for (var key in axisProxies) {
                if (axisProxies.hasOwnProperty(key) && axisProxies[key].hostedBy(this)) {
                    return axisProxies[key];
                }
            }
 
            // If no hosted axis find not hosted axisProxy.
            // Consider this case: dataZoomModel1 and dataZoomModel2 control the same axis,
            // and the option.start or option.end settings are different. The percentRange
            // should follow axisProxy.
            // (We encounter this problem in toolbox data zoom.)
            for (var key in axisProxies) {
                if (axisProxies.hasOwnProperty(key) && !axisProxies[key].hostedBy(this)) {
                    return axisProxies[key];
                }
            }
        },
 
        /**
         * @return {Array.<string>}
         */
        getRangePropMode: function () {
            return this._rangePropMode.slice();
        }
    });
 
    function retrieveRaw(option) {
        var ret = {};
        each(
            ['start', 'end', 'startValue', 'endValue', 'throttle'],
            function (name) {
                option.hasOwnProperty(name) && (ret[name] = option[name]);
            }
        );
        return ret;
    }
 
    function updateRangeUse(dataZoomModel, rawOption) {
        each([['start', 'startValue'], ['end', 'endValue']], function (names, index) {
            var rangePropMode = dataZoomModel._rangePropMode;
            if (rawOption[names[0]] != null) {
                rangePropMode[index] = 'percent';
            }
            else if (rawOption[names[1]] != null) {
                rangePropMode[index] = 'value';
            }
            // else remain its original setting.
        });
    }
 
    module.exports = DataZoomModel;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/DataZoomView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/DataZoomView.js

Statements: 13.04% (3 / 23)      Branches: 0% (0 / 10)      Functions: 0% (0 / 4)      Lines: 13.04% (3 / 23)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73    1   1                                                                                           1                                            
 
 
    var ComponentView = require('../../view/Component');
 
    module.exports = ComponentView.extend({
 
        type: 'dataZoom',
 
        render: function (dataZoomModel, ecModel, api, payload) {
            this.dataZoomModel = dataZoomModel;
            this.ecModel = ecModel;
            this.api = api;
        },
 
        /**
         * Find the first target coordinate system.
         *
         * @protected
         * @return {Object} {
         *                   grid: [
         *                       {model: coord0, axisModels: [axis1, axis3], coordIndex: 1},
         *                       {model: coord1, axisModels: [axis0, axis2], coordIndex: 0},
         *                       ...
         *                   ],  // cartesians must not be null/undefined.
         *                   polar: [
         *                       {model: coord0, axisModels: [axis4], coordIndex: 0},
         *                       ...
         *                   ],  // polars must not be null/undefined.
         *                   singleAxis: [
         *                       {model: coord0, axisModels: [], coordIndex: 0}
         *                   ]
         */
        getTargetCoordInfo: function () {
            var dataZoomModel = this.dataZoomModel;
            var ecModel = this.ecModel;
            var coordSysLists = {};
 
            dataZoomModel.eachTargetAxis(function (dimNames, axisIndex) {
                var axisModel = ecModel.getComponent(dimNames.axis, axisIndex);
                if (axisModel) {
                    var coordModel = axisModel.getCoordSysModel();
                    coordModel && save(
                        coordModel,
                        axisModel,
                        coordSysLists[coordModel.mainType] || (coordSysLists[coordModel.mainType] = []),
                        coordModel.componentIndex
                    );
                }
            }, this);
 
            function save(coordModel, axisModel, store, coordIndex) {
                var item;
                for (var i = 0; i < store.length; i++) {
                    if (store[i].model === coordModel) {
                        item = store[i];
                        break;
                    }
                }
                if (!item) {
                    store.push(item = {
                        model: coordModel, axisModels: [], coordIndex: coordIndex
                    });
                }
                item.axisModels.push(axisModel);
            }
 
            return coordSysLists;
        }
 
    });
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/InsideZoomModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/InsideZoomModel.js

Statements: 100% (1 / 1)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (1 / 1)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19          1                          
/**
 * @file Data zoom model
 */
 
 
    module.exports = require('./DataZoomModel').extend({
 
        type: 'dataZoom.inside',
 
        /**
         * @protected
         */
        defaultOption: {
            disabled: false,   // Whether disable this inside zoom.
            zoomLock: false  // Whether disable zoom but only pan.
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/InsideZoomView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/InsideZoomView.js

Statements: 9.28% (9 / 97)      Branches: 0% (0 / 44)      Functions: 0% (0 / 13)      Lines: 9.28% (9 / 97)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232    1 1 1 1 1   1                                                                                                                                                                                                                                                                   1                                                                                                                                                           1                         1    
 
 
    var DataZoomView = require('./DataZoomView');
    var zrUtil = require('zrender/lib/core/util');
    var sliderMove = require('../helper/sliderMove');
    var roams = require('./roams');
    var bind = zrUtil.bind;
 
    var InsideZoomView = DataZoomView.extend({
 
        type: 'dataZoom.inside',
 
        /**
         * @override
         */
        init: function (ecModel, api) {
            /**
             * 'throttle' is used in this.dispatchAction, so we save range
             * to avoid missing some 'pan' info.
             * @private
             * @type {Array.<number>}
             */
            this._range;
        },
 
        /**
         * @override
         */
        render: function (dataZoomModel, ecModel, api, payload) {
            InsideZoomView.superApply(this, 'render', arguments);
 
            // Notice: origin this._range should be maintained, and should not be re-fetched
            // from dataZoomModel when payload.type is 'dataZoom', otherwise 'pan' or 'zoom'
            // info will be missed because of 'throttle' of this.dispatchAction.
            if (roams.shouldRecordRange(payload, dataZoomModel.id)) {
                this._range = dataZoomModel.getPercentRange();
            }
 
            // Reset controllers.
            zrUtil.each(this.getTargetCoordInfo(), function (coordInfoList, coordSysName) {
 
                var allCoordIds = zrUtil.map(coordInfoList, function (coordInfo) {
                    return roams.generateCoordId(coordInfo.model);
                });
 
                zrUtil.each(coordInfoList, function (coordInfo) {
                    var coordModel = coordInfo.model;
 
                    roams.register(
                        api,
                        {
                            coordId: roams.generateCoordId(coordModel),
                            allCoordIds: allCoordIds,
                            containsPoint: function (e, x, y) {
                                return coordModel.coordinateSystem.containPoint([x, y]);
                            },
                            dataZoomId: dataZoomModel.id,
                            throttleRate: dataZoomModel.get('throttle', true),
                            panGetRange: bind(this._onPan, this, coordInfo, coordSysName),
                            zoomGetRange: bind(this._onZoom, this, coordInfo, coordSysName)
                        }
                    );
                }, this);
 
            }, this);
        },
 
        /**
         * @override
         */
        dispose: function () {
            roams.unregister(this.api, this.dataZoomModel.id);
            InsideZoomView.superApply(this, 'dispose', arguments);
            this._range = null;
        },
 
        /**
         * @private
         */
        _onPan: function (coordInfo, coordSysName, controller, dx, dy, oldX, oldY, newX, newY) {
            if (this.dataZoomModel.option.disabled) {
                return this._range;
            }
 
            var range = this._range.slice();
 
            // Calculate transform by the first axis.
            var axisModel = coordInfo.axisModels[0];
            if (!axisModel) {
                return;
            }
 
            var directionInfo = getDirectionInfo[coordSysName](
                [oldX, oldY], [newX, newY], axisModel, controller, coordInfo
            );
 
            var percentDelta = directionInfo.signal
                * (range[1] - range[0])
                * directionInfo.pixel / directionInfo.pixelLength;
 
            sliderMove(percentDelta, range, [0, 100], 'rigid');
 
            return (this._range = range);
        },
 
        /**
         * @private
         */
        _onZoom: function (coordInfo, coordSysName, controller, scale, mouseX, mouseY) {
            var option = this.dataZoomModel.option;
 
            if (option.disabled || option.zoomLock) {
                return this._range;
            }
 
            var range = this._range.slice();
 
            // Calculate transform by the first axis.
            var axisModel = coordInfo.axisModels[0];
            if (!axisModel) {
                return;
            }
 
            var directionInfo = getDirectionInfo[coordSysName](
                null, [mouseX, mouseY], axisModel, controller, coordInfo
            );
 
            var percentPoint = (directionInfo.pixel - directionInfo.pixelStart) /
                directionInfo.pixelLength * (range[1] - range[0]) + range[0];
 
            scale = Math.max(1 / scale, 0);
            range[0] = (range[0] - percentPoint) * scale + percentPoint;
            range[1] = (range[1] - percentPoint) * scale + percentPoint;
            return (this._range = fixRange(range));
        }
 
    });
 
    var getDirectionInfo = {
 
        grid: function (oldPoint, newPoint, axisModel, controller, coordInfo) {
            var axis = axisModel.axis;
            var ret = {};
            var rect = coordInfo.model.coordinateSystem.getRect();
            oldPoint = oldPoint || [0, 0];
 
            if (axis.dim === 'x') {
                ret.pixel = newPoint[0] - oldPoint[0];
                ret.pixelLength = rect.width;
                ret.pixelStart = rect.x;
                ret.signal = axis.inverse ? 1 : -1;
            }
            else { // axis.dim === 'y'
                ret.pixel = newPoint[1] - oldPoint[1];
                ret.pixelLength = rect.height;
                ret.pixelStart = rect.y;
                ret.signal = axis.inverse ? -1 : 1;
            }
 
            return ret;
        },
 
        polar: function (oldPoint, newPoint, axisModel, controller, coordInfo) {
            var axis = axisModel.axis;
            var ret = {};
            var polar = coordInfo.model.coordinateSystem;
            var radiusExtent = polar.getRadiusAxis().getExtent();
            var angleExtent = polar.getAngleAxis().getExtent();
 
            oldPoint = oldPoint ? polar.pointToCoord(oldPoint) : [0, 0];
            newPoint = polar.pointToCoord(newPoint);
 
            if (axisModel.mainType === 'radiusAxis') {
                ret.pixel = newPoint[0] - oldPoint[0];
                // ret.pixelLength = Math.abs(radiusExtent[1] - radiusExtent[0]);
                // ret.pixelStart = Math.min(radiusExtent[0], radiusExtent[1]);
                ret.pixelLength = radiusExtent[1] - radiusExtent[0];
                ret.pixelStart = radiusExtent[0];
                ret.signal = axis.inverse ? 1 : -1;
            }
            else { // 'angleAxis'
                ret.pixel = newPoint[1] - oldPoint[1];
                // ret.pixelLength = Math.abs(angleExtent[1] - angleExtent[0]);
                // ret.pixelStart = Math.min(angleExtent[0], angleExtent[1]);
                ret.pixelLength = angleExtent[1] - angleExtent[0];
                ret.pixelStart = angleExtent[0];
                ret.signal = axis.inverse ? -1 : 1;
            }
 
            return ret;
        },
 
        singleAxis: function (oldPoint, newPoint, axisModel, controller, coordInfo) {
            var axis = axisModel.axis;
            var rect = coordInfo.model.coordinateSystem.getRect();
            var ret = {};
 
            oldPoint = oldPoint || [0, 0];
 
            if (axis.orient === 'horizontal') {
                ret.pixel = newPoint[0] - oldPoint[0];
                ret.pixelLength = rect.width;
                ret.pixelStart = rect.x;
                ret.signal = axis.inverse ? 1 : -1;
            }
            else { // 'vertical'
                ret.pixel = newPoint[1] - oldPoint[1];
                ret.pixelLength = rect.height;
                ret.pixelStart = rect.y;
                ret.signal = axis.inverse ? -1 : 1;
            }
 
            return ret;
        }
    };
 
    function fixRange(range) {
        // Clamp, using !(<= or >=) to handle NaN.
        // jshint ignore:start
        var bound = [0, 100];
        !(range[0] <= bound[1]) && (range[0] = bound[1]);
        !(range[1] <= bound[1]) && (range[1] = bound[1]);
        !(range[0] >= bound[0]) && (range[0] = bound[0]);
        !(range[1] >= bound[0]) && (range[1] = bound[0]);
        // jshint ignore:end
 
        return range;
    }
 
    module.exports = InsideZoomView;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/SelectZoomModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/SelectZoomModel.js

Statements: 100% (2 / 2)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (2 / 2)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15          1   1              
/**
 * @file Data zoom model
 */
 
 
    var DataZoomModel = require('./DataZoomModel');
 
    module.exports = DataZoomModel.extend({
 
        type: 'dataZoom.select'
 
    });
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/SelectZoomView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/SelectZoomView.js

Statements: 100% (1 / 1)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (1 / 1)      Ignored: none     

1 2 3 4 5 6 7 8 9 10    1              
 
 
    module.exports = require('./DataZoomView').extend({
 
        type: 'dataZoom.select'
 
    });
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/SliderZoomModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/SliderZoomModel.js

Statements: 100% (3 / 3)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (3 / 3)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75          1   1                                                                                                                               1      
/**
 * @file Data zoom model
 */
 
 
    var DataZoomModel = require('./DataZoomModel');
 
    var SliderZoomModel = DataZoomModel.extend({
 
        type: 'dataZoom.slider',
 
        layoutMode: 'box',
 
        /**
         * @protected
         */
        defaultOption: {
            show: true,
 
            // ph => placeholder. Using placehoder here because
            // deault value can only be drived in view stage.
            right: 'ph',  // Default align to grid rect.
            top: 'ph',    // Default align to grid rect.
            width: 'ph',  // Default align to grid rect.
            height: 'ph', // Default align to grid rect.
            left: null,   // Default align to grid rect.
            bottom: null, // Default align to grid rect.
 
            backgroundColor: 'rgba(47,69,84,0)',    // Background of slider zoom component.
            // dataBackgroundColor: '#ddd',         // Background coor of data shadow and border of box,
                                                    // highest priority, remain for compatibility of
                                                    // previous version, but not recommended any more.
            dataBackground: {
                lineStyle: {
                    color: '#2f4554',
                    width: 0.5,
                    opacity: 0.3
                },
                areaStyle: {
                    color: 'rgba(47,69,84,0.3)',
                    opacity: 0.3
                }
            },
            borderColor: '#ddd',                    // border color of the box. For compatibility,
                                                    // if dataBackgroundColor is set, borderColor
                                                    // is ignored.
 
            fillerColor: 'rgba(167,183,204,0.4)',     // Color of selected area.
            // handleColor: 'rgba(89,170,216,0.95)',     // Color of handle.
            // handleIcon: 'path://M4.9,17.8c0-1.4,4.5-10.5,5.5-12.4c0-0.1,0.6-1.1,0.9-1.1c0.4,0,0.9,1,0.9,1.1c1.1,2.2,5.4,11,5.4,12.4v17.8c0,1.5-0.6,2.1-1.3,2.1H6.1c-0.7,0-1.3-0.6-1.3-2.1V17.8z',
            handleIcon: 'M8.2,13.6V3.9H6.3v9.7H3.1v14.9h3.3v9.7h1.8v-9.7h3.3V13.6H8.2z M9.7,24.4H4.8v-1.4h4.9V24.4z M9.7,19.1H4.8v-1.4h4.9V19.1z',
            // Percent of the slider height
            handleSize: '100%',
 
            handleStyle: {
                color: '#a7b7cc'
            },
 
            labelPrecision: null,
            labelFormatter: null,
            showDetail: true,
            showDataShadow: 'auto',                 // Default auto decision.
            realtime: true,
            zoomLock: false,                        // Whether disable zoom.
            textStyle: {
                color: '#333'
            }
        }
 
    });
 
    module.exports = SliderZoomModel;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/SliderZoomView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/SliderZoomView.js

Statements: 9.92% (24 / 242)      Branches: 0% (0 / 127)      Functions: 0% (0 / 34)      Lines: 9.92% (24 / 242)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766    1 1 1 1 1 1 1 1 1 1   1 1   1     1 1 1 1 1 1 1   1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 1                                                                                                                                                                                                                                                                                             1             1      
 
 
    var zrUtil = require('zrender/lib/core/util');
    var graphic = require('../../util/graphic');
    var throttle = require('../../util/throttle');
    var DataZoomView = require('./DataZoomView');
    var Rect = graphic.Rect;
    var numberUtil = require('../../util/number');
    var linearMap = numberUtil.linearMap;
    var layout = require('../../util/layout');
    var sliderMove = require('../helper/sliderMove');
    var eventTool = require('zrender/lib/core/event');
 
    var asc = numberUtil.asc;
    var bind = zrUtil.bind;
    // var mathMax = Math.max;
    var each = zrUtil.each;
 
    // Constants
    var DEFAULT_LOCATION_EDGE_GAP = 7;
    var DEFAULT_FRAME_BORDER_WIDTH = 1;
    var DEFAULT_FILLER_SIZE = 30;
    var HORIZONTAL = 'horizontal';
    var VERTICAL = 'vertical';
    var LABEL_GAP = 5;
    var SHOW_DATA_SHADOW_SERIES_TYPE = ['line', 'bar', 'candlestick', 'scatter'];
 
    var SliderZoomView = DataZoomView.extend({
 
        type: 'dataZoom.slider',
 
        init: function (ecModel, api) {
 
            /**
             * @private
             * @type {Object}
             */
            this._displayables = {};
 
            /**
             * @private
             * @type {string}
             */
            this._orient;
 
            /**
             * [0, 100]
             * @private
             */
            this._range;
 
            /**
             * [coord of the first handle, coord of the second handle]
             * @private
             */
            this._handleEnds;
 
            /**
             * [length, thick]
             * @private
             * @type {Array.<number>}
             */
            this._size;
 
            /**
             * @private
             * @type {number}
             */
            this._handleWidth;
 
            /**
             * @private
             * @type {number}
             */
            this._handleHeight;
 
            /**
             * @private
             */
            this._location;
 
            /**
             * @private
             */
            this._dragging;
 
            /**
             * @private
             */
            this._dataShadowInfo;
 
            this.api = api;
        },
 
        /**
         * @override
         */
        render: function (dataZoomModel, ecModel, api, payload) {
            SliderZoomView.superApply(this, 'render', arguments);
 
            throttle.createOrUpdate(
                this,
                '_dispatchZoomAction',
                this.dataZoomModel.get('throttle'),
                'fixRate'
            );
 
            this._orient = dataZoomModel.get('orient');
 
            if (this.dataZoomModel.get('show') === false) {
                this.group.removeAll();
                return;
            }
 
            // Notice: this._resetInterval() should not be executed when payload.type
            // is 'dataZoom', origin this._range should be maintained, otherwise 'pan'
            // or 'zoom' info will be missed because of 'throttle' of this.dispatchAction,
            if (!payload || payload.type !== 'dataZoom' || payload.from !== this.uid) {
                this._buildView();
            }
 
            this._updateView();
        },
 
        /**
         * @override
         */
        remove: function () {
            SliderZoomView.superApply(this, 'remove', arguments);
            throttle.clear(this, '_dispatchZoomAction');
        },
 
        /**
         * @override
         */
        dispose: function () {
            SliderZoomView.superApply(this, 'dispose', arguments);
            throttle.clear(this, '_dispatchZoomAction');
        },
 
        _buildView: function () {
            var thisGroup = this.group;
 
            thisGroup.removeAll();
 
            this._resetLocation();
            this._resetInterval();
 
            var barGroup = this._displayables.barGroup = new graphic.Group();
 
            this._renderBackground();
 
            this._renderHandle();
 
            this._renderDataShadow();
 
            thisGroup.add(barGroup);
 
            this._positionGroup();
        },
 
        /**
         * @private
         */
        _resetLocation: function () {
            var dataZoomModel = this.dataZoomModel;
            var api = this.api;
 
            // If some of x/y/width/height are not specified,
            // auto-adapt according to target grid.
            var coordRect = this._findCoordRect();
            var ecSize = {width: api.getWidth(), height: api.getHeight()};
            // Default align by coordinate system rect.
            var positionInfo = this._orient === HORIZONTAL
                ? {
                    // Why using 'right', because right should be used in vertical,
                    // and it is better to be consistent for dealing with position param merge.
                    right: ecSize.width - coordRect.x - coordRect.width,
                    top: (ecSize.height - DEFAULT_FILLER_SIZE - DEFAULT_LOCATION_EDGE_GAP),
                    width: coordRect.width,
                    height: DEFAULT_FILLER_SIZE
                }
                : { // vertical
                    right: DEFAULT_LOCATION_EDGE_GAP,
                    top: coordRect.y,
                    width: DEFAULT_FILLER_SIZE,
                    height: coordRect.height
                };
 
            // Do not write back to option and replace value 'ph', because
            // the 'ph' value should be recalculated when resize.
            var layoutParams = layout.getLayoutParams(dataZoomModel.option);
 
            // Replace the placeholder value.
            zrUtil.each(['right', 'top', 'width', 'height'], function (name) {
                if (layoutParams[name] === 'ph') {
                    layoutParams[name] = positionInfo[name];
                }
            });
 
            var layoutRect = layout.getLayoutRect(
                layoutParams,
                ecSize,
                dataZoomModel.padding
            );
 
            this._location = {x: layoutRect.x, y: layoutRect.y};
            this._size = [layoutRect.width, layoutRect.height];
            this._orient === VERTICAL && this._size.reverse();
        },
 
        /**
         * @private
         */
        _positionGroup: function () {
            var thisGroup = this.group;
            var location = this._location;
            var orient = this._orient;
 
            // Just use the first axis to determine mapping.
            var targetAxisModel = this.dataZoomModel.getFirstTargetAxisModel();
            var inverse = targetAxisModel && targetAxisModel.get('inverse');
 
            var barGroup = this._displayables.barGroup;
            var otherAxisInverse = (this._dataShadowInfo || {}).otherAxisInverse;
 
            // Transform barGroup.
            barGroup.attr(
                (orient === HORIZONTAL && !inverse)
                ? {scale: otherAxisInverse ? [1, 1] : [1, -1]}
                : (orient === HORIZONTAL && inverse)
                ? {scale: otherAxisInverse ? [-1, 1] : [-1, -1]}
                : (orient === VERTICAL && !inverse)
                ? {scale: otherAxisInverse ? [1, -1] : [1, 1], rotation: Math.PI / 2}
                // Dont use Math.PI, considering shadow direction.
                : {scale: otherAxisInverse ? [-1, -1] : [-1, 1], rotation: Math.PI / 2}
            );
 
            // Position barGroup
            var rect = thisGroup.getBoundingRect([barGroup]);
            thisGroup.attr('position', [location.x - rect.x, location.y - rect.y]);
        },
 
        /**
         * @private
         */
        _getViewExtent: function () {
            return [0, this._size[0]];
        },
 
        _renderBackground : function () {
            var dataZoomModel = this.dataZoomModel;
            var size = this._size;
 
            this._displayables.barGroup.add(new Rect({
                silent: true,
                shape: {
                    x: 0, y: 0, width: size[0], height: size[1]
                },
                style: {
                    fill: dataZoomModel.get('backgroundColor')
                },
                z2: -40
            }));
        },
 
        _renderDataShadow: function () {
            var info = this._dataShadowInfo = this._prepareDataShadowInfo();
 
            if (!info) {
                return;
            }
 
            var size = this._size;
            var seriesModel = info.series;
            var data = seriesModel.getRawData();
            var otherDim = seriesModel.getShadowDim
                ? seriesModel.getShadowDim() // @see candlestick
                : info.otherDim;
 
            if (otherDim == null) {
                return;
            }
 
            var otherDataExtent = data.getDataExtent(otherDim);
            // Nice extent.
            var otherOffset = (otherDataExtent[1] - otherDataExtent[0]) * 0.3;
            otherDataExtent = [
                otherDataExtent[0] - otherOffset,
                otherDataExtent[1] + otherOffset
            ];
            var otherShadowExtent = [0, size[1]];
 
            var thisShadowExtent = [0, size[0]];
 
            var areaPoints = [[size[0], 0], [0, 0]];
            var linePoints = [];
            var step = thisShadowExtent[1] / (data.count() - 1);
            var thisCoord = 0;
 
            // Optimize for large data shadow
            var stride = Math.round(data.count() / size[0]);
            var lastIsEmpty;
            data.each([otherDim], function (value, index) {
                if (stride > 0 && (index % stride)) {
                    thisCoord += step;
                    return;
                }
 
                // FIXME
                // Should consider axis.min/axis.max when drawing dataShadow.
 
                // FIXME
                // 应该使用统一的空判断?还是在list里进行空判断?
                var isEmpty = value == null || isNaN(value) || value === '';
                // See #4235.
                var otherCoord = isEmpty
                    ? 0 : linearMap(value, otherDataExtent, otherShadowExtent, true);
 
                // Attempt to draw data shadow precisely when there are empty value.
                if (isEmpty && !lastIsEmpty && index) {
                    areaPoints.push([areaPoints[areaPoints.length - 1][0], 0]);
                    linePoints.push([linePoints[linePoints.length - 1][0], 0]);
                }
                else if (!isEmpty && lastIsEmpty) {
                    areaPoints.push([thisCoord, 0]);
                    linePoints.push([thisCoord, 0]);
                }
 
                areaPoints.push([thisCoord, otherCoord]);
                linePoints.push([thisCoord, otherCoord]);
 
                thisCoord += step;
                lastIsEmpty = isEmpty;
            });
 
            var dataZoomModel = this.dataZoomModel;
            // var dataBackgroundModel = dataZoomModel.getModel('dataBackground');
            this._displayables.barGroup.add(new graphic.Polygon({
                shape: {points: areaPoints},
                style: zrUtil.defaults(
                    {fill: dataZoomModel.get('dataBackgroundColor')},
                    dataZoomModel.getModel('dataBackground.areaStyle').getAreaStyle()
                ),
                silent: true,
                z2: -20
            }));
            this._displayables.barGroup.add(new graphic.Polyline({
                shape: {points: linePoints},
                style: dataZoomModel.getModel('dataBackground.lineStyle').getLineStyle(),
                silent: true,
                z2: -19
            }));
        },
 
        _prepareDataShadowInfo: function () {
            var dataZoomModel = this.dataZoomModel;
            var showDataShadow = dataZoomModel.get('showDataShadow');
 
            if (showDataShadow === false) {
                return;
            }
 
            // Find a representative series.
            var result;
            var ecModel = this.ecModel;
 
            dataZoomModel.eachTargetAxis(function (dimNames, axisIndex) {
                var seriesModels = dataZoomModel
                    .getAxisProxy(dimNames.name, axisIndex)
                    .getTargetSeriesModels();
 
                zrUtil.each(seriesModels, function (seriesModel) {
                    if (result) {
                        return;
                    }
 
                    if (showDataShadow !== true && zrUtil.indexOf(
                            SHOW_DATA_SHADOW_SERIES_TYPE, seriesModel.get('type')
                        ) < 0
                    ) {
                        return;
                    }
 
                    var thisAxis = ecModel.getComponent(dimNames.axis, axisIndex).axis;
                    var otherDim = getOtherDim(dimNames.name);
                    var otherAxisInverse;
                    var coordSys = seriesModel.coordinateSystem;
                    if (otherDim != null && coordSys.getOtherAxis) {
                        otherAxisInverse = coordSys.getOtherAxis(thisAxis).inverse;
                    }
 
                    result = {
                        thisAxis: thisAxis,
                        series: seriesModel,
                        thisDim: dimNames.name,
                        otherDim: otherDim,
                        otherAxisInverse: otherAxisInverse
                    };
 
                }, this);
 
            }, this);
 
            return result;
        },
 
        _renderHandle: function () {
            var displaybles = this._displayables;
            var handles = displaybles.handles = [];
            var handleLabels = displaybles.handleLabels = [];
            var barGroup = this._displayables.barGroup;
            var size = this._size;
            var dataZoomModel = this.dataZoomModel;
 
            barGroup.add(displaybles.filler = new Rect({
                draggable: true,
                cursor: 'move',
                drift: bind(this._onDragMove, this, 'all'),
                onmousemove: function (e) {
                    // Fot mobile devicem, prevent screen slider on the button.
                    eventTool.stop(e.event);
                },
                ondragstart: bind(this._showDataInfo, this, true),
                ondragend: bind(this._onDragEnd, this),
                onmouseover: bind(this._showDataInfo, this, true),
                onmouseout: bind(this._showDataInfo, this, false),
                style: {
                    fill: dataZoomModel.get('fillerColor'),
                    textPosition : 'inside'
                }
            }));
 
            // Frame border.
            barGroup.add(new Rect(graphic.subPixelOptimizeRect({
                silent: true,
                shape: {
                    x: 0,
                    y: 0,
                    width: size[0],
                    height: size[1]
                },
                style: {
                    stroke: dataZoomModel.get('dataBackgroundColor')
                        || dataZoomModel.get('borderColor'),
                    lineWidth: DEFAULT_FRAME_BORDER_WIDTH,
                    fill: 'rgba(0,0,0,0)'
                }
            })));
 
            var iconStr = dataZoomModel.get('handleIcon');
            each([0, 1], function (handleIndex) {
                var path = graphic.makePath(iconStr, {
                    style: {
                        strokeNoScale: true
                    },
                    rectHover: true,
                    cursor: this._orient === 'vertical' ? 'ns-resize' : 'ew-resize',
                    draggable: true,
                    drift: bind(this._onDragMove, this, handleIndex),
                    onmousemove: function (e) {
                        // Fot mobile devicem, prevent screen slider on the button.
                        eventTool.stop(e.event);
                    },
                    ondragend: bind(this._onDragEnd, this),
                    onmouseover: bind(this._showDataInfo, this, true),
                    onmouseout: bind(this._showDataInfo, this, false)
                }, {
                    x: -0.5,
                    y: 0,
                    width: 1,
                    height: 1
                }, 'center');
 
                var bRect = path.getBoundingRect();
                this._handleHeight = numberUtil.parsePercent(dataZoomModel.get('handleSize'), this._size[1]);
                this._handleWidth = bRect.width / bRect.height * this._handleHeight;
 
                path.setStyle(dataZoomModel.getModel('handleStyle').getItemStyle());
                var handleColor = dataZoomModel.get('handleColor');
                // Compatitable with previous version
                if (handleColor != null) {
                    path.style.fill = handleColor;
                }
 
                barGroup.add(handles[handleIndex] = path);
 
                var textStyleModel = dataZoomModel.textStyleModel;
 
                this.group.add(
                    handleLabels[handleIndex] = new graphic.Text({
                    silent: true,
                    invisible: true,
                    style: {
                        x: 0, y: 0, text: '',
                        textVerticalAlign: 'middle',
                        textAlign: 'center',
                        fill: textStyleModel.getTextColor(),
                        textFont: textStyleModel.getFont()
                    },
                    z2: 10
                }));
 
            }, this);
        },
 
        /**
         * @private
         */
        _resetInterval: function () {
            var range = this._range = this.dataZoomModel.getPercentRange();
            var viewExtent = this._getViewExtent();
 
            this._handleEnds = [
                linearMap(range[0], [0, 100], viewExtent, true),
                linearMap(range[1], [0, 100], viewExtent, true)
            ];
        },
 
        /**
         * @private
         * @param {(number|string)} handleIndex 0 or 1 or 'all'
         * @param {number} dx
         * @param {number} dy
         */
        _updateInterval: function (handleIndex, delta) {
            var handleEnds = this._handleEnds;
            var viewExtend = this._getViewExtent();
 
            sliderMove(
                delta,
                handleEnds,
                viewExtend,
                (handleIndex === 'all' || this.dataZoomModel.get('zoomLock'))
                    ? 'rigid' : 'cross',
                handleIndex
            );
 
            this._range = asc([
                linearMap(handleEnds[0], viewExtend, [0, 100], true),
                linearMap(handleEnds[1], viewExtend, [0, 100], true)
            ]);
        },
 
        /**
         * @private
         */
        _updateView: function (nonRealtime) {
            var displaybles = this._displayables;
            var handleEnds = this._handleEnds;
            var handleInterval = asc(handleEnds.slice());
            var size = this._size;
 
            each([0, 1], function (handleIndex) {
                // Handles
                var handle = displaybles.handles[handleIndex];
                var handleHeight = this._handleHeight;
                handle.attr({
                    scale: [handleHeight, handleHeight],
                    position: [handleEnds[handleIndex], size[1] / 2 - handleHeight / 2]
                });
            }, this);
 
            // Filler
            displaybles.filler.setShape({
                x: handleInterval[0],
                y: 0,
                width: handleInterval[1] - handleInterval[0],
                height: size[1]
            });
 
            this._updateDataInfo(nonRealtime);
        },
 
        /**
         * @private
         */
        _updateDataInfo: function (nonRealtime) {
            var dataZoomModel = this.dataZoomModel;
            var displaybles = this._displayables;
            var handleLabels = displaybles.handleLabels;
            var orient = this._orient;
            var labelTexts = ['', ''];
 
            // FIXME
            // date型,支持formatter,autoformatter(ec2 date.getAutoFormatter)
            if (dataZoomModel.get('showDetail')) {
                var axisProxy = dataZoomModel.findRepresentativeAxisProxy();
 
                if (axisProxy) {
                    var axis = axisProxy.getAxisModel().axis;
                    var range = this._range;
 
                    var dataInterval = nonRealtime
                        // See #4434, data and axis are not processed and reset yet in non-realtime mode.
                        ? axisProxy.calculateDataWindow({
                            start: range[0], end: range[1]
                        }).valueWindow
                        : axisProxy.getDataValueWindow();
 
                    labelTexts = [
                        this._formatLabel(dataInterval[0], axis),
                        this._formatLabel(dataInterval[1], axis)
                    ];
                }
            }
 
            var orderedHandleEnds = asc(this._handleEnds.slice());
 
            setLabel.call(this, 0);
            setLabel.call(this, 1);
 
            function setLabel(handleIndex) {
                // Label
                // Text should not transform by barGroup.
                // Ignore handlers transform
                var barTransform = graphic.getTransform(
                    displaybles.handles[handleIndex].parent, this.group
                );
                var direction = graphic.transformDirection(
                    handleIndex === 0 ? 'right' : 'left', barTransform
                );
                var offset = this._handleWidth / 2 + LABEL_GAP;
                var textPoint = graphic.applyTransform(
                    [
                        orderedHandleEnds[handleIndex] + (handleIndex === 0 ? -offset : offset),
                        this._size[1] / 2
                    ],
                    barTransform
                );
                handleLabels[handleIndex].setStyle({
                    x: textPoint[0],
                    y: textPoint[1],
                    textVerticalAlign: orient === HORIZONTAL ? 'middle' : direction,
                    textAlign: orient === HORIZONTAL ? direction : 'center',
                    text: labelTexts[handleIndex]
                });
            }
        },
 
        /**
         * @private
         */
        _formatLabel: function (value, axis) {
            var dataZoomModel = this.dataZoomModel;
            var labelFormatter = dataZoomModel.get('labelFormatter');
 
            var labelPrecision = dataZoomModel.get('labelPrecision');
            if (labelPrecision == null || labelPrecision === 'auto') {
                labelPrecision = axis.getPixelPrecision();
            }
 
            var valueStr = (value == null || isNaN(value))
                ? ''
                // FIXME Glue code
                : (axis.type === 'category' || axis.type === 'time')
                    ? axis.scale.getLabel(Math.round(value))
                    // param of toFixed should less then 20.
                    : value.toFixed(Math.min(labelPrecision, 20));
 
            return zrUtil.isFunction(labelFormatter)
                ? labelFormatter(value, valueStr)
                : zrUtil.isString(labelFormatter)
                ? labelFormatter.replace('{value}', valueStr)
                : valueStr;
        },
 
        /**
         * @private
         * @param {boolean} showOrHide true: show, false: hide
         */
        _showDataInfo: function (showOrHide) {
            // Always show when drgging.
            showOrHide = this._dragging || showOrHide;
 
            var handleLabels = this._displayables.handleLabels;
            handleLabels[0].attr('invisible', !showOrHide);
            handleLabels[1].attr('invisible', !showOrHide);
        },
 
        _onDragMove: function (handleIndex, dx, dy) {
            this._dragging = true;
 
            // Transform dx, dy to bar coordination.
            var vertex = this._applyBarTransform([dx, dy], true);
 
            this._updateInterval(handleIndex, vertex[0]);
 
            var realtime = this.dataZoomModel.get('realtime');
 
            this._updateView(!realtime);
 
            if (realtime) {
                realtime && this._dispatchZoomAction();
            }
        },
 
        _onDragEnd: function () {
            this._dragging = false;
            this._showDataInfo(false);
            this._dispatchZoomAction();
        },
 
        /**
         * This action will be throttled.
         * @private
         */
        _dispatchZoomAction: function () {
            var range = this._range;
 
            this.api.dispatchAction({
                type: 'dataZoom',
                from: this.uid,
                dataZoomId: this.dataZoomModel.id,
                start: range[0],
                end: range[1]
            });
        },
 
        /**
         * @private
         */
        _applyBarTransform: function (vertex, inverse) {
            var barTransform = this._displayables.barGroup.getLocalTransform();
            return graphic.applyTransform(vertex, barTransform, inverse);
        },
 
        /**
         * @private
         */
        _findCoordRect: function () {
            // Find the grid coresponding to the first axis referred by dataZoom.
            var rect;
            each(this.getTargetCoordInfo(), function (coordInfoList) {
                if (!rect && coordInfoList.length) {
                    var coordSys = coordInfoList[0].model.coordinateSystem;
                    rect = coordSys.getRect && coordSys.getRect();
                }
            });
            if (!rect) {
                var width = this.api.getWidth();
                var height = this.api.getHeight();
                rect = {
                    x: width * 0.2,
                    y: height * 0.2,
                    width: width * 0.6,
                    height: height * 0.6
                };
            }
 
            return rect;
        }
 
    });
 
    function getOtherDim(thisDim) {
        // FIXME
        // 这个逻辑和getOtherAxis里一致,但是写在这里是否不好
        var map = {x: 'y', y: 'x', radius: 'angle', angle: 'radius'};
        return map[thisDim];
    }
 
    module.exports = SliderZoomView;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/dataZoomAction.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/dataZoomAction.js

Statements: 36.36% (4 / 11)      Branches: 100% (0 / 0)      Functions: 0% (0 / 4)      Lines: 36.36% (4 / 11)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44          1 1 1     1                                                                  
/**
 * @file Data zoom action
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
    var helper = require('./helper');
    var echarts = require('../../echarts');
 
 
    echarts.registerAction('dataZoom', function (payload, ecModel) {
 
        var linkedNodesFinder = helper.createLinkedNodesFinder(
            zrUtil.bind(ecModel.eachComponent, ecModel, 'dataZoom'),
            helper.eachAxisDim,
            function (model, dimNames) {
                return model.get(dimNames.axisIndex);
            }
        );
 
        var effectedModels = [];
 
        ecModel.eachComponent(
            {mainType: 'dataZoom', query: payload},
            function (model, index) {
                effectedModels.push.apply(
                    effectedModels, linkedNodesFinder(model).nodes
                );
            }
        );
 
        zrUtil.each(effectedModels, function (dataZoomModel, index) {
            dataZoomModel.setRawRange({
                start: payload.start,
                end: payload.end,
                startValue: payload.startValue,
                endValue: payload.endValue
            });
        });
 
    });
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/dataZoomProcessor.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/dataZoomProcessor.js

Statements: 28.57% (4 / 14)      Branches: 100% (0 / 0)      Functions: 0% (0 / 5)      Lines: 28.57% (4 / 14)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59          1   1                                                                                 1       1            
/**
 * @file Data zoom processor
 */
 
 
    var echarts = require('../../echarts');
 
    echarts.registerProcessor(function (ecModel, api) {
 
        ecModel.eachComponent('dataZoom', function (dataZoomModel) {
            // We calculate window and reset axis here but not in model
            // init stage and not after action dispatch handler, because
            // reset should be called after seriesData.restoreData.
            dataZoomModel.eachTargetAxis(resetSingleAxis);
 
            // Caution: data zoom filtering is order sensitive when using
            // percent range and no min/max/scale set on axis.
            // For example, we have dataZoom definition:
            // [
            //      {xAxisIndex: 0, start: 30, end: 70},
            //      {yAxisIndex: 0, start: 20, end: 80}
            // ]
            // In this case, [20, 80] of y-dataZoom should be based on data
            // that have filtered by x-dataZoom using range of [30, 70],
            // but should not be based on full raw data. Thus sliding
            // x-dataZoom will change both ranges of xAxis and yAxis,
            // while sliding y-dataZoom will only change the range of yAxis.
            // So we should filter x-axis after reset x-axis immediately,
            // and then reset y-axis and filter y-axis.
            dataZoomModel.eachTargetAxis(filterSingleAxis);
        });
 
        ecModel.eachComponent('dataZoom', function (dataZoomModel) {
            // Fullfill all of the range props so that user
            // is able to get them from chart.getOption().
            var axisProxy = dataZoomModel.findRepresentativeAxisProxy();
            var percentRange = axisProxy.getDataPercentWindow();
            var valueRange = axisProxy.getDataValueWindow();
 
            dataZoomModel.setRawRange({
                start: percentRange[0],
                end: percentRange[1],
                startValue: valueRange[0],
                endValue: valueRange[1]
            }, true);
        });
    });
 
    function resetSingleAxis(dimNames, axisIndex, dataZoomModel) {
        dataZoomModel.getAxisProxy(dimNames.name, axisIndex).reset(dataZoomModel);
    }
 
    function filterSingleAxis(dimNames, axisIndex, dataZoomModel) {
        dataZoomModel.getAxisProxy(dimNames.name, axisIndex).filterData(dataZoomModel);
    }
 
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/helper.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/helper.js

Statements: 38% (19 / 50)      Branches: 7.14% (1 / 14)      Functions: 6.67% (1 / 15)      Lines: 38% (19 / 50)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134  1 1   1   1   1           1                       1 1 1 1 1   1                                                     1                         1                                                 1                   1       1                   1                   1    
 
    var formatUtil = require('../../util/format');
    var zrUtil = require('zrender/lib/core/util');
 
    var helper = {};
 
    var AXIS_DIMS = ['x', 'y', 'z', 'radius', 'angle', 'single'];
    // Supported coords.
    var COORDS = ['cartesian2d', 'polar', 'singleAxis'];
 
    /**
     * @param {string} coordType
     * @return {boolean}
     */
    helper.isCoordSupported = function (coordType) {
        return zrUtil.indexOf(COORDS, coordType) >= 0;
    };
 
    /**
     * Create "each" method to iterate names.
     *
     * @pubilc
     * @param  {Array.<string>} names
     * @param  {Array.<string>=} attrs
     * @return {Function}
     */
    helper.createNameEach = function (names, attrs) {
        names = names.slice();
        var capitalNames = zrUtil.map(names, formatUtil.capitalFirst);
        attrs = (attrs || []).slice();
        var capitalAttrs = zrUtil.map(attrs, formatUtil.capitalFirst);
 
        return function (callback, context) {
            zrUtil.each(names, function (name, index) {
                var nameObj = {name: name, capital: capitalNames[index]};
 
                for (var j = 0; j < attrs.length; j++) {
                    nameObj[attrs[j]] = name + capitalAttrs[j];
                }
 
                callback.call(context, nameObj);
            });
        };
    };
 
    /**
     * Iterate each dimension name.
     *
     * @public
     * @param {Function} callback The parameter is like:
     *                            {
     *                                name: 'angle',
     *                                capital: 'Angle',
     *                                axis: 'angleAxis',
     *                                axisIndex: 'angleAixs',
     *                                index: 'angleIndex'
     *                            }
     * @param {Object} context
     */
    helper.eachAxisDim = helper.createNameEach(AXIS_DIMS, ['axisIndex', 'axis', 'index', 'id']);
 
    /**
     * If tow dataZoomModels has the same axis controlled, we say that they are 'linked'.
     * dataZoomModels and 'links' make up one or more graphics.
     * This function finds the graphic where the source dataZoomModel is in.
     *
     * @public
     * @param {Function} forEachNode Node iterator.
     * @param {Function} forEachEdgeType edgeType iterator
     * @param {Function} edgeIdGetter Giving node and edgeType, return an array of edge id.
     * @return {Function} Input: sourceNode, Output: Like {nodes: [], dims: {}}
     */
    helper.createLinkedNodesFinder = function (forEachNode, forEachEdgeType, edgeIdGetter) {
 
        return function (sourceNode) {
            var result = {
                nodes: [],
                records: {} // key: edgeType.name, value: Object (key: edge id, value: boolean).
            };
 
            forEachEdgeType(function (edgeType) {
                result.records[edgeType.name] = {};
            });
 
            if (!sourceNode) {
                return result;
            }
 
            absorb(sourceNode, result);
 
            var existsLink;
            do {
                existsLink = false;
                forEachNode(processSingleNode);
            }
            while (existsLink);
 
            function processSingleNode(node) {
                if (!isNodeAbsorded(node, result) && isLinked(node, result)) {
                    absorb(node, result);
                    existsLink = true;
                }
            }
 
            return result;
        };
 
        function isNodeAbsorded(node, result) {
            return zrUtil.indexOf(result.nodes, node) >= 0;
        }
 
        function isLinked(node, result) {
            var hasLink = false;
            forEachEdgeType(function (edgeType) {
                zrUtil.each(edgeIdGetter(node, edgeType) || [], function (edgeId) {
                    result.records[edgeType.name][edgeId] && (hasLink = true);
                });
            });
            return hasLink;
        }
 
        function absorb(node, result) {
            result.nodes.push(node);
            forEachEdgeType(function (edgeType) {
                zrUtil.each(edgeIdGetter(node, edgeType) || [], function (edgeId) {
                    result.records[edgeType.name][edgeId] = true;
                });
            });
        }
    };
 
    module.exports = helper;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/history.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/history.js

Statements: 16.67% (6 / 36)      Branches: 0% (0 / 12)      Functions: 0% (0 / 7)      Lines: 16.67% (6 / 36)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110          1 1   1   1                                                                                                                                                                               1               1      
/**
 * @file History manager.
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
    var each = zrUtil.each;
 
    var ATTR = '\0_ec_hist_store';
 
    var history = {
 
        /**
         * @public
         * @param {module:echarts/model/Global} ecModel
         * @param {Object} newSnapshot {dataZoomId, batch: [payloadInfo, ...]}
         */
        push: function (ecModel, newSnapshot) {
            var store = giveStore(ecModel);
 
            // If previous dataZoom can not be found,
            // complete an range with current range.
            each(newSnapshot, function (batchItem, dataZoomId) {
                var i = store.length - 1;
                for (; i >= 0; i--) {
                    var snapshot = store[i];
                    if (snapshot[dataZoomId]) {
                        break;
                    }
                }
                if (i < 0) {
                    // No origin range set, create one by current range.
                    var dataZoomModel = ecModel.queryComponents(
                        {mainType: 'dataZoom', subType: 'select', id: dataZoomId}
                    )[0];
                    if (dataZoomModel) {
                        var percentRange = dataZoomModel.getPercentRange();
                        store[0][dataZoomId] = {
                            dataZoomId: dataZoomId,
                            start: percentRange[0],
                            end: percentRange[1]
                        };
                    }
                }
            });
 
            store.push(newSnapshot);
        },
 
        /**
         * @public
         * @param {module:echarts/model/Global} ecModel
         * @return {Object} snapshot
         */
        pop: function (ecModel) {
            var store = giveStore(ecModel);
            var head = store[store.length - 1];
            store.length > 1 && store.pop();
 
            // Find top for all dataZoom.
            var snapshot = {};
            each(head, function (batchItem, dataZoomId) {
                for (var i = store.length - 1; i >= 0; i--) {
                    var batchItem = store[i][dataZoomId];
                    if (batchItem) {
                        snapshot[dataZoomId] = batchItem;
                        break;
                    }
                }
            });
 
            return snapshot;
        },
 
        /**
         * @public
         */
        clear: function (ecModel) {
            ecModel[ATTR] = null;
        },
 
        /**
         * @public
         * @param {module:echarts/model/Global} ecModel
         * @return {number} records. always >= 1.
         */
        count: function (ecModel) {
            return giveStore(ecModel).length;
        }
 
    };
 
    /**
     * [{key: dataZoomId, value: {dataZoomId, range}}, ...]
     * History length of each dataZoom may be different.
     * this._history[0] is used to store origin range.
     * @type {Array.<Object>}
     */
    function giveStore(ecModel) {
        var store = ecModel[ATTR];
        if (!store) {
            store = ecModel[ATTR] = [{}];
        }
        return store;
    }
 
    module.exports = history;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/roams.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/roams.js

Statements: 20.9% (14 / 67)      Branches: 0% (0 / 23)      Functions: 0% (0 / 17)      Lines: 20.9% (14 / 67)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191                      1 1 1 1   1   1                                                                                                                                                                                                                     1             1                 1                 1           1           1                                   1             1      
/**
 * @file Roam controller manager.
 */
 
 
    // Only create one roam controller for each coordinate system.
    // one roam controller might be refered by two inside data zoom
    // components (for example, one for x and one for y). When user
    // pan or zoom, only dispatch one action for those data zoom
    // components.
 
    var zrUtil = require('zrender/lib/core/util');
    var RoamController = require('../../component/helper/RoamController');
    var throttle = require('../../util/throttle');
    var curry = zrUtil.curry;
 
    var ATTR = '\0_ec_dataZoom_roams';
 
    var roams = {
 
        /**
         * @public
         * @param {module:echarts/ExtensionAPI} api
         * @param {Object} dataZoomInfo
         * @param {string} dataZoomInfo.coordId
         * @param {Function} dataZoomInfo.containsPoint
         * @param {Array.<string>} dataZoomInfo.allCoordIds
         * @param {string} dataZoomInfo.dataZoomId
         * @param {number} dataZoomInfo.throttleRate
         * @param {Function} dataZoomInfo.panGetRange
         * @param {Function} dataZoomInfo.zoomGetRange
         */
        register: function (api, dataZoomInfo) {
            var store = giveStore(api);
            var theDataZoomId = dataZoomInfo.dataZoomId;
            var theCoordId = dataZoomInfo.coordId;
 
            // Do clean when a dataZoom changes its target coordnate system.
            // Avoid memory leak, dispose all not-used-registered.
            zrUtil.each(store, function (record, coordId) {
                var dataZoomInfos = record.dataZoomInfos;
                if (dataZoomInfos[theDataZoomId]
                    && zrUtil.indexOf(dataZoomInfo.allCoordIds, theCoordId) < 0
                ) {
                    delete dataZoomInfos[theDataZoomId];
                    record.count--;
                }
            });
 
            cleanStore(store);
 
            var record = store[theCoordId];
            // Create if needed.
            if (!record) {
                record = store[theCoordId] = {
                    coordId: theCoordId,
                    dataZoomInfos: {},
                    count: 0
                };
                record.controller = createController(api, dataZoomInfo, record);
                record.dispatchAction = zrUtil.curry(dispatchAction, api);
            }
 
            // Consider resize, area should be always updated.
            record.controller.setPointerChecker(dataZoomInfo.containsPoint);
 
            // Update throttle.
            throttle.createOrUpdate(
                record,
                'dispatchAction',
                dataZoomInfo.throttleRate,
                'fixRate'
            );
 
            // Update reference of dataZoom.
            !(record.dataZoomInfos[theDataZoomId]) && record.count++;
            record.dataZoomInfos[theDataZoomId] = dataZoomInfo;
        },
 
        /**
         * @public
         * @param {module:echarts/ExtensionAPI} api
         * @param {string} dataZoomId
         */
        unregister: function (api, dataZoomId) {
            var store = giveStore(api);
 
            zrUtil.each(store, function (record) {
                record.controller.dispose();
                var dataZoomInfos = record.dataZoomInfos;
                if (dataZoomInfos[dataZoomId]) {
                    delete dataZoomInfos[dataZoomId];
                    record.count--;
                }
            });
 
            cleanStore(store);
        },
 
        /**
         * @public
         */
        shouldRecordRange: function (payload, dataZoomId) {
            if (payload && payload.type === 'dataZoom' && payload.batch) {
                for (var i = 0, len = payload.batch.length; i < len; i++) {
                    if (payload.batch[i].dataZoomId === dataZoomId) {
                        return false;
                    }
                }
            }
            return true;
        },
 
        /**
         * @public
         */
        generateCoordId: function (coordModel) {
            return coordModel.type + '\0_' + coordModel.id;
        }
    };
 
    /**
     * Key: coordId, value: {dataZoomInfos: [], count, controller}
     * @type {Array.<Object>}
     */
    function giveStore(api) {
        // Mount store on zrender instance, so that we do not
        // need to worry about dispose.
        var zr = api.getZr();
        return zr[ATTR] || (zr[ATTR] = {});
    }
 
    function createController(api, dataZoomInfo, newRecord) {
        var controller = new RoamController(api.getZr());
        controller.enable();
        controller.on('pan', curry(onPan, newRecord));
        controller.on('zoom', curry(onZoom, newRecord));
 
        return controller;
    }
 
    function cleanStore(store) {
        zrUtil.each(store, function (record, coordId) {
            if (!record.count) {
                record.controller.dispose();
                delete store[coordId];
            }
        });
    }
 
    function onPan(record, dx, dy, oldX, oldY, newX, newY) {
        wrapAndDispatch(record, function (info) {
            return info.panGetRange(record.controller, dx, dy, oldX, oldY, newX, newY);
        });
    }
 
    function onZoom(record, scale, mouseX, mouseY) {
        wrapAndDispatch(record, function (info) {
            return info.zoomGetRange(record.controller, scale, mouseX, mouseY);
        });
    }
 
    function wrapAndDispatch(record, getRange) {
        var batch = [];
 
        zrUtil.each(record.dataZoomInfos, function (info) {
            var range = getRange(info);
            range && batch.push({
                dataZoomId: info.dataZoomId,
                start: range[0],
                end: range[1]
            });
        });
 
        record.dispatchAction(batch);
    }
 
    /**
     * This action will be throttled.
     */
    function dispatchAction(api, batch) {
        api.dispatchAction({
            type: 'dataZoom',
            batch: batch
        });
    }
 
    module.exports = roams;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/typeDefaulter.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/dataZoom/typeDefaulter.js

Statements: 50% (1 / 2)      Branches: 100% (0 / 0)      Functions: 0% (0 / 1)      Lines: 50% (1 / 2)      Ignored: none     

1 2 3 4 5 6 7 8 9    1            
 
 
    require('../../model/Component').registerSubTypeDefaulter('dataZoom', function (option) {
        // Default 'slider' when no type specified.
        return 'slider';
    });
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/geo/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/geo/

Statements: 15.38% (2 / 13)      Branches: 0% (0 / 9)      Functions: 0% (0 / 3)      Lines: 15.38% (2 / 13)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/component/geo/
File Statements Branches Functions Lines
GeoView.js 15.38% (2 / 13) 0% (0 / 9) 0% (0 / 3) 15.38% (2 / 13)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/geo/GeoView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/geo/GeoView.js

Statements: 15.38% (2 / 13)      Branches: 0% (0 / 9)      Functions: 0% (0 / 3)      Lines: 15.38% (2 / 13)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42      1   1                                                                        
'use strict';
 
 
    var MapDraw = require('../helper/MapDraw');
 
    module.exports = require('../../echarts').extendComponentView({
 
        type: 'geo',
 
        init: function (ecModel, api) {
            var mapDraw = new MapDraw(api, true);
            this._mapDraw = mapDraw;
 
            this.group.add(mapDraw.group);
        },
 
        render: function (geoModel, ecModel, api, payload) {
            // Not render if it is an toggleSelect action from self
            if (payload && payload.type === 'geoToggleSelect'
                && payload.from === this.uid
            ) {
                return;
            }
 
            var mapDraw = this._mapDraw;
            if (geoModel.get('show')) {
                mapDraw.draw(geoModel, ecModel, api, this, payload);
            }
            else {
                this._mapDraw.group.removeAll();
            }
 
            this.group.silent = geoModel.get('silent');
        },
 
        dispose: function () {
            this._mapDraw && this._mapDraw.remove();
        }
 
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/

Statements: 16.87% (151 / 895)      Branches: 0% (0 / 397)      Functions: 0.58% (1 / 173)      Lines: 16.87% (151 / 895)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/component/helper/
File Statements Branches Functions Lines
BrushController.js 16.62% (64 / 385) 0% (0 / 150) 1.33% (1 / 75) 16.62% (64 / 385)
BrushTargetManager.js 18.83% (29 / 154) 0% (0 / 71) 0% (0 / 38) 18.83% (29 / 154)
MapDraw.js 8.51% (12 / 141) 0% (0 / 75) 0% (0 / 20) 8.51% (12 / 141)
RoamController.js 15.85% (13 / 82) 0% (0 / 38) 0% (0 / 12) 15.85% (13 / 82)
brushHelper.js 35.48% (11 / 31) 0% (0 / 10) 0% (0 / 8) 35.48% (11 / 31)
cursorHelper.js 57.14% (4 / 7) 0% (0 / 7) 0% (0 / 1) 57.14% (4 / 7)
interactionMutex.js 38.46% (5 / 13) 0% (0 / 4) 0% (0 / 5) 38.46% (5 / 13)
listComponent.js 31.25% (5 / 16) 100% (0 / 0) 0% (0 / 3) 31.25% (5 / 16)
roamHelper.js 15.38% (4 / 26) 0% (0 / 8) 0% (0 / 2) 15.38% (4 / 26)
selectableMixin.js 10% (2 / 20) 0% (0 / 14) 0% (0 / 7) 10% (2 / 20)
sliderMove.js 10% (2 / 20) 0% (0 / 20) 0% (0 / 2) 10% (2 / 20)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/BrushController.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/BrushController.js

Statements: 16.62% (64 / 385)      Branches: 0% (0 / 150)      Functions: 1.33% (1 / 75)      Lines: 16.62% (64 / 385)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995                1 1 1 1 1   1 1 1 1 1 1   1 1 1 1   1           1                   1                     1                                 1                                                                                                                                                                                                                 1                                                                                                                                                                                                                                                 1         1       1                                   1                                                                 1   1                               1                       1               1                 1             1                 1         1         1                           1                     1                     1                                 1                               1           1                                                             1                                                             1                                                   1             1       1                   1       1                                       1                                   1                         1               1               1                           1                                                         1         1       1                                                                                                             1                         1                                                                                           1                                         1                                                                                                                                             1 2                                                                                                 1    
/**
 * Box selection tool.
 *
 * @module echarts/component/helper/BrushController
 */
 
 
 
    var Eventful = require('zrender/lib/mixin/Eventful');
    var zrUtil = require('zrender/lib/core/util');
    var graphic = require('../../util/graphic');
    var interactionMutex = require('./interactionMutex');
    var DataDiffer = require('../../data/DataDiffer');
 
    var curry = zrUtil.curry;
    var each = zrUtil.each;
    var map = zrUtil.map;
    var mathMin = Math.min;
    var mathMax = Math.max;
    var mathPow = Math.pow;
 
    var COVER_Z = 10000;
    var UNSELECT_THRESHOLD = 6;
    var MIN_RESIZE_LINE_WIDTH = 6;
    var MUTEX_RESOURCE_KEY = 'globalPan';
 
    var DIRECTION_MAP = {
        w: [0, 0],
        e: [0, 1],
        n: [1, 0],
        s: [1, 1]
    };
    var CURSOR_MAP = {
        w: 'ew',
        e: 'ew',
        n: 'ns',
        s: 'ns',
        ne: 'nesw',
        sw: 'nesw',
        nw: 'nwse',
        se: 'nwse'
    };
    var DEFAULT_BRUSH_OPT = {
        brushStyle: {
            lineWidth: 2,
            stroke: 'rgba(0,0,0,0.3)',
            fill: 'rgba(0,0,0,0.1)'
        },
        transformable: true,
        brushMode: 'single',
        removeOnClick: false
    };
 
    var baseUID = 0;
 
    /**
     * @alias module:echarts/component/helper/BrushController
     * @constructor
     * @mixin {module:zrender/mixin/Eventful}
     * @event module:echarts/component/helper/BrushController#brush
     *        params:
     *            areas: Array.<Array>, coord relates to container group,
     *                                    If no container specified, to global.
     *            opt {
     *                isEnd: boolean,
     *                removeOnClick: boolean
     *            }
     *
     * @param {module:zrender/zrender~ZRender} zr
     */
    function BrushController(zr) {
 
        if (__DEV__) {
            zrUtil.assert(zr);
        }
 
        Eventful.call(this);
 
        /**
         * @type {module:zrender/zrender~ZRender}
         * @private
         */
        this._zr = zr;
 
        /**
         * @type {module:zrender/container/Group}
         * @readOnly
         */
        this.group = new graphic.Group();
 
        /**
         * Only for drawing (after enabledBrush).
         *     'line', 'rect', 'polygon' or false
         *     If passing false/null/undefined, disable brush.
         *     If passing 'auto', determined by panel.defaultBrushType
         * @private
         * @type {string}
         */
        this._brushType;
 
        /**
         * Only for drawing (after enabledBrush).
         *
         * @private
         * @type {Object}
         */
        this._brushOption;
 
        /**
         * @private
         * @type {Object}
         */
        this._panels;
 
        /**
         * @private
         * @type {Array.<nubmer>}
         */
        this._track = [];
 
        /**
         * @private
         * @type {boolean}
         */
        this._dragging;
 
        /**
         * @private
         * @type {Array}
         */
        this._covers = [];
 
        /**
         * @private
         * @type {moudule:zrender/container/Group}
         */
        this._creatingCover;
 
        /**
         * `true` means global panel
         * @private
         * @type {module:zrender/container/Group|boolean}
         */
        this._creatingPanel;
 
        /**
         * @private
         * @type {boolean}
         */
        this._enableGlobalPan;
 
        /**
         * @private
         * @type {boolean}
         */
        if (__DEV__) {
            this._mounted;
        }
 
        /**
         * @private
         * @type {string}
         */
        this._uid = 'brushController_' + baseUID++;
 
        /**
         * @private
         * @type {Object}
         */
        this._handlers = {};
        each(mouseHandlers, function (handler, eventName) {
            this._handlers[eventName] = zrUtil.bind(handler, this);
        }, this);
    }
 
    BrushController.prototype = {
 
        constructor: BrushController,
 
        /**
         * If set to null/undefined/false, select disabled.
         * @param {Object} brushOption
         * @param {string|boolean} brushOption.brushType 'line', 'rect', 'polygon' or false
         *                          If passing false/null/undefined, disable brush.
         *                          If passing 'auto', determined by panel.defaultBrushType.
         *                              ('auto' can not be used in global panel)
         * @param {number} [brushOption.brushMode='single'] 'single' or 'multiple'
         * @param {boolean} [brushOption.transformable=true]
         * @param {boolean} [brushOption.removeOnClick=false]
         * @param {Object} [brushOption.brushStyle]
         * @param {number} [brushOption.brushStyle.width]
         * @param {number} [brushOption.brushStyle.lineWidth]
         * @param {string} [brushOption.brushStyle.stroke]
         * @param {string} [brushOption.brushStyle.fill]
         * @param {number} [brushOption.z]
         */
        enableBrush: function (brushOption) {
            if (__DEV__) {
                zrUtil.assert(this._mounted);
            }
 
            this._brushType && doDisableBrush(this);
            brushOption.brushType && doEnableBrush(this, brushOption);
 
            return this;
        },
 
        /**
         * @param {Array.<Object>} panelOpts If not pass, it is global brush.
         *        Each items: {
         *            panelId, // mandatory.
         *            clipPath, // mandatory. function.
         *            isTargetByCursor, // mandatory. function.
         *            defaultBrushType, // optional, only used when brushType is 'auto'.
         *            getLinearBrushOtherExtent, // optional. function.
         *        }
         */
        setPanels: function (panelOpts) {
            if (panelOpts && panelOpts.length) {
                var panels = this._panels = {};
                zrUtil.each(panelOpts, function (panelOpts) {
                    panels[panelOpts.panelId] = zrUtil.clone(panelOpts);
                });
            }
            else {
                this._panels = null;
            }
            return this;
        },
 
        /**
         * @param {Object} [opt]
         * @return {boolean} [opt.enableGlobalPan=false]
         */
        mount: function (opt) {
            opt = opt || {};
 
            if (__DEV__) {
                this._mounted = true; // should be at first.
            }
 
            this._enableGlobalPan = opt.enableGlobalPan;
 
            var thisGroup = this.group;
            this._zr.add(thisGroup);
 
            thisGroup.attr({
                position: opt.position || [0, 0],
                rotation: opt.rotation || 0,
                scale: opt.scale || [1, 1]
            });
            this._transform = thisGroup.getLocalTransform();
 
            return this;
        },
 
        eachCover: function (cb, context) {
            each(this._covers, cb, context);
        },
 
        /**
         * Update covers.
         * @param {Array.<Object>} brushOptionList Like:
         *        [
         *            {id: 'xx', brushType: 'line', range: [23, 44], brushStyle, transformable},
         *            {id: 'yy', brushType: 'rect', range: [[23, 44], [23, 54]]},
         *            ...
         *        ]
         *        `brushType` is required in each cover info. (can not be 'auto')
         *        `id` is not mandatory.
         *        `brushStyle`, `transformable` is not mandatory, use DEFAULT_BRUSH_OPT by default.
         *        If brushOptionList is null/undefined, all covers removed.
         */
        updateCovers: function (brushOptionList) {
            if (__DEV__) {
                zrUtil.assert(this._mounted);
            }
 
            brushOptionList = zrUtil.map(brushOptionList, function (brushOption) {
                return zrUtil.merge(zrUtil.clone(DEFAULT_BRUSH_OPT), brushOption, true);
            });
 
            var tmpIdPrefix = '\0-brush-index-';
            var oldCovers = this._covers;
            var newCovers = this._covers = [];
            var controller = this;
            var creatingCover = this._creatingCover;
 
            (new DataDiffer(oldCovers, brushOptionList, oldGetKey, getKey))
                .add(addOrUpdate)
                .update(addOrUpdate)
                .remove(remove)
                .execute();
 
            return this;
 
            function getKey(brushOption, index) {
                return (brushOption.id != null ? brushOption.id : tmpIdPrefix + index)
                    + '-' + brushOption.brushType;
            }
 
            function oldGetKey(cover, index) {
                return getKey(cover.__brushOption, index);
            }
 
            function addOrUpdate(newIndex, oldIndex) {
                var newBrushOption = brushOptionList[newIndex];
                // Consider setOption in event listener of brushSelect,
                // where updating cover when creating should be forbiden.
                if (oldIndex != null && oldCovers[oldIndex] === creatingCover) {
                    newCovers[newIndex] = oldCovers[oldIndex];
                }
                else {
                    var cover = newCovers[newIndex] = oldIndex != null
                        ? (
                            oldCovers[oldIndex].__brushOption = newBrushOption,
                            oldCovers[oldIndex]
                        )
                        : endCreating(controller, createCover(controller, newBrushOption));
                    updateCoverAfterCreation(controller, cover);
                }
            }
 
            function remove(oldIndex) {
                if (oldCovers[oldIndex] !== creatingCover) {
                    controller.group.remove(oldCovers[oldIndex]);
                }
            }
        },
 
        unmount: function () {
            if (__DEV__) {
                if (!this._mounted) {
                    return;
                }
            }
 
            this.enableBrush(false);
 
            // container may 'removeAll' outside.
            clearCovers(this);
            this._zr.remove(this.group);
 
            if (__DEV__) {
                this._mounted = false; // should be at last.
            }
 
            return this;
        },
 
        dispose: function () {
            this.unmount();
            this.off();
        }
    };
 
    zrUtil.mixin(BrushController, Eventful);
 
    function doEnableBrush(controller, brushOption) {
        var zr = controller._zr;
 
        // Consider roam, which takes globalPan too.
        if (!controller._enableGlobalPan) {
            interactionMutex.take(zr, MUTEX_RESOURCE_KEY, controller._uid);
        }
 
        each(controller._handlers, function (handler, eventName) {
            zr.on(eventName, handler);
        });
 
        controller._brushType = brushOption.brushType;
        controller._brushOption = zrUtil.merge(zrUtil.clone(DEFAULT_BRUSH_OPT), brushOption, true);
    }
 
    function doDisableBrush(controller) {
        var zr = controller._zr;
 
        interactionMutex.release(zr, MUTEX_RESOURCE_KEY, controller._uid);
 
        each(controller._handlers, function (handler, eventName) {
            zr.off(eventName, handler);
        });
 
        controller._brushType = controller._brushOption = null;
    }
 
    function createCover(controller, brushOption) {
        var cover = coverRenderers[brushOption.brushType].createCover(controller, brushOption);
        cover.__brushOption = brushOption;
        updateZ(cover, brushOption);
        controller.group.add(cover);
        return cover;
    }
 
    function endCreating(controller, creatingCover) {
        var coverRenderer = getCoverRenderer(creatingCover);
        if (coverRenderer.endCreating) {
            coverRenderer.endCreating(controller, creatingCover);
            updateZ(creatingCover, creatingCover.__brushOption);
        }
        return creatingCover;
    }
 
    function updateCoverShape(controller, cover) {
        var brushOption = cover.__brushOption;
        getCoverRenderer(cover).updateCoverShape(
            controller, cover, brushOption.range, brushOption
        );
    }
 
    function updateZ(cover, brushOption) {
        var z = brushOption.z;
        z == null && (z = COVER_Z);
        cover.traverse(function (el) {
            el.z = z;
            el.z2 = z; // Consider in given container.
        });
    }
 
    function updateCoverAfterCreation(controller, cover) {
        getCoverRenderer(cover).updateCommon(controller, cover);
        updateCoverShape(controller, cover);
    }
 
    function getCoverRenderer(cover) {
        return coverRenderers[cover.__brushOption.brushType];
    }
 
    // return target panel or `true` (means global panel)
    function getPanelByPoint(controller, e, localCursorPoint) {
        var panels = controller._panels;
        if (!panels) {
            return true; // Global panel
        }
        var panel;
        var transform = controller._transform;
        each(panels, function (pn) {
            pn.isTargetByCursor(e, localCursorPoint, transform) && (panel = pn);
        });
        return panel;
    }
 
    // Return a panel or true
    function getPanelByCover(controller, cover) {
        var panels = controller._panels;
        if (!panels) {
            return true; // Global panel
        }
        var panelId = cover.__brushOption.panelId;
        // User may give cover without coord sys info,
        // which is then treated as global panel.
        return panelId != null ? panels[panelId] : true;
    }
 
    function clearCovers(controller) {
        var covers = controller._covers;
        var originalLength = covers.length;
        each(covers, function (cover) {
            controller.group.remove(cover);
        }, controller);
        covers.length = 0;
 
        return !!originalLength;
    }
 
    function trigger(controller, opt) {
        var areas = map(controller._covers, function (cover) {
            var brushOption = cover.__brushOption;
            var range = zrUtil.clone(brushOption.range);
            return {
                brushType: brushOption.brushType,
                panelId: brushOption.panelId,
                range: range
            };
        });
 
        controller.trigger('brush', areas, {
            isEnd: !!opt.isEnd,
            removeOnClick: !!opt.removeOnClick
        });
    }
 
    function shouldShowCover(controller) {
        var track = controller._track;
 
        if (!track.length) {
            return false;
        }
 
        var p2 = track[track.length - 1];
        var p1 = track[0];
        var dx = p2[0] - p1[0];
        var dy = p2[1] - p1[1];
        var dist = mathPow(dx * dx + dy * dy, 0.5);
 
        return dist > UNSELECT_THRESHOLD;
    }
 
    function getTrackEnds(track) {
        var tail = track.length - 1;
        tail < 0 && (tail = 0);
        return [track[0], track[tail]];
    }
 
    function createBaseRectCover(doDrift, controller, brushOption, edgeNames) {
        var cover = new graphic.Group();
 
        cover.add(new graphic.Rect({
            name: 'main',
            style: makeStyle(brushOption),
            silent: true,
            draggable: true,
            cursor: 'move',
            drift: curry(doDrift, controller, cover, 'nswe'),
            ondragend: curry(trigger, controller, {isEnd: true})
        }));
 
        each(
            edgeNames,
            function (name) {
                cover.add(new graphic.Rect({
                    name: name,
                    style: {opacity: 0},
                    draggable: true,
                    silent: true,
                    invisible: true,
                    drift: curry(doDrift, controller, cover, name),
                    ondragend: curry(trigger, controller, {isEnd: true})
                }));
            }
        );
 
        return cover;
    }
 
    function updateBaseRect(controller, cover, localRange, brushOption) {
        var lineWidth = brushOption.brushStyle.lineWidth || 0;
        var handleSize = mathMax(lineWidth, MIN_RESIZE_LINE_WIDTH);
        var x = localRange[0][0];
        var y = localRange[1][0];
        var xa = x - lineWidth / 2;
        var ya = y - lineWidth / 2;
        var x2 = localRange[0][1];
        var y2 = localRange[1][1];
        var x2a = x2 - handleSize + lineWidth / 2;
        var y2a = y2 - handleSize + lineWidth / 2;
        var width = x2 - x;
        var height = y2 - y;
        var widtha = width + lineWidth;
        var heighta = height + lineWidth;
 
        updateRectShape(controller, cover, 'main', x, y, width, height);
 
        if (brushOption.transformable) {
            updateRectShape(controller, cover, 'w', xa, ya, handleSize, heighta);
            updateRectShape(controller, cover, 'e', x2a, ya, handleSize, heighta);
            updateRectShape(controller, cover, 'n', xa, ya, widtha, handleSize);
            updateRectShape(controller, cover, 's', xa, y2a, widtha, handleSize);
 
            updateRectShape(controller, cover, 'nw', xa, ya, handleSize, handleSize);
            updateRectShape(controller, cover, 'ne', x2a, ya, handleSize, handleSize);
            updateRectShape(controller, cover, 'sw', xa, y2a, handleSize, handleSize);
            updateRectShape(controller, cover, 'se', x2a, y2a, handleSize, handleSize);
        }
    }
 
    function updateCommon(controller, cover) {
        var brushOption = cover.__brushOption;
        var transformable = brushOption.transformable;
 
        var mainEl = cover.childAt(0);
        mainEl.useStyle(makeStyle(brushOption));
        mainEl.attr({
            silent: !transformable,
            cursor: transformable ? 'move' : 'default'
        });
 
        each(
            ['w', 'e', 'n', 's', 'se', 'sw', 'ne', 'nw'],
            function (name) {
                var el = cover.childOfName(name);
                var globalDir = getGlobalDirection(controller, name);
 
                el && el.attr({
                    silent: !transformable,
                    invisible: !transformable,
                    cursor: transformable ? CURSOR_MAP[globalDir] + '-resize' : null
                });
            }
        );
    }
 
    function updateRectShape(controller, cover, name, x, y, w, h) {
        var el = cover.childOfName(name);
        el && el.setShape(pointsToRect(
            clipByPanel(controller, cover, [[x, y], [x + w, y + h]])
        ));
    }
 
    function makeStyle(brushOption) {
        return zrUtil.defaults({strokeNoScale: true}, brushOption.brushStyle);
    }
 
    function formatRectRange(x, y, x2, y2) {
        var min = [mathMin(x, x2), mathMin(y, y2)];
        var max = [mathMax(x, x2), mathMax(y, y2)];
 
        return [
            [min[0], max[0]], // x range
            [min[1], max[1]] // y range
        ];
    }
 
    function getTransform(controller) {
        return graphic.getTransform(controller.group);
    }
 
    function getGlobalDirection(controller, localDirection) {
        if (localDirection.length > 1) {
            localDirection = localDirection.split('');
            var globalDir = [
                getGlobalDirection(controller, localDirection[0]),
                getGlobalDirection(controller, localDirection[1])
            ];
            (globalDir[0] === 'e' || globalDir[0] === 'w') && globalDir.reverse();
            return globalDir.join('');
        }
        else {
            var map = {w: 'left', e: 'right', n: 'top', s: 'bottom'};
            var inverseMap = {left: 'w', right: 'e', top: 'n', bottom: 's'};
            var globalDir = graphic.transformDirection(
                map[localDirection], getTransform(controller)
            );
            return inverseMap[globalDir];
        }
    }
 
    function driftRect(toRectRange, fromRectRange, controller, cover, name, dx, dy, e) {
        var brushOption = cover.__brushOption;
        var rectRange = toRectRange(brushOption.range);
        var localDelta = toLocalDelta(controller, dx, dy);
 
        each(name.split(''), function (namePart) {
            var ind = DIRECTION_MAP[namePart];
            rectRange[ind[0]][ind[1]] += localDelta[ind[0]];
        });
 
        brushOption.range = fromRectRange(formatRectRange(
            rectRange[0][0], rectRange[1][0], rectRange[0][1], rectRange[1][1]
        ));
 
        updateCoverAfterCreation(controller, cover);
        trigger(controller, {isEnd: false});
    }
 
    function driftPolygon(controller, cover, dx, dy, e) {
        var range = cover.__brushOption.range;
        var localDelta = toLocalDelta(controller, dx, dy);
 
        each(range, function (point) {
            point[0] += localDelta[0];
            point[1] += localDelta[1];
        });
 
        updateCoverAfterCreation(controller, cover);
        trigger(controller, {isEnd: false});
    }
 
    function toLocalDelta(controller, dx, dy) {
        var thisGroup = controller.group;
        var localD = thisGroup.transformCoordToLocal(dx, dy);
        var localZero = thisGroup.transformCoordToLocal(0, 0);
 
        return [localD[0] - localZero[0], localD[1] - localZero[1]];
    }
 
    function clipByPanel(controller, cover, data) {
        var panel = getPanelByCover(controller, cover);
 
        return (panel && panel !== true)
            ? panel.clipPath(data, controller._transform)
            : zrUtil.clone(data);
    }
 
    function pointsToRect(points) {
        var xmin = mathMin(points[0][0], points[1][0]);
        var ymin = mathMin(points[0][1], points[1][1]);
        var xmax = mathMax(points[0][0], points[1][0]);
        var ymax = mathMax(points[0][1], points[1][1]);
 
        return {
            x: xmin,
            y: ymin,
            width: xmax - xmin,
            height: ymax - ymin
        };
    }
 
    function resetCursor(controller, e, localCursorPoint) {
        // Check active
        if (!controller._brushType) {
            return;
        }
 
        var zr = controller._zr;
        var covers = controller._covers;
        var currPanel = getPanelByPoint(controller, e, localCursorPoint);
 
        // Check whether in covers.
        if (!controller._dragging) {
            for (var i = 0; i < covers.length; i++) {
                var brushOption = covers[i].__brushOption;
                if (currPanel
                    && (currPanel === true || brushOption.panelId === currPanel.panelId)
                    && coverRenderers[brushOption.brushType].contain(
                        covers[i], localCursorPoint[0], localCursorPoint[1]
                    )
                ) {
                    // Use cursor style set on cover.
                    return;
                }
            }
        }
 
        currPanel && zr.setCursorStyle('crosshair');
    }
 
    function preventDefault(e) {
        var rawE = e.event;
        rawE.preventDefault && rawE.preventDefault();
    }
 
    function mainShapeContain(cover, x, y) {
        return cover.childOfName('main').contain(x, y);
    }
 
    function updateCoverByMouse(controller, e, localCursorPoint, isEnd) {
        var creatingCover = controller._creatingCover;
        var panel = controller._creatingPanel;
        var thisBrushOption = controller._brushOption;
        var eventParams;
 
        controller._track.push(localCursorPoint.slice());
 
        if (shouldShowCover(controller) || creatingCover) {
 
            if (panel && !creatingCover) {
                thisBrushOption.brushMode === 'single' && clearCovers(controller);
                var brushOption = zrUtil.clone(thisBrushOption);
                brushOption.brushType = determineBrushType(brushOption.brushType, panel);
                brushOption.panelId = panel === true ? null : panel.panelId;
                creatingCover = controller._creatingCover = createCover(controller, brushOption);
                controller._covers.push(creatingCover);
            }
 
            if (creatingCover) {
                var coverRenderer = coverRenderers[determineBrushType(controller._brushType, panel)];
                var coverBrushOption = creatingCover.__brushOption;
 
                coverBrushOption.range = coverRenderer.getCreatingRange(
                    clipByPanel(controller, creatingCover, controller._track)
                );
 
                if (isEnd) {
                    endCreating(controller, creatingCover);
                    coverRenderer.updateCommon(controller, creatingCover);
                }
 
                updateCoverShape(controller, creatingCover);
 
                eventParams = {isEnd: isEnd};
            }
        }
        else if (
            isEnd
            && thisBrushOption.brushMode === 'single'
            && thisBrushOption.removeOnClick
        ) {
            // Help user to remove covers easily, only by a tiny drag, in 'single' mode.
            // But a single click do not clear covers, because user may have casual
            // clicks (for example, click on other component and do not expect covers
            // disappear).
            // Only some cover removed, trigger action, but not every click trigger action.
            if (getPanelByPoint(controller, e, localCursorPoint) && clearCovers(controller)) {
                eventParams = {isEnd: isEnd, removeOnClick: true};
            }
        }
 
        return eventParams;
    }
 
    function determineBrushType(brushType, panel) {
        if (brushType === 'auto') {
            if (__DEV__) {
                zrUtil.assert(
                    panel && panel.defaultBrushType,
                    'MUST have defaultBrushType when brushType is "atuo"'
                );
            }
            return panel.defaultBrushType;
        }
        return brushType;
    }
 
    var mouseHandlers = {
 
        mousedown: function (e) {
            if (this._dragging) {
                // In case some browser do not support globalOut,
                // and release mose out side the browser.
                handleDragEnd.call(this, e);
            }
            else if (!e.target || !e.target.draggable) {
 
                preventDefault(e);
 
                var localCursorPoint = this.group.transformCoordToLocal(e.offsetX, e.offsetY);
 
                this._creatingCover = null;
                var panel = this._creatingPanel = getPanelByPoint(this, e, localCursorPoint);
 
                if (panel) {
                    this._dragging = true;
                    this._track = [localCursorPoint.slice()];
                }
            }
        },
 
        mousemove: function (e) {
            var localCursorPoint = this.group.transformCoordToLocal(e.offsetX, e.offsetY);
 
            resetCursor(this, e, localCursorPoint);
 
            if (this._dragging) {
 
                preventDefault(e);
 
                var eventParams = updateCoverByMouse(this, e, localCursorPoint, false);
 
                eventParams && trigger(this, eventParams);
            }
        },
 
        mouseup: handleDragEnd //,
 
        // FIXME
        // in tooltip, globalout should not be triggered.
        // globalout: handleDragEnd
    };
 
    function handleDragEnd(e) {
        if (this._dragging) {
 
            preventDefault(e);
 
            var localCursorPoint = this.group.transformCoordToLocal(e.offsetX, e.offsetY);
            var eventParams = updateCoverByMouse(this, e, localCursorPoint, true);
 
            this._dragging = false;
            this._track = [];
            this._creatingCover = null;
 
            // trigger event shoule be at final, after procedure will be nested.
            eventParams && trigger(this, eventParams);
        }
    }
 
    /**
     * key: brushType
     * @type {Object}
     */
    var coverRenderers = {
 
        lineX: getLineRenderer(0),
 
        lineY: getLineRenderer(1),
 
        rect: {
            createCover: function (controller, brushOption) {
                return createBaseRectCover(
                    curry(
                        driftRect,
                        function (range) {
                            return range;
                        },
                        function (range) {
                            return range;
                        }
                    ),
                    controller,
                    brushOption,
                    ['w', 'e', 'n', 's', 'se', 'sw', 'ne', 'nw']
                );
            },
            getCreatingRange: function (localTrack) {
                var ends = getTrackEnds(localTrack);
                return formatRectRange(ends[1][0], ends[1][1], ends[0][0], ends[0][1]);
            },
            updateCoverShape: function (controller, cover, localRange, brushOption) {
                updateBaseRect(controller, cover, localRange, brushOption);
            },
            updateCommon: updateCommon,
            contain: mainShapeContain
        },
 
        polygon: {
            createCover: function (controller, brushOption) {
                var cover = new graphic.Group();
 
                // Do not use graphic.Polygon because graphic.Polyline do not close the
                // border of the shape when drawing, which is a better experience for user.
                cover.add(new graphic.Polyline({
                    name: 'main',
                    style: makeStyle(brushOption),
                    silent: true
                }));
 
                return cover;
            },
            getCreatingRange: function (localTrack) {
                return localTrack;
            },
            endCreating: function (controller, cover) {
                cover.remove(cover.childAt(0));
                // Use graphic.Polygon close the shape.
                cover.add(new graphic.Polygon({
                    name: 'main',
                    draggable: true,
                    drift: curry(driftPolygon, controller, cover),
                    ondragend: curry(trigger, controller, {isEnd: true})
                }));
            },
            updateCoverShape: function (controller, cover, localRange, brushOption) {
                cover.childAt(0).setShape({
                    points: clipByPanel(controller, cover, localRange)
                });
            },
            updateCommon: updateCommon,
            contain: mainShapeContain
        }
    };
 
    function getLineRenderer(xyIndex) {
        return {
            createCover: function (controller, brushOption) {
                return createBaseRectCover(
                    curry(
                        driftRect,
                        function (range) {
                            var rectRange = [range, [0, 100]];
                            xyIndex && rectRange.reverse();
                            return rectRange;
                        },
                        function (rectRange) {
                            return rectRange[xyIndex];
                        }
                    ),
                    controller,
                    brushOption,
                    [['w', 'e'], ['n', 's']][xyIndex]
                );
            },
            getCreatingRange: function (localTrack) {
                var ends = getTrackEnds(localTrack);
                var min = mathMin(ends[0][xyIndex], ends[1][xyIndex]);
                var max = mathMax(ends[0][xyIndex], ends[1][xyIndex]);
 
                return [min, max];
            },
            updateCoverShape: function (controller, cover, localRange, brushOption) {
                var otherExtent;
                // If brushWidth not specified, fit the panel.
                var panel = getPanelByCover(controller, cover);
                if (panel !== true && panel.getLinearBrushOtherExtent) {
                    otherExtent = panel.getLinearBrushOtherExtent(
                        xyIndex, controller._transform
                    );
                }
                else {
                    var zr = controller._zr;
                    otherExtent = [0, [zr.getWidth(), zr.getHeight()][1 - xyIndex]];
                }
                var rectRange = [localRange, otherExtent];
                xyIndex && rectRange.reverse();
 
                updateBaseRect(controller, cover, rectRange, brushOption);
            },
            updateCommon: updateCommon,
            contain: mainShapeContain
        };
    }
 
    module.exports = BrushController;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/BrushTargetManager.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/BrushTargetManager.js

Statements: 18.83% (29 / 154)      Branches: 0% (0 / 71)      Functions: 0% (0 / 38)      Lines: 18.83% (29 / 154)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444    1 1 1 1   1 1 1   1       1                                                                                                                             1                               1   1                                       1                               1                                                                             1                             1                                   1                                               1         1           1                                                                                                                                             1                                         1                               1                                                           1                                         1                                     1                 1                 1           1    
 
 
    var zrUtil = require('zrender/lib/core/util');
    var graphic = require('../../util/graphic');
    var modelUtil = require('../../util/model');
    var brushHelper = require('./brushHelper');
 
    var each = zrUtil.each;
    var indexOf = zrUtil.indexOf;
    var curry = zrUtil.curry;
 
    var COORD_CONVERTS = ['dataToPoint', 'pointToData'];
 
    // FIXME
    // how to genarialize to more coordinate systems.
    var INCLUDE_FINDER_MAIN_TYPES = [
        'grid', 'xAxis', 'yAxis', 'geo', 'graph',
        'polar', 'radiusAxis', 'angleAxis', 'bmap'
    ];
 
    /**
     * [option in constructor]:
     * {
     *     Index/Id/Name of geo, xAxis, yAxis, grid: See util/model#parseFinder.
     * }
     *
     *
     * [targetInfo]:
     *
     * There can be multiple axes in a single targetInfo. Consider the case
     * of `grid` component, a targetInfo represents a grid which contains one or more
     * cartesian and one or more axes. And consider the case of parallel system,
     * which has multiple axes in a coordinate system.
     * Can be {
     *     panelId: ...,
     *     coordSys: <a representitive cartesian in grid (first cartesian by default)>,
     *     coordSyses: all cartesians.
     *     gridModel: <grid component>
     *     xAxes: correspond to coordSyses on index
     *     yAxes: correspond to coordSyses on index
     * }
     * or {
     *     panelId: ...,
     *     coordSys: <geo coord sys>
     *     coordSyses: [<geo coord sys>]
     *     geoModel: <geo component>
     * }
     *
     *
     * [panelOpt]:
     *
     * Make from targetInfo. Input to BrushController.
     * {
     *     panelId: ...,
     *     rect: ...
     * }
     *
     *
     * [area]:
     *
     * Generated by BrushController or user input.
     * {
     *     panelId: Used to locate coordInfo directly. If user inpput, no panelId.
     *     brushType: determine how to convert to/from coord('rect' or 'polygon' or 'lineX/Y').
     *     Index/Id/Name of geo, xAxis, yAxis, grid: See util/model#parseFinder.
     *     range: pixel range.
     *     coordRange: representitive coord range (the first one of coordRanges).
     *     coordRanges: <Array> coord ranges, used in multiple cartesian in one grid.
     * }
     */
 
    /**
     * @param {Object} option contains Index/Id/Name of xAxis/yAxis/geo/grid
     *        Each can be {number|Array.<number>}. like: {xAxisIndex: [3, 4]}
     * @param {module:echarts/model/Global} ecModel
     * @param {Object} [opt]
     * @param {Array.<string>} [opt.include] include coordinate system types.
     */
    function BrushTargetManager(option, ecModel, opt) {
        /**
         * @private
         * @type {Array.<Object>}
         */
        var targetInfoList = this._targetInfoList = [];
        var info = {};
        var foundCpts = parseFinder(ecModel, option);
 
        each(targetInfoBuilders, function (builder, type) {
            if (!opt || !opt.include || indexOf(opt.include, type) >= 0) {
                builder(foundCpts, targetInfoList, info);
            }
        });
    }
 
    var proto = BrushTargetManager.prototype;
 
    proto.setOutputRanges = function (areas, ecModel) {
        this.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) {
            (area.coordRanges || (area.coordRanges = [])).push(coordRange);
            // area.coordRange is the first of area.coordRanges
            if (!area.coordRange) {
                area.coordRange = coordRange;
                // In 'category' axis, coord to pixel is not reversible, so we can not
                // rebuild range by coordRange accrately, which may bring trouble when
                // brushing only one item. So we use __rangeOffset to rebuilding range
                // by coordRange. And this it only used in brush component so it is no
                // need to be adapted to coordRanges.
                var result = coordConvert[area.brushType](0, coordSys, coordRange);
                area.__rangeOffset = {
                    offset: diffProcessor[area.brushType](result.values, area.range, [1, 1]),
                    xyMinMax: result.xyMinMax
                };
            }
        });
    };
 
    proto.matchOutputRanges = function (areas, ecModel, cb) {
        each(areas, function (area) {
            var targetInfo = this.findTargetInfo(area, ecModel);
 
            if (targetInfo && targetInfo !== true) {
                zrUtil.each(
                    targetInfo.coordSyses,
                    function (coordSys) {
                        var result = coordConvert[area.brushType](1, coordSys, area.range);
                        cb(area, result.values, coordSys, ecModel);
                    }
                );
            }
        }, this);
    };
 
    proto.setInputRanges = function (areas, ecModel) {
        each(areas, function (area) {
            var targetInfo = this.findTargetInfo(area, ecModel);
 
            if (__DEV__) {
                zrUtil.assert(
                    !targetInfo || targetInfo === true || area.coordRange,
                    'coordRange must be specified when coord index specified.'
                );
                zrUtil.assert(
                    !targetInfo || targetInfo !== true || area.range,
                    'range must be specified in global brush.'
                );
            }
 
            area.range = area.range || [];
 
            // convert coordRange to global range and set panelId.
            if (targetInfo && targetInfo !== true) {
                area.panelId = targetInfo.panelId;
                // (1) area.range shoule always be calculate from coordRange but does
                // not keep its original value, for the sake of the dataZoom scenario,
                // where area.coordRange remains unchanged but area.range may be changed.
                // (2) Only support converting one coordRange to pixel range in brush
                // component. So do not consider `coordRanges`.
                // (3) About __rangeOffset, see comment above.
                var result = coordConvert[area.brushType](0, targetInfo.coordSys, area.coordRange);
                var rangeOffset = area.__rangeOffset;
                area.range = rangeOffset
                    ? diffProcessor[area.brushType](
                        result.values,
                        rangeOffset.offset,
                        getScales(result.xyMinMax, rangeOffset.xyMinMax)
                    )
                    : result.values;
            }
        }, this);
    };
 
    proto.makePanelOpts = function (api, getDefaultBrushType) {
        return zrUtil.map(this._targetInfoList, function (targetInfo) {
            var rect = targetInfo.getPanelRect();
            return {
                panelId: targetInfo.panelId,
                defaultBrushType: getDefaultBrushType && getDefaultBrushType(targetInfo),
                clipPath: brushHelper.makeRectPanelClipPath(rect),
                isTargetByCursor: brushHelper.makeRectIsTargetByCursor(
                    rect, api, targetInfo.coordSysModel
                ),
                getLinearBrushOtherExtent: brushHelper.makeLinearBrushOtherExtent(rect)
            };
        });
    };
 
    proto.controlSeries = function (area, seriesModel, ecModel) {
        // Check whether area is bound in coord, and series do not belong to that coord.
        // If do not do this check, some brush (like lineX) will controll all axes.
        var targetInfo = this.findTargetInfo(area, ecModel);
        return targetInfo === true || (
            targetInfo && indexOf(targetInfo.coordSyses, seriesModel.coordinateSystem) >= 0
        );
    };
 
    /**
     * If return Object, a coord found.
     * If reutrn true, global found.
     * Otherwise nothing found.
     *
     * @param {Object} area
     * @param {Array} targetInfoList
     * @return {Obejct|boolean}
     */
    proto.findTargetInfo = function (area, ecModel) {
        var targetInfoList = this._targetInfoList;
        var foundCpts = parseFinder(ecModel, area);
 
        for (var i = 0; i < targetInfoList.length; i++) {
            var targetInfo = targetInfoList[i];
            var areaPanelId = area.panelId;
            if (areaPanelId) {
                if (targetInfo.panelId === areaPanelId) {
                    return targetInfo;
                }
            }
            else {
                for (var i = 0; i < targetInfoMatchers.length; i++) {
                    if (targetInfoMatchers[i](foundCpts, targetInfo)) {
                        return targetInfo;
                    }
                }
            }
        }
 
        return true;
    };
 
    function formatMinMax(minMax) {
        minMax[0] > minMax[1] && minMax.reverse();
        return minMax;
    }
 
    function parseFinder(ecModel, option) {
        return modelUtil.parseFinder(
            ecModel, option, {includeMainTypes: INCLUDE_FINDER_MAIN_TYPES}
        );
    }
 
    var targetInfoBuilders = {
 
        grid: function (foundCpts, targetInfoList) {
            var xAxisModels = foundCpts.xAxisModels;
            var yAxisModels = foundCpts.yAxisModels;
            var gridModels = foundCpts.gridModels;
            // Remove duplicated.
            var gridModelMap = {};
            var xAxesHas = {};
            var yAxesHas = {};
 
            if (!xAxisModels && !yAxisModels && !gridModels) {
                return;
            }
 
            each(xAxisModels, function (axisModel) {
                var gridModel = axisModel.axis.grid.model;
                gridModelMap[gridModel.id] = gridModel;
                xAxesHas[gridModel.id] = true;
            });
            each(yAxisModels, function (axisModel) {
                var gridModel = axisModel.axis.grid.model;
                gridModelMap[gridModel.id] = gridModel;
                yAxesHas[gridModel.id] = true;
            });
            each(gridModels, function (gridModel) {
                gridModelMap[gridModel.id] = gridModel;
                xAxesHas[gridModel.id] = true;
                yAxesHas[gridModel.id] = true;
            });
 
            each(gridModelMap, function (gridModel) {
                var grid = gridModel.coordinateSystem;
                var cartesians = [];
 
                each(grid.getCartesians(), function (cartesian, index) {
                    if (indexOf(xAxisModels, cartesian.getAxis('x').model) >= 0
                        || indexOf(yAxisModels, cartesian.getAxis('y').model) >= 0
                    ) {
                        cartesians.push(cartesian);
                    }
                });
                targetInfoList.push({
                    panelId: 'grid--' + gridModel.id,
                    gridModel: gridModel,
                    coordSysModel: gridModel,
                    // Use the first one as the representitive coordSys.
                    coordSys: cartesians[0],
                    coordSyses: cartesians,
                    getPanelRect: panelRectBuilder.grid,
                    xAxisDeclared: xAxesHas[gridModel.id],
                    yAxisDeclared: yAxesHas[gridModel.id]
                });
            });
        },
 
        geo: function (foundCpts, targetInfoList) {
            each(foundCpts.geoModels, function (geoModel) {
                var coordSys = geoModel.coordinateSystem;
                targetInfoList.push({
                    panelId: 'geo--' + geoModel.id,
                    geoModel: geoModel,
                    coordSysModel: geoModel,
                    coordSys: coordSys,
                    coordSyses: [coordSys],
                    getPanelRect: panelRectBuilder.geo
                });
            });
        }
    };
 
    var targetInfoMatchers = [
 
        // grid
        function (foundCpts, targetInfo) {
            var xAxisModel = foundCpts.xAxisModel;
            var yAxisModel = foundCpts.yAxisModel;
            var gridModel = foundCpts.gridModel;
 
            !gridModel && xAxisModel && (gridModel = xAxisModel.axis.grid.model);
            !gridModel && yAxisModel && (gridModel = yAxisModel.axis.grid.model);
 
            return gridModel && gridModel === targetInfo.gridModel;
        },
 
        // geo
        function (foundCpts, targetInfo) {
            var geoModel = foundCpts.geoModel;
            return geoModel && geoModel === targetInfo.geoModel;
        }
    ];
 
    var panelRectBuilder = {
 
        grid: function () {
            // grid is not Transformable.
            return this.coordSys.grid.getRect().clone();
        },
 
        geo: function () {
            var coordSys = this.coordSys;
            var rect = coordSys.getBoundingRect().clone();
            // geo roam and zoom transform
            rect.applyTransform(graphic.getTransform(coordSys));
            return rect;
        }
    };
 
    var coordConvert = {
 
        lineX: curry(axisConvert, 0),
 
        lineY: curry(axisConvert, 1),
 
        rect: function (to, coordSys, rangeOrCoordRange) {
            var xminymin = coordSys[COORD_CONVERTS[to]]([rangeOrCoordRange[0][0], rangeOrCoordRange[1][0]]);
            var xmaxymax = coordSys[COORD_CONVERTS[to]]([rangeOrCoordRange[0][1], rangeOrCoordRange[1][1]]);
            var values = [
                formatMinMax([xminymin[0], xmaxymax[0]]),
                formatMinMax([xminymin[1], xmaxymax[1]])
            ];
            return {values: values, xyMinMax: values};
        },
 
        polygon: function (to, coordSys, rangeOrCoordRange) {
            var xyMinMax = [[Infinity, -Infinity], [Infinity, -Infinity]];
            var values = zrUtil.map(rangeOrCoordRange, function (item) {
                var p = coordSys[COORD_CONVERTS[to]](item);
                xyMinMax[0][0] = Math.min(xyMinMax[0][0], p[0]);
                xyMinMax[1][0] = Math.min(xyMinMax[1][0], p[1]);
                xyMinMax[0][1] = Math.max(xyMinMax[0][1], p[0]);
                xyMinMax[1][1] = Math.max(xyMinMax[1][1], p[1]);
                return p;
            });
            return {values: values, xyMinMax: xyMinMax};
        }
    };
 
    function axisConvert(axisNameIndex, to, coordSys, rangeOrCoordRange) {
        if (__DEV__) {
            zrUtil.assert(
                coordSys.type === 'cartesian2d',
                'lineX/lineY brush is available only in cartesian2d.'
            );
        }
 
        var axis = coordSys.getAxis(['x', 'y'][axisNameIndex]);
        var values = formatMinMax(zrUtil.map([0, 1], function (i) {
            return to
                ? axis.coordToData(axis.toLocalCoord(rangeOrCoordRange[i]))
                : axis.toGlobalCoord(axis.dataToCoord(rangeOrCoordRange[i]));
        }));
        var xyMinMax = [];
        xyMinMax[axisNameIndex] = values;
        xyMinMax[1 - axisNameIndex] = [NaN, NaN];
 
        return {values: values, xyMinMax: xyMinMax};
    }
 
    var diffProcessor = {
        lineX: curry(axisDiffProcessor, 0),
 
        lineY: curry(axisDiffProcessor, 1),
 
        rect: function (values, refer, scales) {
            return [
                [values[0][0] - scales[0] * refer[0][0], values[0][1] - scales[0] * refer[0][1]],
                [values[1][0] - scales[1] * refer[1][0], values[1][1] - scales[1] * refer[1][1]]
            ];
        },
 
        polygon: function (values, refer, scales) {
            return zrUtil.map(values, function (item, idx) {
                return [item[0] - scales[0] * refer[idx][0], item[1] - scales[1] * refer[idx][1]];
            });
        }
    };
 
    function axisDiffProcessor(axisNameIndex, values, refer, scales) {
        return [
            values[0] - scales[axisNameIndex] * refer[0],
            values[1] - scales[axisNameIndex] * refer[1]
        ];
    }
 
    // We have to process scale caused by dataZoom manually,
    // although it might be not accurate.
    function getScales(xyMinMaxCurr, xyMinMaxOrigin) {
        var sizeCurr = getSize(xyMinMaxCurr);
        var sizeOrigin = getSize(xyMinMaxOrigin);
        var scales = [sizeCurr[0] / sizeOrigin[0], sizeCurr[1] / sizeOrigin[1]];
        isNaN(scales[0]) && (scales[0] = 1);
        isNaN(scales[1]) && (scales[1] = 1);
        return scales;
    }
 
    function getSize(xyMinMax) {
        return xyMinMax
            ? [xyMinMax[0][1] - xyMinMax[0][0], xyMinMax[1][1] - xyMinMax[1][0]]
            : [NaN, NaN];
    }
 
    module.exports = BrushTargetManager;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/MapDraw.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/MapDraw.js

Statements: 8.51% (12 / 141)      Branches: 0% (0 / 75)      Functions: 0% (0 / 20)      Lines: 8.51% (12 / 141)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370          1 1 1 1 1   1                         1                                                                                   1                           1                                                                         1                                                                                                                                                                                                                                                                                                                                                                                                                 1                                                                                                 1    
/**
 * @module echarts/component/helper/MapDraw
 */
 
 
    var RoamController = require('./RoamController');
    var roamHelper = require('../../component/helper/roamHelper');
    var cursorHelper = require('../../component/helper/cursorHelper');
    var graphic = require('../../util/graphic');
    var zrUtil = require('zrender/lib/core/util');
 
    function getFixedItemStyle(model, scale) {
        var itemStyle = model.getItemStyle();
        var areaColor = model.get('areaColor');
 
        // If user want the color not to be changed when hover,
        // they should both set areaColor and color to be null.
        if (areaColor != null) {
            itemStyle.fill = areaColor;
        }
 
        return itemStyle;
    }
 
    function updateMapSelectHandler(mapDraw, mapOrGeoModel, group, api, fromView) {
        group.off('click');
        group.off('mousedown');
 
        if (mapOrGeoModel.get('selectedMode')) {
 
            group.on('mousedown', function () {
                mapDraw._mouseDownFlag = true;
            });
 
            group.on('click', function (e) {
                if (!mapDraw._mouseDownFlag) {
                    return;
                }
                mapDraw._mouseDownFlag = false;
 
                var el = e.target;
                while (!el.__regions) {
                    el = el.parent;
                }
                if (!el) {
                    return;
                }
 
                var action = {
                    type: (mapOrGeoModel.mainType === 'geo' ? 'geo' : 'map') + 'ToggleSelect',
                    batch: zrUtil.map(el.__regions, function (region) {
                        return {
                            name: region.name,
                            from: fromView.uid
                        };
                    })
                };
                action[mapOrGeoModel.mainType + 'Id'] = mapOrGeoModel.id;
 
                api.dispatchAction(action);
 
                updateMapSelected(mapOrGeoModel, group);
            });
        }
    }
 
    function updateMapSelected(mapOrGeoModel, group) {
        // FIXME
        group.eachChild(function (otherRegionEl) {
            zrUtil.each(otherRegionEl.__regions, function (region) {
                otherRegionEl.trigger(mapOrGeoModel.isSelected(region.name) ? 'emphasis' : 'normal');
            });
        });
    }
 
    /**
     * @alias module:echarts/component/helper/MapDraw
     * @param {module:echarts/ExtensionAPI} api
     * @param {boolean} updateGroup
     */
    function MapDraw(api, updateGroup) {
 
        var group = new graphic.Group();
 
        /**
         * @type {module:echarts/component/helper/RoamController}
         * @private
         */
        this._controller = new RoamController(api.getZr());
 
        /**
         * @type {Object} {target, zoom, zoomLimit}
         * @private
         */
        this._controllerHost = {target: updateGroup ? group : null};
 
        /**
         * @type {module:zrender/container/Group}
         * @readOnly
         */
        this.group = group;
 
        /**
         * @type {boolean}
         * @private
         */
        this._updateGroup = updateGroup;
 
        /**
         * This flag is used to make sure that only one among
         * `pan`, `zoom`, `click` can occurs, otherwise 'selected'
         * action may be triggered when `pan`, which is unexpected.
         * @type {booelan}
         */
        this._mouseDownFlag;
    }
 
    MapDraw.prototype = {
 
        constructor: MapDraw,
 
        draw: function (mapOrGeoModel, ecModel, api, fromView, payload) {
 
            var isGeo = mapOrGeoModel.mainType === 'geo';
 
            // map series has data, geo model that controlled by map series
            // has no data, otherwise data exists.
            var data = mapOrGeoModel.getData && mapOrGeoModel.getData();
            isGeo && ecModel.eachComponent({mainType: 'series', subType: 'map'}, function (mapSeries) {
                if (!data && mapSeries.getHostGeoModel() === mapOrGeoModel) {
                    data = mapSeries.getData();
                }
            });
 
            var geo = mapOrGeoModel.coordinateSystem;
 
            var group = this.group;
 
            var scale = geo.scale;
            var groupNewProp = {
                position: geo.position,
                scale: scale
            };
 
            // No animation when first draw or in action
            if (!group.childAt(0) || payload) {
                group.attr(groupNewProp);
            }
            else {
                graphic.updateProps(group, groupNewProp, mapOrGeoModel);
            }
 
            group.removeAll();
 
            var itemStyleAccessPath = ['itemStyle', 'normal'];
            var hoverItemStyleAccessPath = ['itemStyle', 'emphasis'];
            var labelAccessPath = ['label', 'normal'];
            var hoverLabelAccessPath = ['label', 'emphasis'];
            var nameMap = {};
 
            zrUtil.each(geo.regions, function (region) {
 
                // Consider in GeoJson properties.name may be duplicated, for example,
                // there is multiple region named "United Kindom" or "France" (so many
                // colonies). And it is not appropriate to merge them in geo, which
                // will make them share the same label and bring trouble in label
                // location calculation.
                var regionGroup = nameMap[region.name]
                    || (nameMap[region.name] = new graphic.Group());
 
                var compoundPath = new graphic.CompoundPath({
                    shape: {
                        paths: []
                    }
                });
                regionGroup.add(compoundPath);
 
                var regionModel = mapOrGeoModel.getRegionModel(region.name) || mapOrGeoModel;
 
                var itemStyleModel = regionModel.getModel(itemStyleAccessPath);
                var hoverItemStyleModel = regionModel.getModel(hoverItemStyleAccessPath);
                var itemStyle = getFixedItemStyle(itemStyleModel, scale);
                var hoverItemStyle = getFixedItemStyle(hoverItemStyleModel, scale);
 
                var labelModel = regionModel.getModel(labelAccessPath);
                var hoverLabelModel = regionModel.getModel(hoverLabelAccessPath);
 
                var dataIdx;
                // Use the itemStyle in data if has data
                if (data) {
                    dataIdx = data.indexOfName(region.name);
                    // Only visual color of each item will be used. It can be encoded by dataRange
                    // But visual color of series is used in symbol drawing
                    //
                    // Visual color for each series is for the symbol draw
                    var visualColor = data.getItemVisual(dataIdx, 'color', true);
                    if (visualColor) {
                        itemStyle.fill = visualColor;
                    }
                }
 
                var textStyleModel = labelModel.getModel('textStyle');
                var hoverTextStyleModel = hoverLabelModel.getModel('textStyle');
 
                zrUtil.each(region.geometries, function (geometry) {
                    if (geometry.type !== 'polygon') {
                        return;
                    }
                    compoundPath.shape.paths.push(new graphic.Polygon({
                        shape: {
                            points: geometry.exterior
                        }
                    }));
 
                    for (var i = 0; i < (geometry.interiors ? geometry.interiors.length : 0); i++) {
                        compoundPath.shape.paths.push(new graphic.Polygon({
                            shape: {
                                points: geometry.interiors[i]
                            }
                        }));
                    }
                });
 
                compoundPath.setStyle(itemStyle);
                compoundPath.style.strokeNoScale = true;
                compoundPath.culling = true;
                // Label
                var showLabel = labelModel.get('show');
                var hoverShowLabel = hoverLabelModel.get('show');
 
                var isDataNaN = data && isNaN(data.get('value', dataIdx));
                var itemLayout = data && data.getItemLayout(dataIdx);
                // In the following cases label will be drawn
                // 1. In map series and data value is NaN
                // 2. In geo component
                // 4. Region has no series legendSymbol, which will be add a showLabel flag in mapSymbolLayout
                if (
                    (isGeo || isDataNaN && (showLabel || hoverShowLabel))
                 || (itemLayout && itemLayout.showLabel)
                 ) {
                    var query = data ? dataIdx : region.name;
                    var formattedStr = mapOrGeoModel.getFormattedLabel(query, 'normal');
                    var hoverFormattedStr = mapOrGeoModel.getFormattedLabel(query, 'emphasis');
                    var text = new graphic.Text({
                        style: {
                            text: showLabel ? (formattedStr || region.name) : '',
                            fill: textStyleModel.getTextColor(),
                            textFont: textStyleModel.getFont(),
                            textAlign: 'center',
                            textVerticalAlign: 'middle'
                        },
                        hoverStyle: {
                            text: hoverShowLabel ? (hoverFormattedStr || region.name) : '',
                            fill: hoverTextStyleModel.getTextColor(),
                            textFont: hoverTextStyleModel.getFont()
                        },
                        position: region.center.slice(),
                        scale: [1 / scale[0], 1 / scale[1]],
                        z2: 10,
                        silent: true
                    });
 
                    regionGroup.add(text);
                }
 
                // setItemGraphicEl, setHoverStyle after all polygons and labels
                // are added to the rigionGroup
                if (data) {
                    data.setItemGraphicEl(dataIdx, regionGroup);
                }
                else {
                    var regionModel = mapOrGeoModel.getRegionModel(region.name);
                    // Package custom mouse event for geo component
                    compoundPath.eventData = {
                        componentType: 'geo',
                        geoIndex: mapOrGeoModel.componentIndex,
                        name: region.name,
                        region: (regionModel && regionModel.option) || {}
                    };
                }
 
                var groupRegions = regionGroup.__regions || (regionGroup.__regions = []);
                groupRegions.push(region);
 
                graphic.setHoverStyle(
                    regionGroup,
                    hoverItemStyle,
                    {hoverSilentOnTouch: !!mapOrGeoModel.get('selectedMode')}
                );
 
                group.add(regionGroup);
            });
 
            this._updateController(mapOrGeoModel, ecModel, api);
 
            updateMapSelectHandler(this, mapOrGeoModel, group, api, fromView);
 
            updateMapSelected(mapOrGeoModel, group);
        },
 
        remove: function () {
            this.group.removeAll();
            this._controller.dispose();
            this._controllerHost = {};
        },
 
        _updateController: function (mapOrGeoModel, ecModel, api) {
            var geo = mapOrGeoModel.coordinateSystem;
            var controller = this._controller;
            var controllerHost = this._controllerHost;
 
            controllerHost.zoomLimit = mapOrGeoModel.get('scaleLimit');
            controllerHost.zoom = geo.getZoom();
 
            // roamType is will be set default true if it is null
            controller.enable(mapOrGeoModel.get('roam') || false);
            var mainType = mapOrGeoModel.mainType;
 
            function makeActionBase() {
                var action = {
                    type: 'geoRoam',
                    componentType: mainType
                };
                action[mainType + 'Id'] = mapOrGeoModel.id;
                return action;
            }
 
            controller.off('pan').on('pan', function (dx, dy) {
                this._mouseDownFlag = false;
 
                roamHelper.updateViewOnPan(controllerHost, dx, dy);
 
                api.dispatchAction(zrUtil.extend(makeActionBase(), {
                    dx: dx,
                    dy: dy
                }));
            }, this);
 
            controller.off('zoom').on('zoom', function (zoom, mouseX, mouseY) {
                this._mouseDownFlag = false;
 
                roamHelper.updateViewOnZoom(controllerHost, zoom, mouseX, mouseY);
 
                api.dispatchAction(zrUtil.extend(makeActionBase(), {
                    zoom: zoom,
                    originX: mouseX,
                    originY: mouseY
                }));
 
                if (this._updateGroup) {
                    var group = this.group;
                    var scale = group.scale;
                    group.traverse(function (el) {
                        if (el.type === 'text') {
                            el.attr('scale', [1 / scale[0], 1 / scale[1]]);
                        }
                    });
                }
            }, this);
 
            controller.setPointerChecker(function (e, x, y) {
                return geo.getViewRectAfterRoam().contain(x, y)
                    && !cursorHelper.onIrrelevantElement(e, api, mapOrGeoModel);
            });
        }
    };
 
    module.exports = MapDraw;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/RoamController.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/RoamController.js

Statements: 15.85% (13 / 82)      Branches: 0% (0 / 38)      Functions: 0% (0 / 12)      Lines: 15.85% (13 / 82)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183          1 1 1 1                 1                                                                                                                                                           1     1                                 1                                                           1       1                       1               1                     1    
/**
 * @module echarts/component/helper/RoamController
 */
 
 
    var Eventful = require('zrender/lib/mixin/Eventful');
    var zrUtil = require('zrender/lib/core/util');
    var eventTool = require('zrender/lib/core/event');
    var interactionMutex = require('./interactionMutex');
 
    /**
     * @alias module:echarts/component/helper/RoamController
     * @constructor
     * @mixin {module:zrender/mixin/Eventful}
     *
     * @param {module:zrender/zrender~ZRender} zr
     */
    function RoamController(zr) {
 
        /**
         * @type {Function}
         */
        this.pointerChecker;
 
        /**
         * @type {module:zrender}
         */
        this._zr = zr;
 
        // Avoid two roamController bind the same handler
        var bind = zrUtil.bind;
        var mousedownHandler = bind(mousedown, this);
        var mousemoveHandler = bind(mousemove, this);
        var mouseupHandler = bind(mouseup, this);
        var mousewheelHandler = bind(mousewheel, this);
        var pinchHandler = bind(pinch, this);
 
        Eventful.call(this);
 
        /**
         * @param {Function} pointerChecker
         *                   input: x, y
         *                   output: boolean
         */
        this.setPointerChecker = function (pointerChecker) {
            this.pointerChecker = pointerChecker;
        };
 
        /**
         * Notice: only enable needed types. For example, if 'zoom'
         * is not needed, 'zoom' should not be enabled, otherwise
         * default mousewheel behaviour (scroll page) will be disabled.
         *
         * @param  {boolean|string} [controlType=true] Specify the control type,
         *                          which can be null/undefined or true/false
         *                          or 'pan/move' or 'zoom'/'scale'
         */
        this.enable = function (controlType) {
            // Disable previous first
            this.disable();
 
            if (controlType == null) {
                controlType = true;
            }
 
            if (controlType === true || (controlType === 'move' || controlType === 'pan')) {
                zr.on('mousedown', mousedownHandler);
                zr.on('mousemove', mousemoveHandler);
                zr.on('mouseup', mouseupHandler);
            }
            if (controlType === true || (controlType === 'scale' || controlType === 'zoom')) {
                zr.on('mousewheel', mousewheelHandler);
                zr.on('pinch', pinchHandler);
            }
        };
 
        this.disable = function () {
            zr.off('mousedown', mousedownHandler);
            zr.off('mousemove', mousemoveHandler);
            zr.off('mouseup', mouseupHandler);
            zr.off('mousewheel', mousewheelHandler);
            zr.off('pinch', pinchHandler);
        };
 
        this.dispose = this.disable;
 
        this.isDragging = function () {
            return this._dragging;
        };
 
        this.isPinching = function () {
            return this._pinching;
        };
    }
 
    zrUtil.mixin(RoamController, Eventful);
 
 
    function mousedown(e) {
        if (e.target && e.target.draggable) {
            return;
        }
 
        var x = e.offsetX;
        var y = e.offsetY;
 
        // Only check on mosedown, but not mousemove.
        // Mouse can be out of target when mouse moving.
        if (this.pointerChecker && this.pointerChecker(e, x, y)) {
            this._x = x;
            this._y = y;
            this._dragging = true;
        }
    }
 
    function mousemove(e) {
        if (!this._dragging) {
            return;
        }
 
        eventTool.stop(e.event);
 
        if (e.gestureEvent !== 'pinch') {
 
            if (interactionMutex.isTaken(this._zr, 'globalPan')) {
                return;
            }
 
            var x = e.offsetX;
            var y = e.offsetY;
 
            var oldX = this._x;
            var oldY = this._y;
 
            var dx = x - oldX;
            var dy = y - oldY;
 
            this._x = x;
            this._y = y;
 
            eventTool.stop(e.event);
            this.trigger('pan', dx, dy, oldX, oldY, x, y);
        }
    }
 
    function mouseup(e) {
        this._dragging = false;
    }
 
    function mousewheel(e) {
        // wheelDelta maybe -0 in chrome mac.
        if (e.wheelDelta === 0) {
            return;
        }
        // Convenience:
        // Mac and VM Windows on Mac: scroll up: zoom out.
        // Windows: scroll up: zoom in.
        var zoomDelta = e.wheelDelta > 0 ? 1.1 : 1 / 1.1;
        zoom.call(this, e, zoomDelta, e.offsetX, e.offsetY);
    }
 
    function pinch(e) {
        if (interactionMutex.isTaken(this._zr, 'globalPan')) {
            return;
        }
        var zoomDelta = e.pinchScale > 1 ? 1.1 : 1 / 1.1;
        zoom.call(this, e, zoomDelta, e.pinchX, e.pinchY);
    }
 
    function zoom(e, zoomDelta, zoomX, zoomY) {
        if (this.pointerChecker && this.pointerChecker(e, zoomX, zoomY)) {
            // When mouse is out of roamController rect,
            // default befavoius should be be disabled, otherwise
            // page sliding is disabled, contrary to expectation.
            eventTool.stop(e.event);
 
            this.trigger('zoom', zoomDelta, zoomX, zoomY);
        }
    }
 
    module.exports = RoamController;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/brushHelper.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/brushHelper.js

Statements: 35.48% (11 / 31)      Branches: 0% (0 / 10)      Functions: 0% (0 / 8)      Lines: 35.48% (11 / 31)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53    1 1 1   1 1   1   1                             1                   1                 1       1      
 
 
    var zrUtil = require('zrender/lib/core/util');
    var cursorHelper = require('./cursorHelper');
    var BoundingRect = require('zrender/lib/core/BoundingRect');
 
    var mathMax = Math.max;
    var mathMin = Math.min;
 
    var helper = {};
 
    helper.makeRectPanelClipPath = function (rect) {
        rect = normalizeRect(rect);
        return function (localPoints, transform) {
            return zrUtil.map(localPoints, function (localPoint) {
                var x = localPoint[0];
                x = mathMax(x, rect.x);
                x = mathMin(x, rect.x + rect.width);
                var y = localPoint[1];
                y = mathMax(y, rect.y);
                y = mathMin(y, rect.y + rect.height);
                return [x, y];
            });
        };
    };
 
    helper.makeLinearBrushOtherExtent = function (rect, specifiedXYIndex) {
        rect = normalizeRect(rect);
        return function (xyIndex) {
            var idx = specifiedXYIndex != null ? specifiedXYIndex : xyIndex;
            var brushWidth = idx ? rect.width : rect.height;
            var base = idx ? rect.x : rect.y;
            return [base, base + (brushWidth || 0)];
        };
    };
 
    helper.makeRectIsTargetByCursor = function (rect, api, targetModel) {
        rect = normalizeRect(rect);
        return function (e, localCursorPoint, transform) {
            return rect.contain(localCursorPoint[0], localCursorPoint[1])
                && !cursorHelper.onIrrelevantElement(e, api, targetModel);
        };
    };
 
    // Consider width/height is negative.
    function normalizeRect(rect) {
        return BoundingRect.create(rect);
    }
 
    module.exports = helper;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/cursorHelper.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/cursorHelper.js

Statements: 57.14% (4 / 7)      Branches: 0% (0 / 7)      Functions: 0% (0 / 1)      Lines: 57.14% (4 / 7)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23    1   1           1                   1    
 
 
    var helper = {};
 
    var IRRELEVANT_EXCLUDES = {'axisPointer': 1, 'tooltip': 1, 'brush': 1};
 
    /**
     * Avoid that: mouse click on a elements that is over geo or graph,
     * but roam is triggered.
     */
    helper.onIrrelevantElement = function (e, api, targetCoordSysModel) {
        var model = api.getComponentByElement(e.topTarget);
        // If model is axisModel, it works only if it is injected with coordinateSystem.
        var coordSys = model && model.coordinateSystem;
        return model
            && model !== targetCoordSysModel
            && !IRRELEVANT_EXCLUDES[model.mainType]
            && (coordSys && coordSys.model !== targetCoordSysModel);
    };
 
    module.exports = helper;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/interactionMutex.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/interactionMutex.js

Statements: 38.46% (5 / 13)      Branches: 0% (0 / 4)      Functions: 0% (0 / 5)      Lines: 38.46% (5 / 13)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44    1   1                                         1                     1         1    
 
 
    var ATTR = '\0_ec_interaction_mutex';
 
    var interactionMutex = {
 
        take: function (zr, resourceKey, userKey) {
            var store = getStore(zr);
            store[resourceKey] = userKey;
        },
 
        release: function (zr, resourceKey, userKey) {
            var store = getStore(zr);
            var uKey = store[resourceKey];
 
            if (uKey === userKey) {
                store[resourceKey] = null;
            }
        },
 
        isTaken: function (zr, resourceKey) {
            return !!getStore(zr)[resourceKey];
        }
    };
 
    function getStore(zr) {
        return zr[ATTR] || (zr[ATTR] = {});
    }
 
    /**
     * payload: {
     *     type: 'takeGlobalCursor',
     *     key: 'dataZoomSelect', or 'brush', or ...,
     *         If no userKey, release global cursor.
     * }
     */
    require('../../echarts').registerAction(
        {type: 'takeGlobalCursor', event: 'globalCursorTaken', update: 'update'},
        function () {}
    );
 
    module.exports = interactionMutex;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/listComponent.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/listComponent.js

Statements: 31.25% (5 / 16)      Branches: 100% (0 / 0)      Functions: 0% (0 / 3)      Lines: 31.25% (5 / 16)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66    1 1 1   1                     1                                                                                                
 
    // List layout
    var layout = require('../../util/layout');
    var formatUtil = require('../../util/format');
    var graphic = require('../../util/graphic');
 
    function positionGroup(group, model, api) {
        layout.positionElement(
            group, model.getBoxLayoutParams(),
            {
                width: api.getWidth(),
                height: api.getHeight()
            },
            model.get('padding')
        );
    }
 
    module.exports = {
        /**
         * Layout list like component.
         * It will box layout each items in group of component and then position the whole group in the viewport
         * @param {module:zrender/group/Group} group
         * @param {module:echarts/model/Component} componentModel
         * @param {module:echarts/ExtensionAPI}
         */
        layout: function (group, componentModel, api) {
            var rect = layout.getLayoutRect(componentModel.getBoxLayoutParams(), {
                width: api.getWidth(),
                height: api.getHeight()
            }, componentModel.get('padding'));
            layout.box(
                componentModel.get('orient'),
                group,
                componentModel.get('itemGap'),
                rect.width,
                rect.height
            );
 
            positionGroup(group, componentModel, api);
        },
 
        addBackground: function (group, componentModel) {
            var padding = formatUtil.normalizeCssArray(
                componentModel.get('padding')
            );
            var boundingRect = group.getBoundingRect();
            var style = componentModel.getItemStyle(['color', 'opacity']);
            style.fill = componentModel.get('backgroundColor');
            var rect = new graphic.Rect({
                shape: {
                    x: boundingRect.x - padding[3],
                    y: boundingRect.y - padding[0],
                    width: boundingRect.width + padding[1] + padding[3],
                    height: boundingRect.height + padding[0] + padding[2]
                },
                style: style,
                silent: true,
                z2: -1
            });
            graphic.subPixelOptimizeRect(rect);
 
            group.add(rect);
        }
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/roamHelper.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/roamHelper.js

Statements: 15.38% (4 / 26)      Branches: 0% (0 / 8)      Functions: 0% (0 / 2)      Lines: 15.38% (4 / 26)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56    1               1                               1                                                     1    
 
 
    var helper = {};
 
    /**
     * For geo and graph.
     *
     * @param {Object} controllerHost
     * @param {module:zrender/Element} controllerHost.target
     */
    helper.updateViewOnPan = function (controllerHost, dx, dy) {
        var target = controllerHost.target;
        var pos = target.position;
        pos[0] += dx;
        pos[1] += dy;
        target.dirty();
    };
 
    /**
     * For geo and graph.
     *
     * @param {Object} controllerHost
     * @param {module:zrender/Element} controllerHost.target
     * @param {number} controllerHost.zoom
     * @param {number} controllerHost.zoomLimit like: {min: 1, max: 2}
     */
    helper.updateViewOnZoom = function (controllerHost, zoomDelta, zoomX, zoomY) {
        var target = controllerHost.target;
        var zoomLimit = controllerHost.zoomLimit;
        var pos = target.position;
        var scale = target.scale;
 
        var newZoom = controllerHost.zoom = controllerHost.zoom || 1;
        newZoom *= zoomDelta;
        if (zoomLimit) {
            var zoomMin = zoomLimit.min || 0;
            var zoomMax = zoomLimit.max || Infinity;
            newZoom = Math.max(
                Math.min(zoomMax, newZoom),
                zoomMin
            );
        }
        var zoomScale = newZoom / controllerHost.zoom;
        controllerHost.zoom = newZoom;
        // Keep the mouse center when scaling
        pos[0] -= (zoomX - pos[0]) * (zoomScale - 1);
        pos[1] -= (zoomY - pos[1]) * (zoomScale - 1);
        scale[0] *= zoomScale;
        scale[1] *= zoomScale;
 
        target.dirty();
    };
 
    module.exports = helper;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/selectableMixin.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/selectableMixin.js

Statements: 10% (2 / 20)      Branches: 0% (0 / 14)      Functions: 0% (0 / 7)      Lines: 10% (2 / 20)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66                  1   1                                                                                                            
/**
 * Data selectable mixin for chart series.
 * To eanble data select, option of series must have `selectedMode`.
 * And each data item will use `selected` to toggle itself selected status
 *
 * @module echarts/chart/helper/DataSelectable
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    module.exports = {
 
        updateSelectedMap: function (targetList) {
            this._selectTargetMap = zrUtil.reduce(targetList || [], function (targetMap, target) {
                targetMap[target.name] = target;
                return targetMap;
            }, {});
        },
        /**
         * @param {string} name
         */
        // PENGING If selectedMode is null ?
        select: function (name) {
            var targetMap = this._selectTargetMap;
            var target = targetMap[name];
            var selectedMode = this.get('selectedMode');
            if (selectedMode === 'single') {
                zrUtil.each(targetMap, function (target) {
                    target.selected = false;
                });
            }
            target && (target.selected = true);
        },
 
        /**
         * @param {string} name
         */
        unSelect: function (name) {
            var target = this._selectTargetMap[name];
            // var selectedMode = this.get('selectedMode');
            // selectedMode !== 'single' && target && (target.selected = false);
            target && (target.selected = false);
        },
 
        /**
         * @param {string} name
         */
        toggleSelected: function (name) {
            var target = this._selectTargetMap[name];
            if (target != null) {
                this[target.selected ? 'unSelect' : 'select'](name);
                return target.selected;
            }
        },
 
        /**
         * @param {string} name
         */
        isSelected: function (name) {
            var target = this._selectTargetMap[name];
            return target && target.selected;
        }
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/sliderMove.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/helper/sliderMove.js

Statements: 10% (2 / 20)      Branches: 0% (0 / 20)      Functions: 0% (0 / 2)      Lines: 10% (2 / 20)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55                                  1                                         1                                
 
 
    /**
     * Calculate slider move result.
     *
     * @param {number} delta Move length.
     * @param {Array.<number>} handleEnds handleEnds[0] and be bigger then handleEnds[1].
     *                                    handleEnds will be modified in this method.
     * @param {Array.<number>} extent handleEnds is restricted by extent.
     *                                extent[0] should less or equals than extent[1].
     * @param {string} mode 'rigid': Math.abs(handleEnds[0] - handleEnds[1]) remain unchanged,
     *                      'cross' handleEnds[0] can be bigger then handleEnds[1],
     *                      'push' handleEnds[0] can not be bigger then handleEnds[1],
     *                              when they touch, one push other.
     * @param {number} handleIndex If mode is 'rigid', handleIndex is not required.
     * @return {Array.<number>} The input handleEnds.
     */
    module.exports = function (delta, handleEnds, extent, mode, handleIndex) {
        if (!delta) {
            return handleEnds;
        }
 
        if (mode === 'rigid') {
            delta = getRealDelta(delta, handleEnds, extent);
            handleEnds[0] += delta;
            handleEnds[1] += delta;
        }
        else {
            delta = getRealDelta(delta, handleEnds[handleIndex], extent);
            handleEnds[handleIndex] += delta;
 
            if (mode === 'push' && handleEnds[0] > handleEnds[1]) {
                handleEnds[1 - handleIndex] = handleEnds[handleIndex];
            }
        }
 
        return handleEnds;
 
        function getRealDelta(delta, handleEnds, extent) {
            var handleMinMax = !handleEnds.length
                ? [handleEnds, handleEnds]
                : handleEnds.slice();
            handleEnds[0] > handleEnds[1] && handleMinMax.reverse();
 
            if (delta < 0 && handleMinMax[0] + delta < extent[0]) {
                delta = extent[0] - handleMinMax[0];
            }
            if (delta > 0 && handleMinMax[1] + delta > extent[1]) {
                delta = extent[1] - handleMinMax[1];
            }
            return delta;
        }
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/legend/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/legend/

Statements: 11.43% (20 / 175)      Branches: 0% (0 / 122)      Functions: 0% (0 / 28)      Lines: 11.43% (20 / 175)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/component/legend/
File Statements Branches Functions Lines
LegendModel.js 8.7% (4 / 46) 0% (0 / 30) 0% (0 / 13) 8.7% (4 / 46)
LegendView.js 9.28% (9 / 97) 0% (0 / 72) 0% (0 / 10) 9.28% (9 / 97)
legendAction.js 25% (6 / 24) 0% (0 / 14) 0% (0 / 3) 25% (6 / 24)
legendFilter.js 12.5% (1 / 8) 0% (0 / 6) 0% (0 / 2) 12.5% (1 / 8)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/legend/LegendModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/legend/LegendModel.js

Statements: 8.7% (4 / 46)      Branches: 0% (0 / 30)      Functions: 0% (0 / 13)      Lines: 8.7% (4 / 46)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193      1 1   1                                                                                                                                                                                                                                                                                                                                                                               1    
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
    var Model = require('../../model/Model');
 
    var LegendModel = require('../../echarts').extendComponentModel({
 
        type: 'legend',
 
        dependencies: ['series'],
 
        layoutMode: {
            type: 'box',
            ignoreSize: true
        },
 
        init: function (option, parentModel, ecModel) {
            this.mergeDefaultAndTheme(option, ecModel);
 
            option.selected = option.selected || {};
        },
 
        mergeOption: function (option) {
            LegendModel.superCall(this, 'mergeOption', option);
        },
 
        optionUpdated: function () {
            this._updateData(this.ecModel);
 
            var legendData = this._data;
 
            // If selectedMode is single, try to select one
            if (legendData[0] && this.get('selectedMode') === 'single') {
                var hasSelected = false;
                // If has any selected in option.selected
                for (var i = 0; i < legendData.length; i++) {
                    var name = legendData[i].get('name');
                    if (this.isSelected(name)) {
                        // Force to unselect others
                        this.select(name);
                        hasSelected = true;
                        break;
                    }
                }
                // Try select the first if selectedMode is single
                !hasSelected && this.select(legendData[0].get('name'));
            }
        },
 
        _updateData: function (ecModel) {
            var legendData = zrUtil.map(this.get('data') || [], function (dataItem) {
                // Can be string or number
                if (typeof dataItem === 'string' || typeof dataItem === 'number') {
                    dataItem = {
                        name: dataItem
                    };
                }
                return new Model(dataItem, this, this.ecModel);
            }, this);
            this._data = legendData;
 
            var availableNames = zrUtil.map(ecModel.getSeries(), function (series) {
                return series.name;
            });
            ecModel.eachSeries(function (seriesModel) {
                if (seriesModel.legendDataProvider) {
                    var data = seriesModel.legendDataProvider();
                    availableNames = availableNames.concat(data.mapArray(data.getName));
                }
            });
            /**
             * @type {Array.<string>}
             * @private
             */
            this._availableNames = availableNames;
        },
 
        /**
         * @return {Array.<module:echarts/model/Model>}
         */
        getData: function () {
            return this._data;
        },
 
        /**
         * @param {string} name
         */
        select: function (name) {
            var selected = this.option.selected;
            var selectedMode = this.get('selectedMode');
            if (selectedMode === 'single') {
                var data = this._data;
                zrUtil.each(data, function (dataItem) {
                    selected[dataItem.get('name')] = false;
                });
            }
            selected[name] = true;
        },
 
        /**
         * @param {string} name
         */
        unSelect: function (name) {
            if (this.get('selectedMode') !== 'single') {
                this.option.selected[name] = false;
            }
        },
 
        /**
         * @param {string} name
         */
        toggleSelected: function (name) {
            var selected = this.option.selected;
            // Default is true
            if (!selected.hasOwnProperty(name)) {
                selected[name] = true;
            }
            this[selected[name] ? 'unSelect' : 'select'](name);
        },
 
        /**
         * @param {string} name
         */
        isSelected: function (name) {
            var selected = this.option.selected;
            return !(selected.hasOwnProperty(name) && !selected[name])
                && zrUtil.indexOf(this._availableNames, name) >= 0;
        },
 
        defaultOption: {
            // 一级层叠
            zlevel: 0,
            // 二级层叠
            z: 4,
            show: true,
 
            // 布局方式,默认为水平布局,可选为:
            // 'horizontal' | 'vertical'
            orient: 'horizontal',
 
            left: 'center',
            // right: 'center',
 
            top: 'top',
            // bottom: 'top',
 
            // 水平对齐
            // 'auto' | 'left' | 'right'
            // 默认为 'auto', 根据 x 的位置判断是左对齐还是右对齐
            align: 'auto',
 
            backgroundColor: 'rgba(0,0,0,0)',
            // 图例边框颜色
            borderColor: '#ccc',
            // 图例边框线宽,单位px,默认为0(无边框)
            borderWidth: 0,
            // 图例内边距,单位px,默认各方向内边距为5,
            // 接受数组分别设定上右下左边距,同css
            padding: 5,
            // 各个item之间的间隔,单位px,默认为10,
            // 横向布局时为水平间隔,纵向布局时为纵向间隔
            itemGap: 10,
            // 图例图形宽度
            itemWidth: 25,
            // 图例图形高度
            itemHeight: 14,
 
            // 图例关闭时候的颜色
            inactiveColor: '#ccc',
 
            textStyle: {
                // 图例文字颜色
                color: '#333'
            },
            // formatter: '',
            // 选择模式,默认开启图例开关
            selectedMode: true,
            // 配置默认选中状态,可配合LEGEND.SELECTED事件做动态数据载入
            // selected: null,
            // 图例内容(详见legend.data,数组中每一项代表一个item
            // data: [],
 
            // Tooltip 相关配置
            tooltip: {
                show: false
            }
        }
    });
 
    module.exports = LegendModel;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/legend/LegendView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/legend/LegendView.js

Statements: 9.28% (9 / 97)      Branches: 0% (0 / 72)      Functions: 0% (0 / 10)      Lines: 9.28% (9 / 97)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266    1 1 1 1   1   1             1                       1                       1                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
 
 
    var zrUtil = require('zrender/lib/core/util');
    var symbolCreator = require('../../util/symbol');
    var graphic = require('../../util/graphic');
    var listComponentHelper = require('../helper/listComponent');
 
    var curry = zrUtil.curry;
 
    function dispatchSelectAction(name, api) {
        api.dispatchAction({
            type: 'legendToggleSelect',
            name: name
        });
    }
 
    function dispatchHighlightAction(seriesModel, dataName, api) {
        // If element hover will move to a hoverLayer.
        var el = api.getZr().storage.getDisplayList()[0];
        if (!(el && el.useHoverLayer)) {
            seriesModel.get('legendHoverLink') && api.dispatchAction({
                type: 'highlight',
                seriesName: seriesModel.name,
                name: dataName
            });
        }
    }
 
    function dispatchDownplayAction(seriesModel, dataName, api) {
        // If element hover will move to a hoverLayer.
        var el = api.getZr().storage.getDisplayList()[0];
        if (!(el && el.useHoverLayer)) {
            seriesModel.get('legendHoverLink') && api.dispatchAction({
                type: 'downplay',
                seriesName: seriesModel.name,
                name: dataName
            });
        }
    }
 
    module.exports = require('../../echarts').extendComponentView({
 
        type: 'legend',
 
        init: function () {
            this._symbolTypeStore = {};
        },
 
        render: function (legendModel, ecModel, api) {
            var group = this.group;
            group.removeAll();
 
            if (!legendModel.get('show')) {
                return;
            }
 
            var selectMode = legendModel.get('selectedMode');
            var itemAlign = legendModel.get('align');
 
            if (itemAlign === 'auto') {
                itemAlign = (legendModel.get('left') === 'right'
                    && legendModel.get('orient') === 'vertical')
                    ? 'right' : 'left';
            }
 
            var legendDrawedMap = {};
 
            zrUtil.each(legendModel.getData(), function (itemModel) {
                var name = itemModel.get('name');
 
                // Use empty string or \n as a newline string
                if (name === '' || name === '\n') {
                    group.add(new graphic.Group({
                        newline: true
                    }));
                    return;
                }
 
                var seriesModel = ecModel.getSeriesByName(name)[0];
 
                if (legendDrawedMap[name]) {
                    // Have been drawed
                    return;
                }
 
                // Series legend
                if (seriesModel) {
                    var data = seriesModel.getData();
                    var color = data.getVisual('color');
 
                    // If color is a callback function
                    if (typeof color === 'function') {
                        // Use the first data
                        color = color(seriesModel.getDataParams(0));
                    }
 
                    // Using rect symbol defaultly
                    var legendSymbolType = data.getVisual('legendSymbol') || 'roundRect';
                    var symbolType = data.getVisual('symbol');
 
                    var itemGroup = this._createItem(
                        name, itemModel, legendModel,
                        legendSymbolType, symbolType,
                        itemAlign, color,
                        selectMode
                    );
 
                    itemGroup.on('click', curry(dispatchSelectAction, name, api))
                        .on('mouseover', curry(dispatchHighlightAction, seriesModel, null, api))
                        .on('mouseout', curry(dispatchDownplayAction, seriesModel, null, api));
 
                    legendDrawedMap[name] = true;
                }
                else {
                    // Data legend of pie, funnel
                    ecModel.eachRawSeries(function (seriesModel) {
                        // In case multiple series has same data name
                        if (legendDrawedMap[name]) {
                            return;
                        }
                        if (seriesModel.legendDataProvider) {
                            var data = seriesModel.legendDataProvider();
                            var idx = data.indexOfName(name);
                            if (idx < 0) {
                                return;
                            }
 
                            var color = data.getItemVisual(idx, 'color');
 
                            var legendSymbolType = 'roundRect';
 
                            var itemGroup = this._createItem(
                                name, itemModel, legendModel,
                                legendSymbolType, null,
                                itemAlign, color,
                                selectMode
                            );
 
                            itemGroup.on('click', curry(dispatchSelectAction, name, api))
                                // FIXME Should not specify the series name
                                .on('mouseover', curry(dispatchHighlightAction, seriesModel, name, api))
                                .on('mouseout', curry(dispatchDownplayAction, seriesModel, name, api));
 
                            legendDrawedMap[name] = true;
                        }
                    }, this);
                }
 
                if (__DEV__) {
                    if (!legendDrawedMap[name]) {
                        console.warn(name + ' series not exists. Legend data should be same with series name or data name.');
                    }
                }
            }, this);
 
            listComponentHelper.layout(group, legendModel, api);
            // Render background after group is layout
            // FIXME
            listComponentHelper.addBackground(group, legendModel);
        },
 
        _createItem: function (
            name, itemModel, legendModel,
            legendSymbolType, symbolType,
            itemAlign, color, selectMode
        ) {
            var itemWidth = legendModel.get('itemWidth');
            var itemHeight = legendModel.get('itemHeight');
            var inactiveColor = legendModel.get('inactiveColor');
 
            var isSelected = legendModel.isSelected(name);
            var itemGroup = new graphic.Group();
 
            var textStyleModel = itemModel.getModel('textStyle');
 
            var itemIcon = itemModel.get('icon');
 
            var tooltipModel = itemModel.getModel('tooltip');
            var legendGlobalTooltipModel = tooltipModel.parentModel;
 
            // Use user given icon first
            legendSymbolType = itemIcon || legendSymbolType;
            itemGroup.add(symbolCreator.createSymbol(
                legendSymbolType, 0, 0, itemWidth, itemHeight, isSelected ? color : inactiveColor
            ));
 
            // Compose symbols
            // PENDING
            if (!itemIcon && symbolType
                // At least show one symbol, can't be all none
                && ((symbolType !== legendSymbolType) || symbolType == 'none')
            ) {
                var size = itemHeight * 0.8;
                if (symbolType === 'none') {
                    symbolType = 'circle';
                }
                // Put symbol in the center
                itemGroup.add(symbolCreator.createSymbol(
                    symbolType, (itemWidth - size) / 2, (itemHeight - size) / 2, size, size,
                    isSelected ? color : inactiveColor
                ));
            }
 
            // Text
            var textX = itemAlign === 'left' ? itemWidth + 5 : -5;
            var textAlign = itemAlign;
 
            var formatter = legendModel.get('formatter');
            var content = name;
            if (typeof formatter === 'string' && formatter) {
                content = formatter.replace('{name}', name != null ? name : '');
            }
            else if (typeof formatter === 'function') {
                content = formatter(name);
            }
 
            var text = new graphic.Text({
                style: {
                    text: content,
                    x: textX,
                    y: itemHeight / 2,
                    fill: isSelected ? textStyleModel.getTextColor() : inactiveColor,
                    textFont: textStyleModel.getFont(),
                    textAlign: textAlign,
                    textVerticalAlign: 'middle'
                }
            });
            itemGroup.add(text);
 
            // Add a invisible rect to increase the area of mouse hover
            var hitRect = new graphic.Rect({
                shape: itemGroup.getBoundingRect(),
                invisible: true,
                tooltip: tooltipModel.get('show') ? zrUtil.extend({
                    content: name,
                    // Defaul formatter
                    formatter: legendGlobalTooltipModel.get('formatter', true) || function () {
                        return name;
                    },
                    formatterParams: {
                        componentType: 'legend',
                        legendIndex: legendModel.componentIndex,
                        name: name,
                        $vars: ['name']
                    }
                }, tooltipModel.option) : null
            });
            itemGroup.add(hitRect);
 
            itemGroup.eachChild(function (child) {
                child.silent = true;
            });
 
            hitRect.silent = !selectMode;
 
 
 
            this.group.add(itemGroup);
 
            graphic.setHoverStyle(itemGroup);
 
            return itemGroup;
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/legend/legendAction.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/legend/legendAction.js

Statements: 25% (6 / 24)      Branches: 0% (0 / 14)      Functions: 0% (0 / 3)      Lines: 25% (6 / 24)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83          1 1   1                                                                                             1                     1                     1          
/**
 * @file Legend action
 */
 
 
    var echarts = require('../../echarts');
    var zrUtil = require('zrender/lib/core/util');
 
    function legendSelectActionHandler(methodName, payload, ecModel) {
        var selectedMap = {};
        var isToggleSelect = methodName === 'toggleSelected';
        var isSelected;
        // Update all legend components
        ecModel.eachComponent('legend', function (legendModel) {
            if (isToggleSelect && isSelected != null) {
                // Force other legend has same selected status
                // Or the first is toggled to true and other are toggled to false
                // In the case one legend has some item unSelected in option. And if other legend
                // doesn't has the item, they will assume it is selected.
                legendModel[isSelected ? 'select' : 'unSelect'](payload.name);
            }
            else {
                legendModel[methodName](payload.name);
                isSelected = legendModel.isSelected(payload.name);
            }
            var legendData = legendModel.getData();
            zrUtil.each(legendData, function (model) {
                var name = model.get('name');
                // Wrap element
                if (name === '\n' || name === '') {
                    return;
                }
                var isItemSelected = legendModel.isSelected(name);
                if (name in selectedMap) {
                    // Unselected if any legend is unselected
                    selectedMap[name] = selectedMap[name] && isItemSelected;
                }
                else {
                    selectedMap[name] = isItemSelected;
                }
            });
        });
        // Return the event explicitly
        return {
            name: payload.name,
            selected: selectedMap
        };
    }
    /**
     * @event legendToggleSelect
     * @type {Object}
     * @property {string} type 'legendToggleSelect'
     * @property {string} [from]
     * @property {string} name Series name or data item name
     */
    echarts.registerAction(
        'legendToggleSelect', 'legendselectchanged',
        zrUtil.curry(legendSelectActionHandler, 'toggleSelected')
    );
 
    /**
     * @event legendSelect
     * @type {Object}
     * @property {string} type 'legendSelect'
     * @property {string} name Series name or data item name
     */
    echarts.registerAction(
        'legendSelect', 'legendselected',
        zrUtil.curry(legendSelectActionHandler, 'select')
    );
 
    /**
     * @event legendUnSelect
     * @type {Object}
     * @property {string} type 'legendUnSelect'
     * @property {string} name Series name or data item name
     */
    echarts.registerAction(
        'legendUnSelect', 'legendunselected',
        zrUtil.curry(legendSelectActionHandler, 'unSelect')
    );
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/legend/legendFilter.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/legend/legendFilter.js

Statements: 12.5% (1 / 8)      Branches: 0% (0 / 6)      Functions: 0% (0 / 2)      Lines: 12.5% (1 / 8)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20  1                                    
 
   module.exports = function (ecModel) {
        var legendModels = ecModel.findComponents({
            mainType: 'legend'
        });
        if (legendModels && legendModels.length) {
            ecModel.filterSeries(function (series) {
                // If in any legend component the status is not selected.
                // Because in legend series is assumed selected when it is not in the legend data.
                for (var i = 0; i < legendModels.length; i++) {
                    if (!legendModels[i].isSelected(series.name)) {
                        return false;
                    }
                }
                return true;
            });
        }
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/marker/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/marker/

Statements: 12.48% (64 / 513)      Branches: 0% (0 / 267)      Functions: 0% (0 / 76)      Lines: 12.48% (64 / 513)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/component/marker/
File Statements Branches Functions Lines
MarkAreaModel.js 100% (1 / 1) 100% (0 / 0) 100% (0 / 0) 100% (1 / 1)
MarkAreaView.js 9.86% (14 / 142) 0% (0 / 58) 0% (0 / 21) 9.86% (14 / 142)
MarkLineModel.js 100% (1 / 1) 100% (0 / 0) 100% (0 / 0) 100% (1 / 1)
MarkLineView.js 8.39% (13 / 155) 0% (0 / 90) 0% (0 / 21) 8.39% (13 / 155)
MarkPointModel.js 100% (1 / 1) 100% (0 / 0) 100% (0 / 0) 100% (1 / 1)
MarkPointView.js 11.59% (8 / 69) 0% (0 / 32) 0% (0 / 11) 11.59% (8 / 69)
MarkerModel.js 17.24% (10 / 58) 0% (0 / 33) 0% (0 / 9) 17.24% (10 / 58)
MarkerView.js 7.69% (1 / 13) 0% (0 / 8) 0% (0 / 4) 7.69% (1 / 13)
markerHelper.js 20.55% (15 / 73) 0% (0 / 46) 0% (0 / 10) 20.55% (15 / 73)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/marker/MarkAreaModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/marker/MarkAreaModel.js

Statements: 100% (1 / 1)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (1 / 1)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37    1                                                                    
 
 
    module.exports = require('./MarkerModel').extend({
 
        type: 'markArea',
 
        defaultOption: {
            zlevel: 0,
            // PENDING
            z: 1,
            tooltip: {
                trigger: 'item'
            },
            // markArea should fixed on the coordinate system
            animation: false,
            label: {
                normal: {
                    show: true,
                    position: 'top'
                },
                emphasis: {
                    show: true,
                    position: 'top'
                }
            },
            itemStyle: {
                normal: {
                    // color and borderColor default to use color from series
                    // color: 'auto'
                    // borderColor: 'auto'
                    borderWidth: 0
                }
            }
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/marker/MarkAreaView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/marker/MarkAreaView.js

Statements: 9.86% (14 / 142)      Branches: 0% (0 / 58)      Functions: 0% (0 / 21)      Lines: 9.86% (14 / 142)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318      1 1 1 1 1   1   1                                                     1         1         1                                                             1                                                                                               1   1                                                                                                                                                                                                                                                                                         1                                                                                              
// TODO Better on polar
 
 
    var zrUtil = require('zrender/lib/core/util');
    var List = require('../../data/List');
    var numberUtil = require('../../util/number');
    var graphic = require('../../util/graphic');
    var colorUtil = require('zrender/lib/tool/color');
 
    var markerHelper = require('./markerHelper');
 
    var markAreaTransform = function (seriesModel, coordSys, maModel, item) {
        var lt = markerHelper.dataTransform(seriesModel, item[0]);
        var rb = markerHelper.dataTransform(seriesModel, item[1]);
        var retrieve = zrUtil.retrieve;
 
        // FIXME make sure lt is less than rb
        var ltCoord = lt.coord;
        var rbCoord = rb.coord;
        ltCoord[0] = retrieve(ltCoord[0], -Infinity);
        ltCoord[1] = retrieve(ltCoord[1], -Infinity);
 
        rbCoord[0] = retrieve(rbCoord[0], Infinity);
        rbCoord[1] = retrieve(rbCoord[1], Infinity);
 
        // Merge option into one
        var result = zrUtil.mergeAll([{}, lt, rb]);
 
        result.coord = [
            lt.coord, rb.coord
        ];
        result.x0 = lt.x;
        result.y0 = lt.y;
        result.x1 = rb.x;
        result.y1 = rb.y;
        return result;
    };
 
    function isInifinity(val) {
        return !isNaN(val) && !isFinite(val);
    }
 
    // If a markArea has one dim
    function ifMarkLineHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) {
        var otherDimIndex = 1 - dimIndex;
        return isInifinity(fromCoord[otherDimIndex]) && isInifinity(toCoord[otherDimIndex]);
    }
 
    function markAreaFilter(coordSys, item) {
        var fromCoord = item.coord[0];
        var toCoord = item.coord[1];
        if (coordSys.type === 'cartesian2d') {
            // In case
            // {
            //  markArea: {
            //    data: [{ yAxis: 2 }]
            //  }
            // }
            if (
                fromCoord && toCoord &&
                (ifMarkLineHasOnlyDim(1, fromCoord, toCoord, coordSys)
                || ifMarkLineHasOnlyDim(0, fromCoord, toCoord, coordSys))
            ) {
                return true;
            }
        }
        return markerHelper.dataFilter(coordSys, {
                coord: fromCoord,
                x: item.x0,
                y: item.y0
            })
            || markerHelper.dataFilter(coordSys, {
                coord: toCoord,
                x: item.x1,
                y: item.y1
            });
    }
 
    // dims can be ['x0', 'y0'], ['x1', 'y1'], ['x0', 'y1'], ['x1', 'y0']
    function getSingleMarkerEndPoint(data, idx, dims, seriesModel, api) {
        var coordSys = seriesModel.coordinateSystem;
        var itemModel = data.getItemModel(idx);
 
        var point;
        var xPx = numberUtil.parsePercent(itemModel.get(dims[0]), api.getWidth());
        var yPx = numberUtil.parsePercent(itemModel.get(dims[1]), api.getHeight());
        if (!isNaN(xPx) && !isNaN(yPx)) {
            point = [xPx, yPx];
        }
        else {
            // Chart like bar may have there own marker positioning logic
            if (seriesModel.getMarkerPosition) {
                // Use the getMarkerPoisition
                point = seriesModel.getMarkerPosition(
                    data.getValues(dims, idx)
                );
            }
            else {
                var x = data.get(dims[0], idx);
                var y = data.get(dims[1], idx);
                point = coordSys.dataToPoint([x, y], true);
            }
            if (coordSys.type === 'cartesian2d') {
                var xAxis = coordSys.getAxis('x');
                var yAxis = coordSys.getAxis('y');
                var x = data.get(dims[0], idx);
                var y = data.get(dims[1], idx);
                if (isInifinity(x)) {
                    point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[dims[0] === 'x0' ? 0 : 1]);
                }
                else if (isInifinity(y)) {
                    point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[dims[1] === 'y0' ? 0 : 1]);
                }
            }
 
            // Use x, y if has any
            if (!isNaN(xPx)) {
                point[0] = xPx;
            }
            if (!isNaN(yPx)) {
                point[1] = yPx;
            }
        }
 
        return point;
    }
 
    var dimPermutations = [['x0', 'y0'], ['x1', 'y0'], ['x1', 'y1'], ['x0', 'y1']];
 
    require('./MarkerView').extend({
 
        type: 'markArea',
 
        updateLayout: function (markAreaModel, ecModel, api) {
            ecModel.eachSeries(function (seriesModel) {
                var maModel = seriesModel.markAreaModel;
                if (maModel) {
                    var areaData = maModel.getData();
                    areaData.each(function (idx) {
                        var points = zrUtil.map(dimPermutations, function (dim) {
                            return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api);
                        });
                        // Layout
                        areaData.setItemLayout(idx, points);
                        var el = areaData.getItemGraphicEl(idx);
                        el.setShape('points', points);
                    });
                }
            }, this);
        },
 
        renderSeries: function (seriesModel, maModel, ecModel, api) {
            var coordSys = seriesModel.coordinateSystem;
            var seriesName = seriesModel.name;
            var seriesData = seriesModel.getData();
 
            var areaGroupMap = this.markerGroupMap;
            var polygonGroup = areaGroupMap[seriesName];
            if (!polygonGroup) {
                polygonGroup = areaGroupMap[seriesName] = {
                    group: new graphic.Group()
                };
            }
            this.group.add(polygonGroup.group);
            polygonGroup.__keep = true;
 
            var areaData = createList(coordSys, seriesModel, maModel);
 
            // Line data for tooltip and formatter
            maModel.setData(areaData);
 
            // Update visual and layout of line
            areaData.each(function (idx) {
                // Layout
                areaData.setItemLayout(idx, zrUtil.map(dimPermutations, function (dim) {
                    return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api);
                }));
 
                // Visual
                areaData.setItemVisual(idx, {
                    color: seriesData.getVisual('color')
                });
            });
 
 
            areaData.diff(polygonGroup.__data)
                .add(function (idx) {
                    var polygon = new graphic.Polygon({
                        shape: {
                            points: areaData.getItemLayout(idx)
                        }
                    });
                    areaData.setItemGraphicEl(idx, polygon);
                    polygonGroup.group.add(polygon);
                })
                .update(function (newIdx, oldIdx) {
                    var polygon = polygonGroup.__data.getItemGraphicEl(oldIdx);
                    graphic.updateProps(polygon, {
                        shape: {
                            points: areaData.getItemLayout(newIdx)
                        }
                    }, maModel, newIdx);
                    polygonGroup.group.add(polygon);
                    areaData.setItemGraphicEl(newIdx, polygon);
                })
                .remove(function (idx) {
                    var polygon = polygonGroup.__data.getItemGraphicEl(idx);
                    polygonGroup.group.remove(polygon);
                })
                .execute();
 
            areaData.eachItemGraphicEl(function (polygon, idx) {
                var itemModel = areaData.getItemModel(idx);
                var labelModel = itemModel.getModel('label.normal');
                var labelHoverModel = itemModel.getModel('label.emphasis');
                var color = areaData.getItemVisual(idx, 'color');
                polygon.useStyle(
                    zrUtil.defaults(
                        itemModel.getModel('itemStyle.normal').getItemStyle(),
                        {
                            fill: colorUtil.modifyAlpha(color, 0.4),
                            stroke: color
                        }
                    )
                );
 
                polygon.hoverStyle = itemModel.getModel('itemStyle.normal').getItemStyle();
 
                var defaultValue = areaData.getName(idx) || '';
                var textColor = color || polygon.style.fill;
 
                if (labelModel.getShallow('show')) {
                    graphic.setText(polygon.style, labelModel, textColor);
                    polygon.style.text = zrUtil.retrieve(
                        maModel.getFormattedLabel(idx, 'normal'),
                        defaultValue
                    );
                }
                else {
                    polygon.style.text = '';
                }
 
                if (labelHoverModel.getShallow('show')) {
                    graphic.setText(polygon.hoverStyle, labelHoverModel, textColor);
                    polygon.hoverStyle.text = zrUtil.retrieve(
                        maModel.getFormattedLabel(idx, 'emphasis'),
                        defaultValue
                    );
                }
                else {
                    polygon.hoverStyle.text = '';
                }
 
                graphic.setHoverStyle(polygon, {});
 
                polygon.dataModel = maModel;
            });
 
            polygonGroup.__data = areaData;
 
            polygonGroup.group.silent = maModel.get('silent') || seriesModel.get('silent');
        }
    });
 
    /**
     * @inner
     * @param {module:echarts/coord/*} coordSys
     * @param {module:echarts/model/Series} seriesModel
     * @param {module:echarts/model/Model} mpModel
     */
    function createList(coordSys, seriesModel, maModel) {
 
        var coordDimsInfos;
        var areaData;
        var dims = ['x0', 'y0', 'x1', 'y1'];
        if (coordSys) {
            coordDimsInfos = zrUtil.map(coordSys && coordSys.dimensions, function (coordDim) {
                var info = seriesModel.getData().getDimensionInfo(
                    seriesModel.coordDimToDataDim(coordDim)[0]
                ) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys
                info.name = coordDim;
                return info;
            });
            areaData = new List(zrUtil.map(dims, function (dim, idx) {
                return {
                    name: dim,
                    type: coordDimsInfos[idx % 2].type
                };
            }), maModel);
        }
        else {
            coordDimsInfos =[{
                name: 'value',
                type: 'float'
            }];
            areaData = new List(coordDimsInfos, maModel);
        }
 
        var optData = zrUtil.map(maModel.get('data'), zrUtil.curry(
            markAreaTransform, seriesModel, coordSys, maModel
        ));
        if (coordSys) {
            optData = zrUtil.filter(
                optData, zrUtil.curry(markAreaFilter, coordSys)
            );
        }
 
        var dimValueGetter = coordSys ? function (item, dimName, dataIndex, dimIndex) {
            return item.coord[Math.floor(dimIndex / 2)][dimIndex % 2];
        } : function (item) {
            return item.value;
        };
        areaData.initData(optData, null, dimValueGetter);
        areaData.hasItemOption = true;
        return areaData;
    }
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/marker/MarkLineModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/marker/MarkLineModel.js

Statements: 100% (1 / 1)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (1 / 1)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41    1                                                                            
 
 
    module.exports = require('./MarkerModel').extend({
 
        type: 'markLine',
 
        defaultOption: {
            zlevel: 0,
            z: 5,
 
            symbol: ['circle', 'arrow'],
            symbolSize: [8, 16],
 
            //symbolRotate: 0,
 
            precision: 2,
            tooltip: {
                trigger: 'item'
            },
            label: {
                normal: {
                    show: true,
                    position: 'end'
                },
                emphasis: {
                    show: true
                }
            },
            lineStyle: {
                normal: {
                    type: 'dashed'
                },
                emphasis: {
                    width: 3
                }
            },
            animationEasing: 'linear'
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/marker/MarkLineView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/marker/MarkLineView.js

Statements: 8.39% (13 / 155)      Branches: 0% (0 / 90)      Functions: 0% (0 / 21)      Lines: 8.39% (13 / 155)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356    1 1 1   1   1   1                                                                                                                                                     1         1             1                                           1                                                                                                                     1                                                                                                                                                                                                 1                                                   1                                                                                                            
 
 
    var zrUtil = require('zrender/lib/core/util');
    var List = require('../../data/List');
    var numberUtil = require('../../util/number');
 
    var markerHelper = require('./markerHelper');
 
    var LineDraw = require('../../chart/helper/LineDraw');
 
    var markLineTransform = function (seriesModel, coordSys, mlModel, item) {
        var data = seriesModel.getData();
        // Special type markLine like 'min', 'max', 'average'
        var mlType = item.type;
 
        if (!zrUtil.isArray(item)
            && (
                mlType === 'min' || mlType === 'max' || mlType === 'average'
                // In case
                // data: [{
                //   yAxis: 10
                // }]
                || (item.xAxis != null || item.yAxis != null)
            )
        ) {
            var valueAxis;
            var valueDataDim;
            var value;
 
            if (item.yAxis != null || item.xAxis != null) {
                valueDataDim = item.yAxis != null ? 'y' : 'x';
                valueAxis = coordSys.getAxis(valueDataDim);
 
                value = zrUtil.retrieve(item.yAxis, item.xAxis);
            }
            else {
                var axisInfo = markerHelper.getAxisInfo(item, data, coordSys, seriesModel);
                valueDataDim = axisInfo.valueDataDim;
                valueAxis = axisInfo.valueAxis;
                value = markerHelper.numCalculate(data, valueDataDim, mlType);
            }
            var valueIndex = valueDataDim === 'x' ? 0 : 1;
            var baseIndex = 1 - valueIndex;
 
            var mlFrom = zrUtil.clone(item);
            var mlTo = {};
 
            mlFrom.type = null;
 
            mlFrom.coord = [];
            mlTo.coord = [];
            mlFrom.coord[baseIndex] = -Infinity;
            mlTo.coord[baseIndex] = Infinity;
 
            var precision = mlModel.get('precision');
            if (precision >= 0 && typeof value === 'number') {
                value = +value.toFixed(precision);
            }
 
            mlFrom.coord[valueIndex] = mlTo.coord[valueIndex] = value;
 
            item = [mlFrom, mlTo, { // Extra option for tooltip and label
                type: mlType,
                valueIndex: item.valueIndex,
                // Force to use the value of calculated value.
                value: value
            }];
        }
 
        item = [
            markerHelper.dataTransform(seriesModel, item[0]),
            markerHelper.dataTransform(seriesModel, item[1]),
            zrUtil.extend({}, item[2])
        ];
 
        // Avoid line data type is extended by from(to) data type
        item[2].type = item[2].type || '';
 
        // Merge from option and to option into line option
        zrUtil.merge(item[2], item[0]);
        zrUtil.merge(item[2], item[1]);
 
        return item;
    };
 
    function isInifinity(val) {
        return !isNaN(val) && !isFinite(val);
    }
 
    // If a markLine has one dim
    function ifMarkLineHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) {
        var otherDimIndex = 1 - dimIndex;
        var dimName = coordSys.dimensions[dimIndex];
        return isInifinity(fromCoord[otherDimIndex]) && isInifinity(toCoord[otherDimIndex])
            && fromCoord[dimIndex] === toCoord[dimIndex] && coordSys.getAxis(dimName).containData(fromCoord[dimIndex]);
    }
 
    function markLineFilter(coordSys, item) {
        if (coordSys.type === 'cartesian2d') {
            var fromCoord = item[0].coord;
            var toCoord = item[1].coord;
            // In case
            // {
            //  markLine: {
            //    data: [{ yAxis: 2 }]
            //  }
            // }
            if (
                fromCoord && toCoord &&
                (ifMarkLineHasOnlyDim(1, fromCoord, toCoord, coordSys)
                || ifMarkLineHasOnlyDim(0, fromCoord, toCoord, coordSys))
            ) {
                return true;
            }
        }
        return markerHelper.dataFilter(coordSys, item[0])
            && markerHelper.dataFilter(coordSys, item[1]);
    }
 
    function updateSingleMarkerEndLayout(
        data, idx, isFrom, seriesModel, api
    ) {
        var coordSys = seriesModel.coordinateSystem;
        var itemModel = data.getItemModel(idx);
 
        var point;
        var xPx = numberUtil.parsePercent(itemModel.get('x'), api.getWidth());
        var yPx = numberUtil.parsePercent(itemModel.get('y'), api.getHeight());
        if (!isNaN(xPx) && !isNaN(yPx)) {
            point = [xPx, yPx];
        }
        else {
            // Chart like bar may have there own marker positioning logic
            if (seriesModel.getMarkerPosition) {
                // Use the getMarkerPoisition
                point = seriesModel.getMarkerPosition(
                    data.getValues(data.dimensions, idx)
                );
            }
            else {
                var dims = coordSys.dimensions;
                var x = data.get(dims[0], idx);
                var y = data.get(dims[1], idx);
                point = coordSys.dataToPoint([x, y]);
            }
            // Expand line to the edge of grid if value on one axis is Inifnity
            // In case
            //  markLine: {
            //    data: [{
            //      yAxis: 2
            //      // or
            //      type: 'average'
            //    }]
            //  }
            if (coordSys.type === 'cartesian2d') {
                var xAxis = coordSys.getAxis('x');
                var yAxis = coordSys.getAxis('y');
                var dims = coordSys.dimensions;
                if (isInifinity(data.get(dims[0], idx))) {
                    point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[isFrom ? 0 : 1]);
                }
                else if (isInifinity(data.get(dims[1], idx))) {
                    point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[isFrom ? 0 : 1]);
                }
            }
 
            // Use x, y if has any
            if (!isNaN(xPx)) {
                point[0] = xPx;
            }
            if (!isNaN(yPx)) {
                point[1] = yPx;
            }
        }
 
        data.setItemLayout(idx, point);
    }
 
    require('./MarkerView').extend({
 
        type: 'markLine',
 
        updateLayout: function (markLineModel, ecModel, api) {
            ecModel.eachSeries(function (seriesModel) {
                var mlModel = seriesModel.markLineModel;
                if (mlModel) {
                    var mlData = mlModel.getData();
                    var fromData = mlModel.__from;
                    var toData = mlModel.__to;
                    // Update visual and layout of from symbol and to symbol
                    fromData.each(function (idx) {
                        updateSingleMarkerEndLayout(fromData, idx, true, seriesModel, api);
                        updateSingleMarkerEndLayout(toData, idx, false, seriesModel, api);
                    });
                    // Update layout of line
                    mlData.each(function (idx) {
                        mlData.setItemLayout(idx, [
                            fromData.getItemLayout(idx),
                            toData.getItemLayout(idx)
                        ]);
                    });
 
                    this.markerGroupMap[seriesModel.name].updateLayout();
 
                }
            }, this);
        },
 
        renderSeries: function (seriesModel, mlModel, ecModel, api) {
            var coordSys = seriesModel.coordinateSystem;
            var seriesName = seriesModel.name;
            var seriesData = seriesModel.getData();
 
            var lineDrawMap = this.markerGroupMap;
            var lineDraw = lineDrawMap[seriesName];
            if (!lineDraw) {
                lineDraw = lineDrawMap[seriesName] = new LineDraw();
            }
            this.group.add(lineDraw.group);
 
            var mlData = createList(coordSys, seriesModel, mlModel);
 
            var fromData = mlData.from;
            var toData = mlData.to;
            var lineData = mlData.line;
 
            mlModel.__from = fromData;
            mlModel.__to = toData;
            // Line data for tooltip and formatter
            mlModel.setData(lineData);
 
            var symbolType = mlModel.get('symbol');
            var symbolSize = mlModel.get('symbolSize');
            if (!zrUtil.isArray(symbolType)) {
                symbolType = [symbolType, symbolType];
            }
            if (typeof symbolSize === 'number') {
                symbolSize = [symbolSize, symbolSize];
            }
 
            // Update visual and layout of from symbol and to symbol
            mlData.from.each(function (idx) {
                updateDataVisualAndLayout(fromData, idx, true);
                updateDataVisualAndLayout(toData, idx, false);
            });
 
            // Update visual and layout of line
            lineData.each(function (idx) {
                var lineColor = lineData.getItemModel(idx).get('lineStyle.normal.color');
                lineData.setItemVisual(idx, {
                    color: lineColor || fromData.getItemVisual(idx, 'color')
                });
                lineData.setItemLayout(idx, [
                    fromData.getItemLayout(idx),
                    toData.getItemLayout(idx)
                ]);
 
                lineData.setItemVisual(idx, {
                    'fromSymbolSize': fromData.getItemVisual(idx, 'symbolSize'),
                    'fromSymbol': fromData.getItemVisual(idx, 'symbol'),
                    'toSymbolSize': toData.getItemVisual(idx, 'symbolSize'),
                    'toSymbol': toData.getItemVisual(idx, 'symbol')
                });
            });
 
            lineDraw.updateData(lineData);
 
            // Set host model for tooltip
            // FIXME
            mlData.line.eachItemGraphicEl(function (el, idx) {
                el.traverse(function (child) {
                    child.dataModel = mlModel;
                });
            });
 
            function updateDataVisualAndLayout(data, idx, isFrom) {
                var itemModel = data.getItemModel(idx);
 
                updateSingleMarkerEndLayout(
                    data, idx, isFrom, seriesModel, api
                );
 
                data.setItemVisual(idx, {
                    symbolSize: itemModel.get('symbolSize') || symbolSize[isFrom ? 0 : 1],
                    symbol: itemModel.get('symbol', true) || symbolType[isFrom ? 0 : 1],
                    color: itemModel.get('itemStyle.normal.color') || seriesData.getVisual('color')
                });
            }
 
            lineDraw.__keep = true;
 
            lineDraw.group.silent = mlModel.get('silent') || seriesModel.get('silent');
        }
    });
 
    /**
     * @inner
     * @param {module:echarts/coord/*} coordSys
     * @param {module:echarts/model/Series} seriesModel
     * @param {module:echarts/model/Model} mpModel
     */
    function createList(coordSys, seriesModel, mlModel) {
 
        var coordDimsInfos;
        if (coordSys) {
            coordDimsInfos = zrUtil.map(coordSys && coordSys.dimensions, function (coordDim) {
                var info = seriesModel.getData().getDimensionInfo(
                    seriesModel.coordDimToDataDim(coordDim)[0]
                ) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys
                info.name = coordDim;
                return info;
            });
        }
        else {
            coordDimsInfos =[{
                name: 'value',
                type: 'float'
            }];
        }
 
        var fromData = new List(coordDimsInfos, mlModel);
        var toData = new List(coordDimsInfos, mlModel);
        // No dimensions
        var lineData = new List([], mlModel);
 
        var optData = zrUtil.map(mlModel.get('data'), zrUtil.curry(
            markLineTransform, seriesModel, coordSys, mlModel
        ));
        if (coordSys) {
            optData = zrUtil.filter(
                optData, zrUtil.curry(markLineFilter, coordSys)
            );
        }
        var dimValueGetter = coordSys ? markerHelper.dimValueGetter : function (item) {
            return item.value;
        };
        fromData.initData(
            zrUtil.map(optData, function (item) { return item[0]; }),
            null, dimValueGetter
        );
        toData.initData(
            zrUtil.map(optData, function (item) { return item[1]; }),
            null, dimValueGetter
        );
        lineData.initData(
            zrUtil.map(optData, function (item) { return item[2]; })
        );
        lineData.hasItemOption = true;
        return {
            from: fromData,
            to: toData,
            line: lineData
        };
    }
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/marker/MarkPointModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/marker/MarkPointModel.js

Statements: 100% (1 / 1)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (1 / 1)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34    1                                                              
 
 
    module.exports = require('./MarkerModel').extend({
 
        type: 'markPoint',
 
        defaultOption: {
            zlevel: 0,
            z: 5,
            symbol: 'pin',
            symbolSize: 50,
            //symbolRotate: 0,
            //symbolOffset: [0, 0]
            tooltip: {
                trigger: 'item'
            },
            label: {
                normal: {
                    show: true,
                    position: 'inside'
                },
                emphasis: {
                    show: true
                }
            },
            itemStyle: {
                normal: {
                    borderWidth: 2
                }
            }
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/marker/MarkPointView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/marker/MarkPointView.js

Statements: 11.59% (8 / 69)      Branches: 0% (0 / 32)      Functions: 0% (0 / 11)      Lines: 11.59% (8 / 69)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157    1 1 1   1   1   1                                                                       1                                                                                                                                                 1                                                                          
 
 
    var SymbolDraw = require('../../chart/helper/SymbolDraw');
    var zrUtil = require('zrender/lib/core/util');
    var numberUtil = require('../../util/number');
 
    var List = require('../../data/List');
 
    var markerHelper = require('./markerHelper');
 
    function updateMarkerLayout(mpData, seriesModel, api) {
        var coordSys = seriesModel.coordinateSystem;
        mpData.each(function (idx) {
            var itemModel = mpData.getItemModel(idx);
            var point;
            var xPx = numberUtil.parsePercent(itemModel.get('x'), api.getWidth());
            var yPx = numberUtil.parsePercent(itemModel.get('y'), api.getHeight());
            if (!isNaN(xPx) && !isNaN(yPx)) {
                point = [xPx, yPx];
            }
            // Chart like bar may have there own marker positioning logic
            else if (seriesModel.getMarkerPosition) {
                // Use the getMarkerPoisition
                point = seriesModel.getMarkerPosition(
                    mpData.getValues(mpData.dimensions, idx)
                );
            }
            else if (coordSys) {
                var x = mpData.get(coordSys.dimensions[0], idx);
                var y = mpData.get(coordSys.dimensions[1], idx);
                point = coordSys.dataToPoint([x, y]);
 
            }
 
            // Use x, y if has any
            if (!isNaN(xPx)) {
                point[0] = xPx;
            }
            if (!isNaN(yPx)) {
                point[1] = yPx;
            }
 
            mpData.setItemLayout(idx, point);
        });
    }
 
    require('./MarkerView').extend({
 
        type: 'markPoint',
 
        updateLayout: function (markPointModel, ecModel, api) {
            ecModel.eachSeries(function (seriesModel) {
                var mpModel = seriesModel.markPointModel;
                if (mpModel) {
                    updateMarkerLayout(mpModel.getData(), seriesModel, api);
                    this.markerGroupMap[seriesModel.name].updateLayout(mpModel);
                }
            }, this);
        },
 
        renderSeries: function (seriesModel, mpModel, ecModel, api) {
            var coordSys = seriesModel.coordinateSystem;
            var seriesName = seriesModel.name;
            var seriesData = seriesModel.getData();
 
            var symbolDrawMap = this.markerGroupMap;
            var symbolDraw = symbolDrawMap[seriesName];
            if (!symbolDraw) {
                symbolDraw = symbolDrawMap[seriesName] = new SymbolDraw();
            }
 
            var mpData = createList(coordSys, seriesModel, mpModel);
 
            // FIXME
            mpModel.setData(mpData);
 
            updateMarkerLayout(mpModel.getData(), seriesModel, api);
 
            mpData.each(function (idx) {
                var itemModel = mpData.getItemModel(idx);
                var symbolSize = itemModel.getShallow('symbolSize');
                if (typeof symbolSize === 'function') {
                    // FIXME 这里不兼容 ECharts 2.x,2.x 貌似参数是整个数据?
                    symbolSize = symbolSize(
                        mpModel.getRawValue(idx), mpModel.getDataParams(idx)
                    );
                }
                mpData.setItemVisual(idx, {
                    symbolSize: symbolSize,
                    color: itemModel.get('itemStyle.normal.color')
                        || seriesData.getVisual('color'),
                    symbol: itemModel.getShallow('symbol')
                });
            });
 
            // TODO Text are wrong
            symbolDraw.updateData(mpData);
            this.group.add(symbolDraw.group);
 
            // Set host model for tooltip
            // FIXME
            mpData.eachItemGraphicEl(function (el) {
                el.traverse(function (child) {
                    child.dataModel = mpModel;
                });
            });
 
            symbolDraw.__keep = true;
 
            symbolDraw.group.silent = mpModel.get('silent') || seriesModel.get('silent');
        }
    });
 
    /**
     * @inner
     * @param {module:echarts/coord/*} [coordSys]
     * @param {module:echarts/model/Series} seriesModel
     * @param {module:echarts/model/Model} mpModel
     */
    function createList(coordSys, seriesModel, mpModel) {
        var coordDimsInfos;
        if (coordSys) {
            coordDimsInfos = zrUtil.map(coordSys && coordSys.dimensions, function (coordDim) {
                var info = seriesModel.getData().getDimensionInfo(
                    seriesModel.coordDimToDataDim(coordDim)[0]
                ) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys
                info.name = coordDim;
                return info;
            });
        }
        else {
            coordDimsInfos =[{
                name: 'value',
                type: 'float'
            }];
        }
 
        var mpData = new List(coordDimsInfos, mpModel);
        var dataOpt = zrUtil.map(mpModel.get('data'), zrUtil.curry(
                markerHelper.dataTransform, seriesModel
            ));
        if (coordSys) {
            dataOpt = zrUtil.filter(
                dataOpt, zrUtil.curry(markerHelper.dataFilter, coordSys)
            );
        }
 
        mpData.initData(dataOpt, null,
            coordSys ? markerHelper.dimValueGetter : function (item) {
                return item.value;
            }
        );
        return mpData;
    }
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/marker/MarkerModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/marker/MarkerModel.js

Statements: 17.24% (10 / 58)      Branches: 0% (0 / 33)      Functions: 0% (0 / 9)      Lines: 17.24% (10 / 58)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134    1 1 1   1 1 1   1           1                                                                                                                                                                                                                                 1   1    
 
 
    var modelUtil = require('../../util/model');
    var zrUtil = require('zrender/lib/core/util');
    var env = require('zrender/lib/core/env');
 
    var formatUtil = require('../../util/format');
    var addCommas = formatUtil.addCommas;
    var encodeHTML = formatUtil.encodeHTML;
 
    function fillLabel(opt) {
        modelUtil.defaultEmphasis(
            opt.label,
            modelUtil.LABEL_OPTIONS
        );
    }
    var MarkerModel = require('../../echarts').extendComponentModel({
 
        type: 'marker',
 
        dependencies: ['series', 'grid', 'polar', 'geo'],
        /**
         * @overrite
         */
        init: function (option, parentModel, ecModel, extraOpt) {
 
            if (__DEV__) {
                if (this.type === 'marker') {
                    throw new Error('Marker component is abstract component. Use markLine, markPoint, markArea instead.');
                }
            }
            this.mergeDefaultAndTheme(option, ecModel);
            this.mergeOption(option, ecModel, extraOpt.createdBySelf, true);
        },
 
        /**
         * @return {boolean}
         */
        isAnimationEnabled: function () {
            if (env.node) {
                return false;
            }
 
            var hostSeries = this.__hostSeries;
            return this.getShallow('animation') && hostSeries && hostSeries.isAnimationEnabled();
        },
 
        mergeOption: function (newOpt, ecModel, createdBySelf, isInit) {
            var MarkerModel = this.constructor;
            var modelPropName = this.mainType + 'Model';
            if (!createdBySelf) {
                ecModel.eachSeries(function (seriesModel) {
 
                    var markerOpt = seriesModel.get(this.mainType);
 
                    var markerModel = seriesModel[modelPropName];
                    if (!markerOpt || !markerOpt.data) {
                        seriesModel[modelPropName] = null;
                        return;
                    }
                    if (!markerModel) {
                        if (isInit) {
                            // Default label emphasis `position` and `show`
                            fillLabel(markerOpt);
                        }
                        zrUtil.each(markerOpt.data, function (item) {
                            // FIXME Overwrite fillLabel method ?
                            if (item instanceof Array) {
                                fillLabel(item[0]);
                                fillLabel(item[1]);
                            }
                            else {
                                fillLabel(item);
                            }
                        });
 
                        markerModel = new MarkerModel(
                            markerOpt, this, ecModel
                        );
 
                        zrUtil.extend(markerModel, {
                            mainType: this.mainType,
                            // Use the same series index and name
                            seriesIndex: seriesModel.seriesIndex,
                            name: seriesModel.name,
                            createdBySelf: true
                        });
 
                        markerModel.__hostSeries = seriesModel;
                    }
                    else {
                        markerModel.mergeOption(markerOpt, ecModel, true);
                    }
                    seriesModel[modelPropName] = markerModel;
                }, this);
            }
        },
 
        formatTooltip: function (dataIndex) {
            var data = this.getData();
            var value = this.getRawValue(dataIndex);
            var formattedValue = zrUtil.isArray(value)
                ? zrUtil.map(value, addCommas).join(', ') : addCommas(value);
            var name = data.getName(dataIndex);
            var html = encodeHTML(this.name);
            if (value != null || name) {
                html += '<br />';
            }
            if (name) {
                html += encodeHTML(name);
                if (value != null) {
                    html += ' : ';
                }
            }
            if (value != null) {
                html += encodeHTML(formattedValue);
            }
            return html;
        },
 
        getData: function () {
            return this._data;
        },
 
        setData: function (data) {
            this._data = data;
        }
    });
 
    zrUtil.mixin(MarkerModel, modelUtil.dataFormatMixin);
 
    module.exports = MarkerModel;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/marker/MarkerView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/marker/MarkerView.js

Statements: 7.69% (1 / 13)      Branches: 0% (0 / 8)      Functions: 0% (0 / 4)      Lines: 7.69% (1 / 13)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40    1                                                                          
 
 
    module.exports = require('../../echarts').extendComponentView({
 
        type: 'marker',
 
        init: function () {
            /**
             * Markline grouped by series
             * @private
             * @type {Object}
             */
            this.markerGroupMap = {};
        },
 
        render: function (markerModel, ecModel, api) {
            var markerGroupMap = this.markerGroupMap;
            for (var name in markerGroupMap) {
                if (markerGroupMap.hasOwnProperty(name)) {
                    markerGroupMap[name].__keep = false;
                }
            }
 
            var markerModelKey = this.type + 'Model';
            ecModel.eachSeries(function (seriesModel) {
                var markerModel = seriesModel[markerModelKey];
                markerModel && this.renderSeries(seriesModel, markerModel, ecModel, api);
            }, this);
 
            for (var name in markerGroupMap) {
                if (markerGroupMap.hasOwnProperty(name) && !markerGroupMap[name].__keep) {
                    this.group.remove(markerGroupMap[name].group);
                }
            }
        },
 
        renderSeries: function () {}
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/marker/markerHelper.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/marker/markerHelper.js

Statements: 20.55% (15 / 73)      Branches: 0% (0 / 46)      Functions: 0% (0 / 10)      Lines: 20.55% (15 / 73)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200    1 1 1   1       1       1                             1                                   1   1                                                                   1                                                                                                   1                                                     1           1               1                                 1                
 
 
    var zrUtil = require('zrender/lib/core/util');
    var numberUtil = require('../../util/number');
    var indexOf = zrUtil.indexOf;
 
    function hasXOrY(item) {
        return !(isNaN(parseFloat(item.x)) && isNaN(parseFloat(item.y)));
    }
 
    function hasXAndY(item) {
        return !isNaN(parseFloat(item.x)) && !isNaN(parseFloat(item.y));
    }
 
    function getPrecision(data, valueAxisDim, dataIndex) {
        var precision = -1;
        do {
            precision = Math.max(
                numberUtil.getPrecision(data.get(
                    valueAxisDim, dataIndex
                )),
                precision
            );
            data = data.stackedOn;
        } while (data);
 
        return precision;
    }
 
    function markerTypeCalculatorWithExtent(
        mlType, data, otherDataDim, targetDataDim, otherCoordIndex, targetCoordIndex
    ) {
        var coordArr = [];
        var value = numCalculate(data, targetDataDim, mlType);
 
        var dataIndex = data.indicesOfNearest(targetDataDim, value, true)[0];
        coordArr[otherCoordIndex] = data.get(otherDataDim, dataIndex, true);
        coordArr[targetCoordIndex] = data.get(targetDataDim, dataIndex, true);
 
        var precision = getPrecision(data, targetDataDim, dataIndex);
        if (precision >= 0) {
            coordArr[targetCoordIndex] = +coordArr[targetCoordIndex].toFixed(precision);
        }
 
        return coordArr;
    }
 
    var curry = zrUtil.curry;
    // TODO Specified percent
    var markerTypeCalculator = {
        /**
         * @method
         * @param {module:echarts/data/List} data
         * @param {string} baseAxisDim
         * @param {string} valueAxisDim
         */
        min: curry(markerTypeCalculatorWithExtent, 'min'),
        /**
         * @method
         * @param {module:echarts/data/List} data
         * @param {string} baseAxisDim
         * @param {string} valueAxisDim
         */
        max: curry(markerTypeCalculatorWithExtent, 'max'),
 
        /**
         * @method
         * @param {module:echarts/data/List} data
         * @param {string} baseAxisDim
         * @param {string} valueAxisDim
         */
        average: curry(markerTypeCalculatorWithExtent, 'average')
    };
 
    /**
     * Transform markPoint data item to format used in List by do the following
     * 1. Calculate statistic like `max`, `min`, `average`
     * 2. Convert `item.xAxis`, `item.yAxis` to `item.coord` array
     * @param  {module:echarts/model/Series} seriesModel
     * @param  {module:echarts/coord/*} [coordSys]
     * @param  {Object} item
     * @return {Object}
     */
    var dataTransform = function (seriesModel, item) {
        var data = seriesModel.getData();
        var coordSys = seriesModel.coordinateSystem;
 
        // 1. If not specify the position with pixel directly
        // 2. If `coord` is not a data array. Which uses `xAxis`,
        // `yAxis` to specify the coord on each dimension
 
        // parseFloat first because item.x and item.y can be percent string like '20%'
        if (item && !hasXAndY(item) && !zrUtil.isArray(item.coord) && coordSys) {
            var dims = coordSys.dimensions;
            var axisInfo = getAxisInfo(item, data, coordSys, seriesModel);
 
            // Clone the option
            // Transform the properties xAxis, yAxis, radiusAxis, angleAxis, geoCoord to value
            item = zrUtil.clone(item);
 
            if (item.type
                && markerTypeCalculator[item.type]
                && axisInfo.baseAxis && axisInfo.valueAxis
            ) {
                var otherCoordIndex = indexOf(dims, axisInfo.baseAxis.dim);
                var targetCoordIndex = indexOf(dims, axisInfo.valueAxis.dim);
 
                item.coord = markerTypeCalculator[item.type](
                    data, axisInfo.baseDataDim, axisInfo.valueDataDim,
                    otherCoordIndex, targetCoordIndex
                );
                // Force to use the value of calculated value.
                item.value = item.coord[targetCoordIndex];
            }
            else {
                // FIXME Only has one of xAxis and yAxis.
                var coord = [
                    item.xAxis != null ? item.xAxis : item.radiusAxis,
                    item.yAxis != null ? item.yAxis : item.angleAxis
                ];
                // Each coord support max, min, average
                for (var i = 0; i < 2; i++) {
                    if (markerTypeCalculator[coord[i]]) {
                        var dataDim = seriesModel.coordDimToDataDim(dims[i])[0];
                        coord[i] = numCalculate(data, dataDim, coord[i]);
                    }
                }
                item.coord = coord;
            }
        }
        return item;
    };
 
    var getAxisInfo = function (item, data, coordSys, seriesModel) {
        var ret = {};
 
        if (item.valueIndex != null || item.valueDim != null) {
            ret.valueDataDim = item.valueIndex != null
                ? data.getDimension(item.valueIndex) : item.valueDim;
            ret.valueAxis = coordSys.getAxis(seriesModel.dataDimToCoordDim(ret.valueDataDim));
            ret.baseAxis = coordSys.getOtherAxis(ret.valueAxis);
            ret.baseDataDim = seriesModel.coordDimToDataDim(ret.baseAxis.dim)[0];
        }
        else {
            ret.baseAxis = seriesModel.getBaseAxis();
            ret.valueAxis = coordSys.getOtherAxis(ret.baseAxis);
            ret.baseDataDim = seriesModel.coordDimToDataDim(ret.baseAxis.dim)[0];
            ret.valueDataDim = seriesModel.coordDimToDataDim(ret.valueAxis.dim)[0];
        }
 
        return ret;
    };
 
    /**
     * Filter data which is out of coordinateSystem range
     * [dataFilter description]
     * @param  {module:echarts/coord/*} [coordSys]
     * @param  {Object} item
     * @return {boolean}
     */
    var dataFilter = function (coordSys, item) {
        // Alwalys return true if there is no coordSys
        return (coordSys && coordSys.containData && item.coord && !hasXOrY(item))
            ? coordSys.containData(item.coord) : true;
    };
 
    var dimValueGetter = function (item, dimName, dataIndex, dimIndex) {
        // x, y, radius, angle
        if (dimIndex < 2) {
            return item.coord && item.coord[dimIndex];
        }
        return item.value;
    };
 
    var numCalculate = function (data, valueDataDim, type) {
        if (type === 'average') {
            var sum = 0;
            var count = 0;
            data.each(valueDataDim, function (val, idx) {
                if (!isNaN(val)) {
                    sum += val;
                    count++;
                }
            }, true);
            return sum / count;
        }
        else {
            return data.getDataExtent(valueDataDim, true)[type === 'max' ? 1 : 0];
        }
    };
 
    module.exports = {
        dataTransform: dataTransform,
        dataFilter: dataFilter,
        dimValueGetter: dimValueGetter,
        getAxisInfo: getAxisInfo,
        numCalculate: numCalculate
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/radar/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/radar/

Statements: 7.79% (6 / 77)      Branches: 0% (0 / 26)      Functions: 0% (0 / 10)      Lines: 7.79% (6 / 77)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/component/radar/
File Statements Branches Functions Lines
RadarView.js 7.79% (6 / 77) 0% (0 / 26) 0% (0 / 10) 7.79% (6 / 77)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/radar/RadarView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/radar/RadarView.js

Statements: 7.79% (6 / 77)      Branches: 0% (0 / 26)      Functions: 0% (0 / 10)      Lines: 7.79% (6 / 77)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176    1 1 1   1       1                                                                                                             1                                                                                                                                                                                                                            
 
 
    var AxisBuilder = require('../axis/AxisBuilder');
    var zrUtil = require('zrender/lib/core/util');
    var graphic = require('../../util/graphic');
 
    var axisBuilderAttrs = [
        'axisLine', 'axisLabel', 'axisTick', 'axisName'
    ];
 
    module.exports = require('../../echarts').extendComponentView({
 
        type: 'radar',
 
        render: function (radarModel, ecModel, api) {
            var group = this.group;
            group.removeAll();
 
            this._buildAxes(radarModel);
            this._buildSplitLineAndArea(radarModel);
        },
 
        _buildAxes: function (radarModel) {
            var radar = radarModel.coordinateSystem;
            var indicatorAxes = radar.getIndicatorAxes();
            var axisBuilders = zrUtil.map(indicatorAxes, function (indicatorAxis) {
                var axisBuilder = new AxisBuilder(indicatorAxis.model, {
                    position: [radar.cx, radar.cy],
                    rotation: indicatorAxis.angle,
                    labelDirection: -1,
                    tickDirection: -1,
                    nameDirection: 1
                });
                return axisBuilder;
            });
 
            zrUtil.each(axisBuilders, function (axisBuilder) {
                zrUtil.each(axisBuilderAttrs, axisBuilder.add, axisBuilder);
                this.group.add(axisBuilder.getGroup());
            }, this);
        },
 
        _buildSplitLineAndArea: function (radarModel) {
            var radar = radarModel.coordinateSystem;
            var indicatorAxes = radar.getIndicatorAxes();
            if (!indicatorAxes.length) {
                return;
            }
            var shape = radarModel.get('shape');
            var splitLineModel = radarModel.getModel('splitLine');
            var splitAreaModel = radarModel.getModel('splitArea');
            var lineStyleModel = splitLineModel.getModel('lineStyle');
            var areaStyleModel = splitAreaModel.getModel('areaStyle');
 
            var showSplitLine = splitLineModel.get('show');
            var showSplitArea = splitAreaModel.get('show');
            var splitLineColors = lineStyleModel.get('color');
            var splitAreaColors = areaStyleModel.get('color');
 
            splitLineColors = zrUtil.isArray(splitLineColors) ? splitLineColors : [splitLineColors];
            splitAreaColors = zrUtil.isArray(splitAreaColors) ? splitAreaColors : [splitAreaColors];
 
            var splitLines = [];
            var splitAreas = [];
 
            function getColorIndex(areaOrLine, areaOrLineColorList, idx) {
                var colorIndex = idx % areaOrLineColorList.length;
                areaOrLine[colorIndex] = areaOrLine[colorIndex] || [];
                return colorIndex;
            }
 
            if (shape === 'circle') {
                var ticksRadius = indicatorAxes[0].getTicksCoords();
                var cx = radar.cx;
                var cy = radar.cy;
                for (var i = 0; i < ticksRadius.length; i++) {
                    if (showSplitLine) {
                        var colorIndex = getColorIndex(splitLines, splitLineColors, i);
                        splitLines[colorIndex].push(new graphic.Circle({
                            shape: {
                                cx: cx,
                                cy: cy,
                                r: ticksRadius[i]
                            }
                        }));
                    }
                    if (showSplitArea && i < ticksRadius.length - 1) {
                        var colorIndex = getColorIndex(splitAreas, splitAreaColors, i);
                        splitAreas[colorIndex].push(new graphic.Ring({
                            shape: {
                                cx: cx,
                                cy: cy,
                                r0: ticksRadius[i],
                                r: ticksRadius[i + 1]
                            }
                        }));
                    }
                }
            }
            // Polyyon
            else {
                var realSplitNumber = -1;
                var axesTicksPoints = zrUtil.map(indicatorAxes, function (indicatorAxis, idx) {
                    var ticksCoords = indicatorAxis.getTicksCoords();
                    realSplitNumber = Math.max(ticksCoords.length - 1, realSplitNumber);
                    return zrUtil.map(ticksCoords, function (tickCoord) {
                        return radar.coordToPoint(tickCoord, idx);
                    });
                });
 
                var prevPoints = [];
                for (var i = 0; i <= realSplitNumber; i++) {
                    var points = [];
                    for (var j = 0; j < indicatorAxes.length; j++) {
                        points.push(axesTicksPoints[j][i]);
                    }
                    // Close
                    if (points[0]) {
                        points.push(points[0].slice());
                    }
                    else {
                        if (__DEV__) {
                            console.error('Can\'t draw value axis ' + i);
                        }
                    }
                    if (showSplitLine) {
                        var colorIndex = getColorIndex(splitLines, splitLineColors, i);
                        splitLines[colorIndex].push(new graphic.Polyline({
                            shape: {
                                points: points
                            }
                        }));
                    }
                    if (showSplitArea && prevPoints) {
                        var colorIndex = getColorIndex(splitAreas, splitAreaColors, i - 1);
                        splitAreas[colorIndex].push(new graphic.Polygon({
                            shape: {
                                points: points.concat(prevPoints)
                            }
                        }));
                    }
                    prevPoints = points.slice().reverse();
                }
            }
 
            var lineStyle = lineStyleModel.getLineStyle();
            var areaStyle = areaStyleModel.getAreaStyle();
            // Add splitArea before splitLine
            zrUtil.each(splitAreas, function (splitAreas, idx) {
                this.group.add(graphic.mergePath(
                    splitAreas, {
                        style: zrUtil.defaults({
                            stroke: 'none',
                            fill: splitAreaColors[idx % splitAreaColors.length]
                        }, areaStyle),
                        silent: true
                    }
                ));
            }, this);
 
            zrUtil.each(splitLines, function (splitLines, idx) {
                this.group.add(graphic.mergePath(
                    splitLines, {
                        style: zrUtil.defaults({
                            fill: 'none',
                            stroke: splitLineColors[idx % splitLineColors.length]
                        }, lineStyle),
                        silent: true
                    }
                ));
            }, this);
 
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/timeline/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/timeline/

Statements: 13.15% (56 / 426)      Branches: 0% (0 / 220)      Functions: 0% (0 / 66)      Lines: 13.15% (56 / 426)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/component/timeline/
File Statements Branches Functions Lines
SliderTimelineModel.js 100% (6 / 6) 100% (0 / 0) 100% (0 / 0) 100% (6 / 6)
SliderTimelineView.js 8.68% (25 / 288) 0% (0 / 125) 0% (0 / 42) 8.68% (25 / 288)
TimelineAxis.js 30.43% (7 / 23) 0% (0 / 13) 0% (0 / 3) 30.43% (7 / 23)
TimelineModel.js 12.5% (6 / 48) 0% (0 / 23) 0% (0 / 11) 12.5% (6 / 48)
TimelineView.js 100% (2 / 2) 100% (0 / 0) 100% (0 / 0) 100% (2 / 2)
preprocessor.js 11.63% (5 / 43) 0% (0 / 47) 0% (0 / 7) 11.63% (5 / 43)
timelineAction.js 28.57% (4 / 14) 0% (0 / 12) 0% (0 / 2) 28.57% (4 / 14)
typeDefaulter.js 50% (1 / 2) 100% (0 / 0) 0% (0 / 1) 50% (1 / 2)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/timeline/SliderTimelineModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/timeline/SliderTimelineModel.js

Statements: 100% (6 / 6)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (6 / 6)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112          1 1 1   1                                                                                                                                                                                                   1   1    
/**
 * @file Silder timeline model
 */
 
 
    var TimelineModel = require('./TimelineModel');
    var zrUtil = require('zrender/lib/core/util');
    var modelUtil = require('../../util/model');
 
    var SliderTimelineModel = TimelineModel.extend({
 
        type: 'timeline.slider',
 
        /**
         * @protected
         */
        defaultOption: {
 
            backgroundColor: 'rgba(0,0,0,0)',   // 时间轴背景颜色
            borderColor: '#ccc',               // 时间轴边框颜色
            borderWidth: 0,                    // 时间轴边框线宽,单位px,默认为0(无边框)
 
            orient: 'horizontal',              // 'vertical'
            inverse: false,
 
            tooltip: {                          // boolean or Object
                trigger: 'item'                 // data item may also have tootip attr.
            },
 
            symbol: 'emptyCircle',
            symbolSize: 10,
 
            lineStyle: {
                show: true,
                width: 2,
                color: '#304654'
            },
            label: {                            // 文本标签
                position: 'auto',           // auto left right top bottom
                                            // When using number, label position is not
                                            // restricted by viewRect.
                                            // positive: right/bottom, negative: left/top
                normal: {
                    show: true,
                    interval: 'auto',
                    rotate: 0,
                    // formatter: null,
                    textStyle: {                // 其余属性默认使用全局文本样式,详见TEXTSTYLE
                        color: '#304654'
                    }
                },
                emphasis: {
                    show: true,
                    textStyle: {                // 其余属性默认使用全局文本样式,详见TEXTSTYLE
                        color: '#c23531'
                    }
                }
            },
            itemStyle: {
                normal: {
                    color: '#304654',
                    borderWidth: 1
                },
                emphasis: {
                    color: '#c23531'
                }
            },
 
            checkpointStyle: {
                symbol: 'circle',
                symbolSize: 13,
                color: '#c23531',
                borderWidth: 5,
                borderColor: 'rgba(194,53,49, 0.5)',
                animation: true,
                animationDuration: 300,
                animationEasing: 'quinticInOut'
            },
 
            controlStyle: {
                show: true,
                showPlayBtn: true,
                showPrevBtn: true,
                showNextBtn: true,
                itemSize: 22,
                itemGap: 12,
                position: 'left',  // 'left' 'right' 'top' 'bottom'
                playIcon: 'path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z', // jshint ignore:line
                stopIcon: 'path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z', // jshint ignore:line
                nextIcon: 'path://M18.6,50.8l22.5-22.5c0.2-0.2,0.3-0.4,0.3-0.7c0-0.3-0.1-0.5-0.3-0.7L18.7,4.4c-0.1-0.1-0.2-0.3-0.2-0.5 c0-0.4,0.3-0.8,0.8-0.8c0.2,0,0.5,0.1,0.6,0.3l23.5,23.5l0,0c0.2,0.2,0.3,0.4,0.3,0.7c0,0.3-0.1,0.5-0.3,0.7l-0.1,0.1L19.7,52 c-0.1,0.1-0.3,0.2-0.5,0.2c-0.4,0-0.8-0.3-0.8-0.8C18.4,51.2,18.5,51,18.6,50.8z', // jshint ignore:line
                prevIcon: 'path://M43,52.8L20.4,30.3c-0.2-0.2-0.3-0.4-0.3-0.7c0-0.3,0.1-0.5,0.3-0.7L42.9,6.4c0.1-0.1,0.2-0.3,0.2-0.5 c0-0.4-0.3-0.8-0.8-0.8c-0.2,0-0.5,0.1-0.6,0.3L18.3,28.8l0,0c-0.2,0.2-0.3,0.4-0.3,0.7c0,0.3,0.1,0.5,0.3,0.7l0.1,0.1L41.9,54 c0.1,0.1,0.3,0.2,0.5,0.2c0.4,0,0.8-0.3,0.8-0.8C43.2,53.2,43.1,53,43,52.8z', // jshint ignore:line
                normal: {
                    color: '#304654',
                    borderColor: '#304654',
                    borderWidth: 1
                },
                emphasis: {
                    color: '#c23531',
                    borderColor: '#c23531',
                    borderWidth: 2
                }
            },
            data: []
        }
 
    });
 
    zrUtil.mixin(SliderTimelineModel, modelUtil.dataFormatMixin);
 
    module.exports = SliderTimelineModel;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/timeline/SliderTimelineView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/timeline/SliderTimelineView.js

Statements: 8.68% (25 / 288)      Branches: 0% (0 / 125)      Functions: 0% (0 / 42)      Lines: 8.68% (25 / 288)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714          1 1 1 1 1 1 1 1 1 1 1 1   1 1   1   1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 1               1               1                                                                                                                                                                                                                                                                                                                                               1                                                                                                                                                                                         1                                                                                                                     1                     1                             1                                                                                                                 1                                            
/**
 * @file Silder timeline view
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
    var graphic = require('../../util/graphic');
    var layout = require('../../util/layout');
    var TimelineView = require('./TimelineView');
    var TimelineAxis = require('./TimelineAxis');
    var symbolUtil = require('../../util/symbol');
    var axisHelper = require('../../coord/axisHelper');
    var BoundingRect = require('zrender/lib/core/BoundingRect');
    var matrix = require('zrender/lib/core/matrix');
    var numberUtil = require('../../util/number');
    var formatUtil = require('../../util/format');
    var encodeHTML = formatUtil.encodeHTML;
 
    var bind = zrUtil.bind;
    var each = zrUtil.each;
 
    var PI = Math.PI;
 
    module.exports = TimelineView.extend({
 
        type: 'timeline.slider',
 
        init: function (ecModel, api) {
 
            this.api = api;
 
            /**
             * @private
             * @type {module:echarts/component/timeline/TimelineAxis}
             */
            this._axis;
 
            /**
             * @private
             * @type {module:zrender/core/BoundingRect}
             */
            this._viewRect;
 
            /**
             * @type {number}
             */
            this._timer;
 
            /**
             * @type {module:zrende/Element}
             */
            this._currentPointer;
 
            /**
             * @type {module:zrender/container/Group}
             */
            this._mainGroup;
 
            /**
             * @type {module:zrender/container/Group}
             */
            this._labelGroup;
        },
 
        /**
         * @override
         */
        render: function (timelineModel, ecModel, api, payload) {
            this.model = timelineModel;
            this.api = api;
            this.ecModel = ecModel;
 
            this.group.removeAll();
 
            if (timelineModel.get('show', true)) {
 
                var layoutInfo = this._layout(timelineModel, api);
                var mainGroup = this._createGroup('mainGroup');
                var labelGroup = this._createGroup('labelGroup');
 
                /**
                 * @private
                 * @type {module:echarts/component/timeline/TimelineAxis}
                 */
                var axis = this._axis = this._createAxis(layoutInfo, timelineModel);
 
                timelineModel.formatTooltip = function (dataIndex) {
                    return encodeHTML(axis.scale.getLabel(dataIndex));
                };
 
                each(
                    ['AxisLine', 'AxisTick', 'Control', 'CurrentPointer'],
                    function (name) {
                        this['_render' + name](layoutInfo, mainGroup, axis, timelineModel);
                    },
                    this
                );
 
                this._renderAxisLabel(layoutInfo, labelGroup, axis, timelineModel);
                this._position(layoutInfo, timelineModel);
            }
 
            this._doPlayStop();
        },
 
        /**
         * @override
         */
        remove: function () {
            this._clearTimer();
            this.group.removeAll();
        },
 
        /**
         * @override
         */
        dispose: function () {
            this._clearTimer();
        },
 
        _layout: function (timelineModel, api) {
            var labelPosOpt = timelineModel.get('label.normal.position');
            var orient = timelineModel.get('orient');
            var viewRect = getViewRect(timelineModel, api);
            // Auto label offset.
            if (labelPosOpt == null || labelPosOpt === 'auto') {
                labelPosOpt = orient === 'horizontal'
                    ? ((viewRect.y + viewRect.height / 2) < api.getHeight() / 2 ? '-' : '+')
                    : ((viewRect.x + viewRect.width / 2) < api.getWidth() / 2 ? '+' : '-');
            }
            else if (isNaN(labelPosOpt)) {
                labelPosOpt = ({
                    horizontal: {top: '-', bottom: '+'},
                    vertical: {left: '-', right: '+'}
                })[orient][labelPosOpt];
            }
 
            // FIXME
            // 暂没有实现用户传入
            // var labelAlign = timelineModel.get('label.normal.textStyle.align');
            // var labelBaseline = timelineModel.get('label.normal.textStyle.baseline');
            var labelAlignMap = {
                horizontal: 'center',
                vertical: (labelPosOpt >= 0 || labelPosOpt === '+') ? 'left' : 'right'
            };
 
            var labelBaselineMap = {
                horizontal: (labelPosOpt >= 0 || labelPosOpt === '+') ? 'top' : 'bottom',
                vertical: 'middle'
            };
            var rotationMap = {
                horizontal: 0,
                vertical: PI / 2
            };
 
            // Position
            var mainLength = orient === 'vertical' ? viewRect.height : viewRect.width;
 
            var controlModel = timelineModel.getModel('controlStyle');
            var showControl = controlModel.get('show');
            var controlSize = showControl ? controlModel.get('itemSize') : 0;
            var controlGap = showControl ? controlModel.get('itemGap') : 0;
            var sizePlusGap = controlSize + controlGap;
 
            // Special label rotate.
            var labelRotation = timelineModel.get('label.normal.rotate') || 0;
            labelRotation = labelRotation * PI / 180; // To radian.
 
            var playPosition;
            var prevBtnPosition;
            var nextBtnPosition;
            var axisExtent;
            var controlPosition = controlModel.get('position', true);
            var showControl = controlModel.get('show', true);
            var showPlayBtn = showControl && controlModel.get('showPlayBtn', true);
            var showPrevBtn = showControl && controlModel.get('showPrevBtn', true);
            var showNextBtn = showControl && controlModel.get('showNextBtn', true);
            var xLeft = 0;
            var xRight = mainLength;
 
            // position[0] means left, position[1] means middle.
            if (controlPosition === 'left' || controlPosition === 'bottom') {
                showPlayBtn && (playPosition = [0, 0], xLeft += sizePlusGap);
                showPrevBtn && (prevBtnPosition = [xLeft, 0], xLeft += sizePlusGap);
                showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap);
            }
            else { // 'top' 'right'
                showPlayBtn && (playPosition = [xRight - controlSize, 0], xRight -= sizePlusGap);
                showPrevBtn && (prevBtnPosition = [0, 0], xLeft += sizePlusGap);
                showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap);
            }
            axisExtent = [xLeft, xRight];
 
            if (timelineModel.get('inverse')) {
                axisExtent.reverse();
            }
 
            return {
                viewRect: viewRect,
                mainLength: mainLength,
                orient: orient,
 
                rotation: rotationMap[orient],
                labelRotation: labelRotation,
                labelPosOpt: labelPosOpt,
                labelAlign: labelAlignMap[orient],
                labelBaseline: labelBaselineMap[orient],
 
                // Based on mainGroup.
                playPosition: playPosition,
                prevBtnPosition: prevBtnPosition,
                nextBtnPosition: nextBtnPosition,
                axisExtent: axisExtent,
 
                controlSize: controlSize,
                controlGap: controlGap
            };
        },
 
        _position: function (layoutInfo, timelineModel) {
            // Position is be called finally, because bounding rect is needed for
            // adapt content to fill viewRect (auto adapt offset).
 
            // Timeline may be not all in the viewRect when 'offset' is specified
            // as a number, because it is more appropriate that label aligns at
            // 'offset' but not the other edge defined by viewRect.
 
            var mainGroup = this._mainGroup;
            var labelGroup = this._labelGroup;
 
            var viewRect = layoutInfo.viewRect;
            if (layoutInfo.orient === 'vertical') {
                // transfrom to horizontal, inverse rotate by left-top point.
                var m = matrix.create();
                var rotateOriginX = viewRect.x;
                var rotateOriginY = viewRect.y + viewRect.height;
                matrix.translate(m, m, [-rotateOriginX, -rotateOriginY]);
                matrix.rotate(m, m, -PI / 2);
                matrix.translate(m, m, [rotateOriginX, rotateOriginY]);
                viewRect = viewRect.clone();
                viewRect.applyTransform(m);
            }
 
            var viewBound = getBound(viewRect);
            var mainBound = getBound(mainGroup.getBoundingRect());
            var labelBound = getBound(labelGroup.getBoundingRect());
 
            var mainPosition = mainGroup.position;
            var labelsPosition = labelGroup.position;
 
            labelsPosition[0] = mainPosition[0] = viewBound[0][0];
 
            var labelPosOpt = layoutInfo.labelPosOpt;
 
            if (isNaN(labelPosOpt)) { // '+' or '-'
                var mainBoundIdx = labelPosOpt === '+' ? 0 : 1;
                toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx);
                toBound(labelsPosition, labelBound, viewBound, 1, 1 - mainBoundIdx);
            }
            else {
                var mainBoundIdx = labelPosOpt >= 0 ? 0 : 1;
                toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx);
                labelsPosition[1] = mainPosition[1] + labelPosOpt;
            }
 
            mainGroup.attr('position', mainPosition);
            labelGroup.attr('position', labelsPosition);
            mainGroup.rotation = labelGroup.rotation = layoutInfo.rotation;
 
            setOrigin(mainGroup);
            setOrigin(labelGroup);
 
            function setOrigin(targetGroup) {
                var pos = targetGroup.position;
                targetGroup.origin = [
                    viewBound[0][0] - pos[0],
                    viewBound[1][0] - pos[1]
                ];
            }
 
            function getBound(rect) {
                // [[xmin, xmax], [ymin, ymax]]
                return [
                    [rect.x, rect.x + rect.width],
                    [rect.y, rect.y + rect.height]
                ];
            }
 
            function toBound(fromPos, from, to, dimIdx, boundIdx) {
                fromPos[dimIdx] += to[dimIdx][boundIdx] - from[dimIdx][boundIdx];
            }
        },
 
        _createAxis: function (layoutInfo, timelineModel) {
            var data = timelineModel.getData();
            var axisType = timelineModel.get('axisType');
 
            var scale = axisHelper.createScaleByModel(timelineModel, axisType);
            var dataExtent = data.getDataExtent('value');
            scale.setExtent(dataExtent[0], dataExtent[1]);
            this._customizeScale(scale, data);
            scale.niceTicks();
 
            var axis = new TimelineAxis('value', scale, layoutInfo.axisExtent, axisType);
            axis.model = timelineModel;
 
            return axis;
        },
 
        _customizeScale: function (scale, data) {
 
            scale.getTicks = function () {
                return data.mapArray(['value'], function (value) {
                    return value;
                });
            };
 
            scale.getTicksLabels = function () {
                return zrUtil.map(this.getTicks(), scale.getLabel, scale);
            };
        },
 
        _createGroup: function (name) {
            var newGroup = this['_' + name] = new graphic.Group();
            this.group.add(newGroup);
            return newGroup;
        },
 
        _renderAxisLine: function (layoutInfo, group, axis, timelineModel) {
            var axisExtent = axis.getExtent();
 
            if (!timelineModel.get('lineStyle.show')) {
                return;
            }
 
            group.add(new graphic.Line({
                shape: {
                    x1: axisExtent[0], y1: 0,
                    x2: axisExtent[1], y2: 0
                },
                style: zrUtil.extend(
                    {lineCap: 'round'},
                    timelineModel.getModel('lineStyle').getLineStyle()
                ),
                silent: true,
                z2: 1
            }));
        },
 
        /**
         * @private
         */
        _renderAxisTick: function (layoutInfo, group, axis, timelineModel) {
            var data = timelineModel.getData();
            var ticks = axis.scale.getTicks();
 
            each(ticks, function (value, dataIndex) {
 
                var tickCoord = axis.dataToCoord(value);
                var itemModel = data.getItemModel(dataIndex);
                var itemStyleModel = itemModel.getModel('itemStyle.normal');
                var hoverStyleModel = itemModel.getModel('itemStyle.emphasis');
                var symbolOpt = {
                    position: [tickCoord, 0],
                    onclick: bind(this._changeTimeline, this, dataIndex)
                };
                var el = giveSymbol(itemModel, itemStyleModel, group, symbolOpt);
                graphic.setHoverStyle(el, hoverStyleModel.getItemStyle());
 
                if (itemModel.get('tooltip')) {
                    el.dataIndex = dataIndex;
                    el.dataModel = timelineModel;
                }
                else {
                    el.dataIndex = el.dataModel = null;
                }
 
            }, this);
        },
 
        /**
         * @private
         */
        _renderAxisLabel: function (layoutInfo, group, axis, timelineModel) {
            var labelModel = timelineModel.getModel('label.normal');
 
            if (!labelModel.get('show')) {
                return;
            }
 
            var data = timelineModel.getData();
            var ticks = axis.scale.getTicks();
            var labels = axisHelper.getFormattedLabels(
                axis, labelModel.get('formatter')
            );
            var labelInterval = axis.getLabelInterval();
 
            each(ticks, function (tick, dataIndex) {
                if (axis.isLabelIgnored(dataIndex, labelInterval)) {
                    return;
                }
 
                var itemModel = data.getItemModel(dataIndex);
                var itemTextStyleModel = itemModel.getModel('label.normal.textStyle');
                var hoverTextStyleModel = itemModel.getModel('label.emphasis.textStyle');
                var tickCoord = axis.dataToCoord(tick);
                var textEl = new graphic.Text({
                    style: {
                        text: labels[dataIndex],
                        textAlign: layoutInfo.labelAlign,
                        textVerticalAlign: layoutInfo.labelBaseline,
                        textFont: itemTextStyleModel.getFont(),
                        fill: itemTextStyleModel.getTextColor()
                    },
                    position: [tickCoord, 0],
                    rotation: layoutInfo.labelRotation - layoutInfo.rotation,
                    onclick: bind(this._changeTimeline, this, dataIndex),
                    silent: false
                });
 
                group.add(textEl);
                graphic.setHoverStyle(textEl, hoverTextStyleModel.getItemStyle());
 
            }, this);
        },
 
        /**
         * @private
         */
        _renderControl: function (layoutInfo, group, axis, timelineModel) {
            var controlSize = layoutInfo.controlSize;
            var rotation = layoutInfo.rotation;
 
            var itemStyle = timelineModel.getModel('controlStyle.normal').getItemStyle();
            var hoverStyle = timelineModel.getModel('controlStyle.emphasis').getItemStyle();
            var rect = [0, -controlSize / 2, controlSize, controlSize];
            var playState = timelineModel.getPlayState();
            var inverse = timelineModel.get('inverse', true);
 
            makeBtn(
                layoutInfo.nextBtnPosition,
                'controlStyle.nextIcon',
                bind(this._changeTimeline, this, inverse ? '-' : '+')
            );
            makeBtn(
                layoutInfo.prevBtnPosition,
                'controlStyle.prevIcon',
                bind(this._changeTimeline, this, inverse ? '+' : '-')
            );
            makeBtn(
                layoutInfo.playPosition,
                'controlStyle.' + (playState ? 'stopIcon' : 'playIcon'),
                bind(this._handlePlayClick, this, !playState),
                true
            );
 
            function makeBtn(position, iconPath, onclick, willRotate) {
                if (!position) {
                    return;
                }
                var opt = {
                    position: position,
                    origin: [controlSize / 2, 0],
                    rotation: willRotate ? -rotation : 0,
                    rectHover: true,
                    style: itemStyle,
                    onclick: onclick
                };
                var btn = makeIcon(timelineModel, iconPath, rect, opt);
                group.add(btn);
                graphic.setHoverStyle(btn, hoverStyle);
            }
        },
 
        _renderCurrentPointer: function (layoutInfo, group, axis, timelineModel) {
            var data = timelineModel.getData();
            var currentIndex = timelineModel.getCurrentIndex();
            var pointerModel = data.getItemModel(currentIndex).getModel('checkpointStyle');
            var me = this;
 
            var callback = {
                onCreate: function (pointer) {
                    pointer.draggable = true;
                    pointer.drift = bind(me._handlePointerDrag, me);
                    pointer.ondragend = bind(me._handlePointerDragend, me);
                    pointerMoveTo(pointer, currentIndex, axis, timelineModel, true);
                },
                onUpdate: function (pointer) {
                    pointerMoveTo(pointer, currentIndex, axis, timelineModel);
                }
            };
 
            // Reuse when exists, for animation and drag.
            this._currentPointer = giveSymbol(
                pointerModel, pointerModel, this._mainGroup, {}, this._currentPointer, callback
            );
        },
 
        _handlePlayClick: function (nextState) {
            this._clearTimer();
            this.api.dispatchAction({
                type: 'timelinePlayChange',
                playState: nextState,
                from: this.uid
            });
        },
 
        _handlePointerDrag: function (dx, dy, e) {
            this._clearTimer();
            this._pointerChangeTimeline([e.offsetX, e.offsetY]);
        },
 
        _handlePointerDragend: function (e) {
            this._pointerChangeTimeline([e.offsetX, e.offsetY], true);
        },
 
        _pointerChangeTimeline: function (mousePos, trigger) {
            var toCoord = this._toAxisCoord(mousePos)[0];
 
            var axis = this._axis;
            var axisExtent = numberUtil.asc(axis.getExtent().slice());
 
            toCoord > axisExtent[1] && (toCoord = axisExtent[1]);
            toCoord < axisExtent[0] && (toCoord = axisExtent[0]);
 
            this._currentPointer.position[0] = toCoord;
            this._currentPointer.dirty();
 
            var targetDataIndex = this._findNearestTick(toCoord);
            var timelineModel = this.model;
 
            if (trigger || (
                targetDataIndex !== timelineModel.getCurrentIndex()
                && timelineModel.get('realtime')
            )) {
                this._changeTimeline(targetDataIndex);
            }
        },
 
        _doPlayStop: function () {
            this._clearTimer();
 
            if (this.model.getPlayState()) {
                this._timer = setTimeout(
                    bind(handleFrame, this),
                    this.model.get('playInterval')
                );
            }
 
            function handleFrame() {
                // Do not cache
                var timelineModel = this.model;
                this._changeTimeline(
                    timelineModel.getCurrentIndex()
                    + (timelineModel.get('rewind', true) ? -1 : 1)
                );
            }
        },
 
        _toAxisCoord: function (vertex) {
            var trans = this._mainGroup.getLocalTransform();
            return graphic.applyTransform(vertex, trans, true);
        },
 
        _findNearestTick: function (axisCoord) {
            var data = this.model.getData();
            var dist = Infinity;
            var targetDataIndex;
            var axis = this._axis;
 
            data.each(['value'], function (value, dataIndex) {
                var coord = axis.dataToCoord(value);
                var d = Math.abs(coord - axisCoord);
                if (d < dist) {
                    dist = d;
                    targetDataIndex = dataIndex;
                }
            });
 
            return targetDataIndex;
        },
 
        _clearTimer: function () {
            if (this._timer) {
                clearTimeout(this._timer);
                this._timer = null;
            }
        },
 
        _changeTimeline: function (nextIndex) {
            var currentIndex = this.model.getCurrentIndex();
 
            if (nextIndex === '+') {
                nextIndex = currentIndex + 1;
            }
            else if (nextIndex === '-') {
                nextIndex = currentIndex - 1;
            }
 
            this.api.dispatchAction({
                type: 'timelineChange',
                currentIndex: nextIndex,
                from: this.uid
            });
        }
 
    });
 
    function getViewRect(model, api) {
        return layout.getLayoutRect(
            model.getBoxLayoutParams(),
            {
                width: api.getWidth(),
                height: api.getHeight()
            },
            model.get('padding')
        );
    }
 
    function makeIcon(timelineModel, objPath, rect, opts) {
        var icon = graphic.makePath(
            timelineModel.get(objPath).replace(/^path:\/\//, ''),
            zrUtil.clone(opts || {}),
            new BoundingRect(rect[0], rect[1], rect[2], rect[3]),
            'center'
        );
 
        return icon;
    }
 
    /**
     * Create symbol or update symbol
     * opt: basic position and event handlers
     */
    function giveSymbol(hostModel, itemStyleModel, group, opt, symbol, callback) {
        var color = itemStyleModel.get('color');
 
        if (!symbol) {
            var symbolType = hostModel.get('symbol');
            symbol = symbolUtil.createSymbol(symbolType, -1, -1, 2, 2, color);
            symbol.setStyle('strokeNoScale', true);
            group.add(symbol);
            callback && callback.onCreate(symbol);
        }
        else {
            symbol.setColor(color);
            group.add(symbol); // Group may be new, also need to add.
            callback && callback.onUpdate(symbol);
        }
 
        // Style
        var itemStyle = itemStyleModel.getItemStyle(['color', 'symbol', 'symbolSize']);
        symbol.setStyle(itemStyle);
 
        // Transform and events.
        opt = zrUtil.merge({
            rectHover: true,
            z2: 100
        }, opt, true);
 
        var symbolSize = hostModel.get('symbolSize');
        symbolSize = symbolSize instanceof Array
            ? symbolSize.slice()
            : [+symbolSize, +symbolSize];
        symbolSize[0] /= 2;
        symbolSize[1] /= 2;
        opt.scale = symbolSize;
 
        var symbolOffset = hostModel.get('symbolOffset');
        if (symbolOffset) {
            var pos = opt.position = opt.position || [0, 0];
            pos[0] += numberUtil.parsePercent(symbolOffset[0], symbolSize[0]);
            pos[1] += numberUtil.parsePercent(symbolOffset[1], symbolSize[1]);
        }
 
        var symbolRotate = hostModel.get('symbolRotate');
        opt.rotation = (symbolRotate || 0) * Math.PI / 180 || 0;
 
        symbol.attr(opt);
 
        // FIXME
        // (1) When symbol.style.strokeNoScale is true and updateTransform is not performed,
        // getBoundingRect will return wrong result.
        // (This is supposed to be resolved in zrender, but it is a little difficult to
        // leverage performance and auto updateTransform)
        // (2) All of ancesters of symbol do not scale, so we can just updateTransform symbol.
        symbol.updateTransform();
 
        return symbol;
    }
 
    function pointerMoveTo(pointer, dataIndex, axis, timelineModel, noAnimation) {
        if (pointer.dragging) {
            return;
        }
 
        var pointerModel = timelineModel.getModel('checkpointStyle');
        var toCoord = axis.dataToCoord(timelineModel.getData().get(['value'], dataIndex));
 
        if (noAnimation || !pointerModel.get('animation', true)) {
            pointer.attr({position: [toCoord, 0]});
        }
        else {
            pointer.stopAnimation(true);
            pointer.animateTo(
                {position: [toCoord, 0]},
                pointerModel.get('animationDuration', true),
                pointerModel.get('animationEasing', true)
            );
        }
    }
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/timeline/TimelineAxis.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/timeline/TimelineAxis.js

Statements: 30.43% (7 / 23)      Branches: 0% (0 / 13)      Functions: 0% (0 / 3)      Lines: 30.43% (7 / 23)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97    1 1 1                       1                                                     1                                                                                                 1   1    
 
 
    var zrUtil = require('zrender/lib/core/util');
    var Axis = require('../../coord/Axis');
    var axisHelper = require('../../coord/axisHelper');
 
    /**
     * Extend axis 2d
     * @constructor module:echarts/coord/cartesian/Axis2D
     * @extends {module:echarts/coord/cartesian/Axis}
     * @param {string} dim
     * @param {*} scale
     * @param {Array.<number>} coordExtent
     * @param {string} axisType
     * @param {string} position
     */
    var TimelineAxis = function (dim, scale, coordExtent, axisType) {
 
        Axis.call(this, dim, scale, coordExtent);
 
        /**
         * Axis type
         *  - 'category'
         *  - 'value'
         *  - 'time'
         *  - 'log'
         * @type {string}
         */
        this.type = axisType || 'value';
 
        /**
         * @private
         * @type {number}
         */
        this._autoLabelInterval;
 
        /**
         * Axis model
         * @param {module:echarts/component/TimelineModel}
         */
        this.model = null;
    };
 
    TimelineAxis.prototype = {
 
        constructor: TimelineAxis,
 
        /**
         * @public
         * @return {number}
         */
        getLabelInterval: function () {
            var timelineModel = this.model;
            var labelModel = timelineModel.getModel('label.normal');
            var labelInterval = labelModel.get('interval');
 
            if (labelInterval != null && labelInterval != 'auto') {
                return labelInterval;
            }
 
            var labelInterval = this._autoLabelInterval;
 
            if (!labelInterval) {
                labelInterval = this._autoLabelInterval = axisHelper.getAxisLabelInterval(
                    zrUtil.map(this.scale.getTicks(), this.dataToCoord, this),
                    axisHelper.getFormattedLabels(this, labelModel.get('formatter')),
                    labelModel.getModel('textStyle').getFont(),
                    timelineModel.get('orient') === 'horizontal'
                );
            }
 
            return labelInterval;
        },
 
        /**
         * If label is ignored.
         * Automatically used when axis is category and label can not be all shown
         * @public
         * @param  {number} idx
         * @return {boolean}
         */
        isLabelIgnored: function (idx) {
            if (this.type === 'category') {
                var labelInterval = this.getLabelInterval();
                return ((typeof labelInterval === 'function')
                    && !labelInterval(idx, this.scale.getLabel(idx)))
                    || idx % (labelInterval + 1);
            }
        }
 
    };
 
    zrUtil.inherits(TimelineAxis, Axis);
 
    module.exports = TimelineAxis;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/timeline/TimelineModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/timeline/TimelineModel.js

Statements: 12.5% (6 / 48)      Branches: 0% (0 / 23)      Functions: 0% (0 / 11)      Lines: 12.5% (6 / 48)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198          1 1 1 1   1                                                                                                                                                                                                                                                                                                                                                                                 1    
/**
 * @file Timeline model
 */
 
 
    var ComponentModel = require('../../model/Component');
    var List = require('../../data/List');
    var zrUtil = require('zrender/lib/core/util');
    var modelUtil = require('../../util/model');
 
    var TimelineModel = ComponentModel.extend({
 
        type: 'timeline',
 
        layoutMode: 'box',
 
        /**
         * @protected
         */
        defaultOption: {
 
            zlevel: 0,                  // 一级层叠
            z: 4,                       // 二级层叠
            show: true,
 
            axisType: 'time',  // 模式是时间类型,支持 value, category
 
            realtime: true,
 
            left: '20%',
            top: null,
            right: '20%',
            bottom: 0,
            width: null,
            height: 40,
            padding: 5,
 
            controlPosition: 'left',           // 'left' 'right' 'top' 'bottom' 'none'
            autoPlay: false,
            rewind: false,                     // 反向播放
            loop: true,
            playInterval: 2000,                // 播放时间间隔,单位ms
 
            currentIndex: 0,
 
            itemStyle: {
                normal: {},
                emphasis: {}
            },
            label: {
                normal: {
                    textStyle: {
                        color: '#000'
                    }
                },
                emphasis: {}
            },
 
            data: []
        },
 
        /**
         * @override
         */
        init: function (option, parentModel, ecModel) {
 
            /**
             * @private
             * @type {module:echarts/data/List}
             */
            this._data;
 
            /**
             * @private
             * @type {Array.<string>}
             */
            this._names;
 
            this.mergeDefaultAndTheme(option, ecModel);
            this._initData();
        },
 
        /**
         * @override
         */
        mergeOption: function (option) {
            TimelineModel.superApply(this, 'mergeOption', arguments);
            this._initData();
        },
 
        /**
         * @param {number} [currentIndex]
         */
        setCurrentIndex: function (currentIndex) {
            if (currentIndex == null) {
                currentIndex = this.option.currentIndex;
            }
            var count = this._data.count();
 
            if (this.option.loop) {
                currentIndex = (currentIndex % count + count) % count;
            }
            else {
                currentIndex >= count && (currentIndex = count - 1);
                currentIndex < 0 && (currentIndex = 0);
            }
 
            this.option.currentIndex = currentIndex;
        },
 
        /**
         * @return {number} currentIndex
         */
        getCurrentIndex: function () {
            return this.option.currentIndex;
        },
 
        /**
         * @return {boolean}
         */
        isIndexMax: function () {
            return this.getCurrentIndex() >= this._data.count() - 1;
        },
 
        /**
         * @param {boolean} state true: play, false: stop
         */
        setPlayState: function (state) {
            this.option.autoPlay = !!state;
        },
 
        /**
         * @return {boolean} true: play, false: stop
         */
        getPlayState: function () {
            return !!this.option.autoPlay;
        },
 
        /**
         * @private
         */
        _initData: function () {
            var thisOption = this.option;
            var dataArr = thisOption.data || [];
            var axisType = thisOption.axisType;
            var names = this._names = [];
 
            if (axisType === 'category') {
                var idxArr = [];
                zrUtil.each(dataArr, function (item, index) {
                    var value = modelUtil.getDataItemValue(item);
                    var newItem;
 
                    if (zrUtil.isObject(item)) {
                        newItem = zrUtil.clone(item);
                        newItem.value = index;
                    }
                    else {
                        newItem = index;
                    }
 
                    idxArr.push(newItem);
 
                    if (!zrUtil.isString(value) && (value == null || isNaN(value))) {
                        value = '';
                    }
 
                    names.push(value + '');
                });
                dataArr = idxArr;
            }
 
            var dimType = ({category: 'ordinal', time: 'time'})[axisType] || 'number';
 
            var data = this._data = new List([{name: 'value', type: dimType}], this);
 
            data.initData(dataArr, names);
        },
 
        getData: function () {
            return this._data;
        },
 
        /**
         * @public
         * @return {Array.<string>} categoreis
         */
        getCategories: function () {
            if (this.get('axisType') === 'category') {
                return this._names.slice();
            }
        }
 
    });
 
    module.exports = TimelineModel;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/timeline/TimelineView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/timeline/TimelineView.js

Statements: 100% (2 / 2)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (2 / 2)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16              1   1            
/**
 * @file Timeline view
 */
 
 
    // var zrUtil = require('zrender/lib/core/util');
    // var graphic = require('../../util/graphic');
    var ComponentView = require('../../view/Component');
 
    module.exports = ComponentView.extend({
 
        type: 'timeline'
    });
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/timeline/preprocessor.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/timeline/preprocessor.js

Statements: 11.63% (5 / 43)      Branches: 0% (0 / 47)      Functions: 0% (0 / 7)      Lines: 11.63% (5 / 43)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87          1   1                               1                                                                       1                                           1          
/**
 * @file Timeline preprocessor
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    module.exports = function (option) {
        var timelineOpt = option && option.timeline;
 
        if (!zrUtil.isArray(timelineOpt)) {
            timelineOpt = timelineOpt ? [timelineOpt] : [];
        }
 
        zrUtil.each(timelineOpt, function (opt) {
            if (!opt) {
                return;
            }
 
            compatibleEC2(opt);
        });
    };
 
    function compatibleEC2(opt) {
        var type = opt.type;
 
        var ec2Types = {'number': 'value', 'time': 'time'};
 
        // Compatible with ec2
        if (ec2Types[type]) {
            opt.axisType = ec2Types[type];
            delete opt.type;
        }
 
        transferItem(opt);
 
        if (has(opt, 'controlPosition')) {
            var controlStyle = opt.controlStyle || (opt.controlStyle = {});
            if (!has(controlStyle, 'position')) {
                controlStyle.position = opt.controlPosition;
            }
            if (controlStyle.position === 'none' && !has(controlStyle, 'show')) {
                controlStyle.show = false;
                delete controlStyle.position;
            }
            delete opt.controlPosition;
        }
 
        zrUtil.each(opt.data || [], function (dataItem) {
            if (zrUtil.isObject(dataItem) && !zrUtil.isArray(dataItem)) {
                if (!has(dataItem, 'value') && has(dataItem, 'name')) {
                    // In ec2, using name as value.
                    dataItem.value = dataItem.name;
                }
                transferItem(dataItem);
            }
        });
    }
 
    function transferItem(opt) {
        var itemStyle = opt.itemStyle || (opt.itemStyle = {});
 
        var itemStyleEmphasis = itemStyle.emphasis || (itemStyle.emphasis = {});
 
        // Transfer label out
        var label = opt.label || (opt.label || {});
        var labelNormal = label.normal || (label.normal = {});
        var excludeLabelAttr = {normal: 1, emphasis: 1};
 
        zrUtil.each(label, function (value, name) {
            if (!excludeLabelAttr[name] && !has(labelNormal, name)) {
                labelNormal[name] = value;
            }
        });
 
        if (itemStyleEmphasis.label && !has(label, 'emphasis')) {
            label.emphasis = itemStyleEmphasis.label;
            delete itemStyleEmphasis.label;
        }
    }
 
    function has(obj, attr) {
        return obj.hasOwnProperty(attr);
    }
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/timeline/timelineAction.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/timeline/timelineAction.js

Statements: 28.57% (4 / 14)      Branches: 0% (0 / 12)      Functions: 0% (0 / 2)      Lines: 28.57% (4 / 14)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46          1 1   1                                               1                          
/**
 * @file Timeilne action
 */
 
 
    var echarts = require('../../echarts');
    var zrUtil = require('zrender/lib/core/util');
 
    echarts.registerAction(
 
        {type: 'timelineChange', event: 'timelineChanged', update: 'prepareAndUpdate'},
 
        function (payload, ecModel) {
 
            var timelineModel = ecModel.getComponent('timeline');
            if (timelineModel && payload.currentIndex != null) {
                timelineModel.setCurrentIndex(payload.currentIndex);
 
                if (!timelineModel.get('loop', true) && timelineModel.isIndexMax()) {
                    timelineModel.setPlayState(false);
                }
            }
 
            // Set normalized currentIndex to payload.
            ecModel.resetOption('timeline');
 
            return zrUtil.defaults({
                currentIndex: timelineModel.option.currentIndex
            }, payload);
        }
    );
 
    echarts.registerAction(
 
        {type: 'timelinePlayChange', event: 'timelinePlayChanged', update: 'update'},
 
        function (payload, ecModel) {
            var timelineModel = ecModel.getComponent('timeline');
            if (timelineModel && payload.playState != null) {
                timelineModel.setPlayState(payload.playState);
            }
        }
    );
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/timeline/typeDefaulter.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/timeline/typeDefaulter.js

Statements: 50% (1 / 2)      Branches: 100% (0 / 0)      Functions: 0% (0 / 1)      Lines: 50% (1 / 2)      Ignored: none     

1 2 3 4 5 6 7 8 9    1            
 
 
    require('../../model/Component').registerSubTypeDefaulter('timeline', function () {
        // Only slider now.
        return 'slider';
    });
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/

Statements: 14.29% (18 / 126)      Branches: 0% (0 / 77)      Functions: 4.55% (1 / 22)      Lines: 14.29% (18 / 126)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/
File Statements Branches Functions Lines
ToolboxModel.js 50% (4 / 8) 0% (0 / 2) 0% (0 / 2) 50% (4 / 8)
ToolboxView.js 9.65% (11 / 114) 0% (0 / 75) 0% (0 / 18) 9.65% (11 / 114)
featureManager.js 75% (3 / 4) 100% (0 / 0) 50% (1 / 2) 75% (3 / 4)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/ToolboxModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/ToolboxModel.js

Statements: 50% (4 / 8)      Branches: 0% (0 / 2)      Functions: 0% (0 / 2)      Lines: 50% (4 / 8)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72    1 1   1                                                                                                                               1    
 
 
    var featureManager = require('./featureManager');
    var zrUtil = require('zrender/lib/core/util');
 
    var ToolboxModel = require('../../echarts').extendComponentModel({
 
        type: 'toolbox',
 
        layoutMode: {
            type: 'box',
            ignoreSize: true
        },
 
        mergeDefaultAndTheme: function (option) {
            ToolboxModel.superApply(this, 'mergeDefaultAndTheme', arguments);
 
            zrUtil.each(this.option.feature, function (featureOpt, featureName) {
                var Feature = featureManager.get(featureName);
                Feature && zrUtil.merge(featureOpt, Feature.defaultOption);
            });
        },
 
        defaultOption: {
 
            show: true,
 
            z: 6,
 
            zlevel: 0,
 
            orient: 'horizontal',
 
            left: 'right',
 
            top: 'top',
 
            // right
            // bottom
 
            backgroundColor: 'transparent',
 
            borderColor: '#ccc',
 
            borderWidth: 0,
 
            padding: 5,
 
            itemSize: 15,
 
            itemGap: 8,
 
            showTitle: true,
 
            iconStyle: {
                normal: {
                    borderColor: '#666',
                    color: 'none'
                },
                emphasis: {
                    borderColor: '#3E98C5'
                }
            }
            // textStyle: {},
 
            // feature
        }
    });
 
    module.exports = ToolboxModel;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/ToolboxView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/ToolboxView.js

Statements: 9.65% (11 / 114)      Branches: 0% (0 / 75)      Functions: 0% (0 / 18)      Lines: 9.65% (11 / 114)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250    1 1 1 1 1 1 1   1                                                           1                                                                                                                         1                                                                                                                                                                                                                                                                                             1          
 
 
    var featureManager = require('./featureManager');
    var zrUtil = require('zrender/lib/core/util');
    var graphic = require('../../util/graphic');
    var Model = require('../../model/Model');
    var DataDiffer = require('../../data/DataDiffer');
    var listComponentHelper = require('../helper/listComponent');
    var textContain = require('zrender/lib/contain/text');
 
    module.exports = require('../../echarts').extendComponentView({
 
        type: 'toolbox',
 
        render: function (toolboxModel, ecModel, api, payload) {
            var group = this.group;
            group.removeAll();
 
            if (!toolboxModel.get('show')) {
                return;
            }
 
            var itemSize = +toolboxModel.get('itemSize');
            var featureOpts = toolboxModel.get('feature') || {};
            var features = this._features || (this._features = {});
 
            var featureNames = [];
            zrUtil.each(featureOpts, function (opt, name) {
                featureNames.push(name);
            });
 
            (new DataDiffer(this._featureNames || [], featureNames))
                .add(process)
                .update(process)
                .remove(zrUtil.curry(process, null))
                .execute();
 
            // Keep for diff.
            this._featureNames = featureNames;
 
            function process(newIndex, oldIndex) {
                var featureName = featureNames[newIndex];
                var oldName = featureNames[oldIndex];
                var featureOpt = featureOpts[featureName];
                var featureModel = new Model(featureOpt, toolboxModel, toolboxModel.ecModel);
                var feature;
 
                if (featureName && !oldName) { // Create
                    if (isUserFeatureName(featureName)) {
                        feature = {
                            model: featureModel,
                            onclick: featureModel.option.onclick,
                            featureName: featureName
                        };
                    }
                    else {
                        var Feature = featureManager.get(featureName);
                        if (!Feature) {
                            return;
                        }
                        feature = new Feature(featureModel, ecModel, api);
                    }
                    features[featureName] = feature;
                }
                else {
                    feature = features[oldName];
                    // If feature does not exsit.
                    if (!feature) {
                        return;
                    }
                    feature.model = featureModel;
                    feature.ecModel = ecModel;
                    feature.api = api;
                }
 
                if (!featureName && oldName) {
                    feature.dispose && feature.dispose(ecModel, api);
                    return;
                }
 
                if (!featureModel.get('show') || feature.unusable) {
                    feature.remove && feature.remove(ecModel, api);
                    return;
                }
 
                createIconPaths(featureModel, feature, featureName);
 
                featureModel.setIconStatus = function (iconName, status) {
                    var option = this.option;
                    var iconPaths = this.iconPaths;
                    option.iconStatus = option.iconStatus || {};
                    option.iconStatus[iconName] = status;
                    // FIXME
                    iconPaths[iconName] && iconPaths[iconName].trigger(status);
                };
 
                if (feature.render) {
                    feature.render(featureModel, ecModel, api, payload);
                }
            }
 
            function createIconPaths(featureModel, feature, featureName) {
                var iconStyleModel = featureModel.getModel('iconStyle');
 
                // If one feature has mutiple icon. they are orginaized as
                // {
                //     icon: {
                //         foo: '',
                //         bar: ''
                //     },
                //     title: {
                //         foo: '',
                //         bar: ''
                //     }
                // }
                var icons = feature.getIcons ? feature.getIcons() : featureModel.get('icon');
                var titles = featureModel.get('title') || {};
                if (typeof icons === 'string') {
                    var icon = icons;
                    var title = titles;
                    icons = {};
                    titles = {};
                    icons[featureName] = icon;
                    titles[featureName] = title;
                }
                var iconPaths = featureModel.iconPaths = {};
                zrUtil.each(icons, function (icon, iconName) {
                    var normalStyle = iconStyleModel.getModel('normal').getItemStyle();
                    var hoverStyle = iconStyleModel.getModel('emphasis').getItemStyle();
 
                    var style = {
                        x: -itemSize / 2,
                        y: -itemSize / 2,
                        width: itemSize,
                        height: itemSize
                    };
                    var path = icon.indexOf('image://') === 0
                        ? (
                            style.image = icon.slice(8),
                            new graphic.Image({style: style})
                        )
                        : graphic.makePath(
                            icon.replace('path://', ''),
                            {
                                style: normalStyle,
                                hoverStyle: hoverStyle,
                                rectHover: true
                            },
                            style,
                            'center'
                        );
 
                    graphic.setHoverStyle(path);
 
                    if (toolboxModel.get('showTitle')) {
                        path.__title = titles[iconName];
                        path.on('mouseover', function () {
                                // Should not reuse above hoverStyle, which might be modified.
                                var hoverStyle = iconStyleModel.getModel('emphasis').getItemStyle();
                                path.setStyle({
                                    text: titles[iconName],
                                    textPosition: hoverStyle.textPosition || 'bottom',
                                    textFill: hoverStyle.fill || hoverStyle.stroke || '#000',
                                    textAlign: hoverStyle.textAlign || 'center'
                                });
                            })
                            .on('mouseout', function () {
                                path.setStyle({
                                    textFill: null
                                });
                            });
                    }
                    path.trigger(featureModel.get('iconStatus.' + iconName) || 'normal');
 
                    group.add(path);
                    path.on('click', zrUtil.bind(
                        feature.onclick, feature, ecModel, api, iconName
                    ));
 
                    iconPaths[iconName] = path;
                });
            }
 
            listComponentHelper.layout(group, toolboxModel, api);
            // Render background after group is layout
            // FIXME
            listComponentHelper.addBackground(group, toolboxModel);
 
            // Adjust icon title positions to avoid them out of screen
            group.eachChild(function (icon) {
                var titleText = icon.__title;
                var hoverStyle = icon.hoverStyle;
                // May be background element
                if (hoverStyle && titleText) {
                    var rect = textContain.getBoundingRect(
                        titleText, hoverStyle.font
                    );
                    var offsetX = icon.position[0] + group.position[0];
                    var offsetY = icon.position[1] + group.position[1] + itemSize;
 
                    var needPutOnTop = false;
                    if (offsetY + rect.height > api.getHeight()) {
                        hoverStyle.textPosition = 'top';
                        needPutOnTop = true;
                    }
                    var topOffset = needPutOnTop ? (-5 - rect.height) : (itemSize + 8);
                    if (offsetX + rect.width /  2 > api.getWidth()) {
                        hoverStyle.textPosition = ['100%', topOffset];
                        hoverStyle.textAlign = 'right';
                    }
                    else if (offsetX - rect.width / 2 < 0) {
                        hoverStyle.textPosition = [0, topOffset];
                        hoverStyle.textAlign = 'left';
                    }
                }
            });
        },
 
        updateView: function (toolboxModel, ecModel, api, payload) {
            zrUtil.each(this._features, function (feature) {
                feature.updateView && feature.updateView(feature.model, ecModel, api, payload);
            });
        },
 
        updateLayout: function (toolboxModel, ecModel, api, payload) {
            zrUtil.each(this._features, function (feature) {
                feature.updateLayout && feature.updateLayout(feature.model, ecModel, api, payload);
            });
        },
 
        remove: function (ecModel, api) {
            zrUtil.each(this._features, function (feature) {
                feature.remove && feature.remove(ecModel, api);
            });
            this.group.removeAll();
        },
 
        dispose: function (ecModel, api) {
            zrUtil.each(this._features, function (feature) {
                feature.dispose && feature.dispose(ecModel, api);
            });
        }
    });
 
    function isUserFeatureName(featureName) {
        return featureName.indexOf('my') === 0;
    }
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/featureManager.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/featureManager.js

Statements: 75% (3 / 4)      Branches: 100% (0 / 0)      Functions: 50% (1 / 2)      Lines: 75% (3 / 4)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16      1   1   6                
'use strict';
 
 
    var features = {};
 
    module.exports = {
        register: function (name, ctor) {
            features[name] = ctor;
        },
 
        get: function (name) {
            return features[name];
        }
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/feature/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/feature/

Statements: 19.22% (89 / 463)      Branches: 0% (0 / 218)      Functions: 0% (0 / 77)      Lines: 19.22% (89 / 463)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/feature/
File Statements Branches Functions Lines
Brush.js 25% (10 / 40) 0% (0 / 20) 0% (0 / 7) 25% (10 / 40)
DataView.js 11.11% (24 / 216) 0% (0 / 65) 0% (0 / 30) 11.11% (24 / 216)
DataZoom.js 24.32% (27 / 111) 0% (0 / 73) 0% (0 / 23) 24.32% (27 / 111)
MagicType.js 20% (12 / 60) 0% (0 / 44) 0% (0 / 12) 20% (12 / 60)
Restore.js 66.67% (8 / 12) 100% (0 / 0) 0% (0 / 3) 66.67% (8 / 12)
SaveAsImage.js 33.33% (8 / 24) 0% (0 / 16) 0% (0 / 2) 33.33% (8 / 24)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/feature/Brush.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/feature/Brush.js

Statements: 25% (10 / 40)      Branches: 0% (0 / 20)      Functions: 0% (0 / 7)      Lines: 25% (10 / 40)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128      1 1   1                                   1                                         1   1                                                         1                       1                                                                     1   1    
'use strict';
 
 
    var featureManager = require('../featureManager');
    var zrUtil = require('zrender/lib/core/util');
 
    function Brush(model, ecModel, api) {
        this.model = model;
        this.ecModel = ecModel;
        this.api = api;
 
        /**
         * @private
         * @type {string}
         */
        this._brushType;
 
        /**
         * @private
         * @type {string}
         */
        this._brushMode;
    }
 
    Brush.defaultOption = {
        show: true,
        type: ['rect', 'polygon', 'lineX', 'lineY', 'keep', 'clear'],
        icon: {
            rect: 'M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13', // jshint ignore:line
            polygon: 'M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2', // jshint ignore:line
            lineX: 'M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4', // jshint ignore:line
            lineY: 'M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4', // jshint ignore:line
            keep: 'M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z', // jshint ignore:line
            clear: 'M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2' // jshint ignore:line
        },
        title: {
            rect: '矩形选择',
            polygon: '圈选',
            lineX: '横向选择',
            lineY: '纵向选择',
            keep: '保持选择',
            clear: '清除选择'
        }
    };
 
    var proto = Brush.prototype;
 
    proto.render =
    proto.updateView =
    proto.updateLayout = function (featureModel, ecModel, api) {
        var brushType;
        var brushMode;
        var isBrushed;
 
        ecModel.eachComponent({mainType: 'brush'}, function (brushModel) {
            brushType = brushModel.brushType;
            brushMode = brushModel.brushOption.brushMode || 'single';
            isBrushed |= brushModel.areas.length;
        });
        this._brushType = brushType;
        this._brushMode = brushMode;
 
        zrUtil.each(featureModel.get('type', true), function (type) {
            featureModel.setIconStatus(
                type,
                (
                    type === 'keep'
                    ? brushMode === 'multiple'
                    : type === 'clear'
                    ? isBrushed
                    : type === brushType
                ) ? 'emphasis' : 'normal'
            );
        });
    };
 
    proto.getIcons = function () {
        var model = this.model;
        var availableIcons = model.get('icon', true);
        var icons = {};
        zrUtil.each(model.get('type', true), function (type) {
            if (availableIcons[type]) {
                icons[type] = availableIcons[type];
            }
        });
        return icons;
    };
 
    proto.onclick = function (ecModel, api, type) {
        var api = this.api;
        var brushType = this._brushType;
        var brushMode = this._brushMode;
 
        if (type === 'clear') {
            // Trigger parallel action firstly
            api.dispatchAction({
                type: 'axisAreaSelect',
                intervals: []
            });
 
            api.dispatchAction({
                type: 'brush',
                command: 'clear',
                // Clear all areas of all brush components.
                areas: []
            });
        }
        else {
            api.dispatchAction({
                type: 'takeGlobalCursor',
                key: 'brush',
                brushOption: {
                    brushType: type === 'keep'
                        ? brushType
                        : (brushType === type ? false : type),
                    brushMode: type === 'keep'
                        ? (brushMode === 'multiple' ? 'single' : 'multiple')
                        : brushMode
                }
            });
        }
    };
 
    featureManager.register('brush', Brush);
 
    module.exports = Brush;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/feature/DataView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/feature/DataView.js

Statements: 11.11% (24 / 216)      Branches: 0% (0 / 65)      Functions: 0% (0 / 30)      Lines: 11.11% (24 / 216)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479            1 1     1 1                 1                                                                                           1                                                                       1                                             1                                 1           1               1         1                                                         1                                                                                     1                                                               1             1                                 1                                                                                                                     1                                                                                                                                     1       1             1                                   1   1                                                           1    
/**
 * @module echarts/component/toolbox/feature/DataView
 */
 
 
 
    var zrUtil = require('zrender/lib/core/util');
    var eventTool = require('zrender/lib/core/event');
 
 
    var BLOCK_SPLITER = new Array(60).join('-');
    var ITEM_SPLITER = '\t';
    /**
     * Group series into two types
     *  1. on category axis, like line, bar
     *  2. others, like scatter, pie
     * @param {module:echarts/model/Global} ecModel
     * @return {Object}
     * @inner
     */
    function groupSeries(ecModel) {
        var seriesGroupByCategoryAxis = {};
        var otherSeries = [];
        var meta = [];
        ecModel.eachRawSeries(function (seriesModel) {
            var coordSys = seriesModel.coordinateSystem;
 
            if (coordSys && (coordSys.type === 'cartesian2d' || coordSys.type === 'polar')) {
                var baseAxis = coordSys.getBaseAxis();
                if (baseAxis.type === 'category') {
                    var key = baseAxis.dim + '_' + baseAxis.index;
                    if (!seriesGroupByCategoryAxis[key]) {
                        seriesGroupByCategoryAxis[key] = {
                            categoryAxis: baseAxis,
                            valueAxis: coordSys.getOtherAxis(baseAxis),
                            series: []
                        };
                        meta.push({
                            axisDim: baseAxis.dim,
                            axisIndex: baseAxis.index
                        });
                    }
                    seriesGroupByCategoryAxis[key].series.push(seriesModel);
                }
                else {
                    otherSeries.push(seriesModel);
                }
            }
            else {
                otherSeries.push(seriesModel);
            }
        });
 
        return {
            seriesGroupByCategoryAxis: seriesGroupByCategoryAxis,
            other: otherSeries,
            meta: meta
        };
    }
 
    /**
     * Assemble content of series on cateogory axis
     * @param {Array.<module:echarts/model/Series>} series
     * @return {string}
     * @inner
     */
    function assembleSeriesWithCategoryAxis(series) {
        var tables = [];
        zrUtil.each(series, function (group, key) {
            var categoryAxis = group.categoryAxis;
            var valueAxis = group.valueAxis;
            var valueAxisDim = valueAxis.dim;
 
            var headers = [' '].concat(zrUtil.map(group.series, function (series) {
                return series.name;
            }));
            var columns = [categoryAxis.model.getCategories()];
            zrUtil.each(group.series, function (series) {
                columns.push(series.getRawData().mapArray(valueAxisDim, function (val) {
                    return val;
                }));
            });
            // Assemble table content
            var lines = [headers.join(ITEM_SPLITER)];
            for (var i = 0; i < columns[0].length; i++) {
                var items = [];
                for (var j = 0; j < columns.length; j++) {
                    items.push(columns[j][i]);
                }
                lines.push(items.join(ITEM_SPLITER));
            }
            tables.push(lines.join('\n'));
        });
        return tables.join('\n\n' +  BLOCK_SPLITER + '\n\n');
    }
 
    /**
     * Assemble content of other series
     * @param {Array.<module:echarts/model/Series>} series
     * @return {string}
     * @inner
     */
    function assembleOtherSeries(series) {
        return zrUtil.map(series, function (series) {
            var data = series.getRawData();
            var lines = [series.name];
            var vals = [];
            data.each(data.dimensions, function () {
                var argLen = arguments.length;
                var dataIndex = arguments[argLen - 1];
                var name = data.getName(dataIndex);
                for (var i = 0; i < argLen - 1; i++) {
                    vals[i] = arguments[i];
                }
                lines.push((name ? (name + ITEM_SPLITER) : '') + vals.join(ITEM_SPLITER));
            });
            return lines.join('\n');
        }).join('\n\n' + BLOCK_SPLITER + '\n\n');
    }
 
    /**
     * @param {module:echarts/model/Global}
     * @return {string}
     * @inner
     */
    function getContentFromModel(ecModel) {
 
        var result = groupSeries(ecModel);
 
        return {
            value: zrUtil.filter([
                    assembleSeriesWithCategoryAxis(result.seriesGroupByCategoryAxis),
                    assembleOtherSeries(result.other)
                ], function (str) {
                    return str.replace(/[\n\t\s]/g, '');
                }).join('\n\n' + BLOCK_SPLITER + '\n\n'),
 
            meta: result.meta
        };
    }
 
 
    function trim(str) {
        return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
    }
    /**
     * If a block is tsv format
     */
    function isTSVFormat(block) {
        // Simple method to find out if a block is tsv format
        var firstLine = block.slice(0, block.indexOf('\n'));
        if (firstLine.indexOf(ITEM_SPLITER) >= 0) {
            return true;
        }
    }
 
    var itemSplitRegex = new RegExp('[' + ITEM_SPLITER + ']+', 'g');
    /**
     * @param {string} tsv
     * @return {Array.<Object>}
     */
    function parseTSVContents(tsv) {
        var tsvLines = tsv.split(/\n+/g);
        var headers = trim(tsvLines.shift()).split(itemSplitRegex);
 
        var categories = [];
        var series = zrUtil.map(headers, function (header) {
            return {
                name: header,
                data: []
            };
        });
        for (var i = 0; i < tsvLines.length; i++) {
            var items = trim(tsvLines[i]).split(itemSplitRegex);
            categories.push(items.shift());
            for (var j = 0; j < items.length; j++) {
                series[j] && (series[j].data[i] = items[j]);
            }
        }
        return {
            series: series,
            categories: categories
        };
    }
 
    /**
     * @param {string} str
     * @return {Array.<Object>}
     * @inner
     */
    function parseListContents(str) {
        var lines = str.split(/\n+/g);
        var seriesName = trim(lines.shift());
 
        var data = [];
        for (var i = 0; i < lines.length; i++) {
            var items = trim(lines[i]).split(itemSplitRegex);
            var name = '';
            var value;
            var hasName = false;
            if (isNaN(items[0])) { // First item is name
                hasName = true;
                name = items[0];
                items = items.slice(1);
                data[i] = {
                    name: name,
                    value: []
                };
                value = data[i].value;
            }
            else {
                value = data[i] = [];
            }
            for (var j = 0; j < items.length; j++) {
                value.push(+items[j]);
            }
            if (value.length === 1) {
                hasName ? (data[i].value = value[0]) : (data[i] = value[0]);
            }
        }
 
        return {
            name: seriesName,
            data: data
        };
    }
 
    /**
     * @param {string} str
     * @param {Array.<Object>} blockMetaList
     * @return {Object}
     * @inner
     */
    function parseContents(str, blockMetaList) {
        var blocks = str.split(new RegExp('\n*' + BLOCK_SPLITER + '\n*', 'g'));
        var newOption = {
            series: []
        };
        zrUtil.each(blocks, function (block, idx) {
            if (isTSVFormat(block)) {
                var result = parseTSVContents(block);
                var blockMeta = blockMetaList[idx];
                var axisKey = blockMeta.axisDim + 'Axis';
 
                if (blockMeta) {
                    newOption[axisKey] = newOption[axisKey] || [];
                    newOption[axisKey][blockMeta.axisIndex] = {
                        data: result.categories
                    };
                    newOption.series = newOption.series.concat(result.series);
                }
            }
            else {
                var result = parseListContents(block);
                newOption.series.push(result);
            }
        });
        return newOption;
    }
 
    /**
     * @alias {module:echarts/component/toolbox/feature/DataView}
     * @constructor
     * @param {module:echarts/model/Model} model
     */
    function DataView(model) {
 
        this._dom = null;
 
        this.model = model;
    }
 
    DataView.defaultOption = {
        show: true,
        readOnly: false,
        optionToContent: null,
        contentToOption: null,
 
        icon: 'M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28',
        title: '数据视图',
        lang: ['数据视图', '关闭', '刷新'],
        backgroundColor: '#fff',
        textColor: '#000',
        textareaColor: '#fff',
        textareaBorderColor: '#333',
        buttonColor: '#c23531',
        buttonTextColor: '#fff'
    };
 
    DataView.prototype.onclick = function (ecModel, api) {
        var container = api.getDom();
        var model = this.model;
        if (this._dom) {
            container.removeChild(this._dom);
        }
        var root = document.createElement('div');
        root.style.cssText = 'position:absolute;left:5px;top:5px;bottom:5px;right:5px;';
        root.style.backgroundColor = model.get('backgroundColor') || '#fff';
 
        // Create elements
        var header = document.createElement('h4');
        var lang = model.get('lang') || [];
        header.innerHTML = lang[0] || model.get('title');
        header.style.cssText = 'margin: 10px 20px;';
        header.style.color = model.get('textColor');
 
        var viewMain = document.createElement('div');
        var textarea = document.createElement('textarea');
        viewMain.style.cssText = 'display:block;width:100%;overflow:auto;';
 
        var optionToContent = model.get('optionToContent');
        var contentToOption = model.get('contentToOption');
        var result = getContentFromModel(ecModel);
        if (typeof optionToContent === 'function') {
            var htmlOrDom = optionToContent(api.getOption());
            if (typeof htmlOrDom === 'string') {
                viewMain.innerHTML = htmlOrDom;
            }
            else if (zrUtil.isDom(htmlOrDom)) {
                viewMain.appendChild(htmlOrDom);
            }
        }
        else {
            // Use default textarea
            viewMain.appendChild(textarea);
            textarea.readOnly = model.get('readOnly');
            textarea.style.cssText = 'width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;';
            textarea.style.color = model.get('textColor');
            textarea.style.borderColor = model.get('textareaBorderColor');
            textarea.style.backgroundColor = model.get('textareaColor');
            textarea.value = result.value;
        }
 
        var blockMetaList = result.meta;
 
        var buttonContainer = document.createElement('div');
        buttonContainer.style.cssText = 'position:absolute;bottom:0;left:0;right:0;';
 
        var buttonStyle = 'float:right;margin-right:20px;border:none;'
            + 'cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px';
        var closeButton = document.createElement('div');
        var refreshButton = document.createElement('div');
 
        buttonStyle += ';background-color:' + model.get('buttonColor');
        buttonStyle += ';color:' + model.get('buttonTextColor');
 
        var self = this;
 
        function close() {
            container.removeChild(root);
            self._dom = null;
        }
        eventTool.addEventListener(closeButton, 'click', close);
 
        eventTool.addEventListener(refreshButton, 'click', function () {
            var newOption;
            try {
                if (typeof contentToOption === 'function') {
                    newOption = contentToOption(viewMain, api.getOption());
                }
                else {
                    newOption = parseContents(textarea.value, blockMetaList);
                }
            }
            catch (e) {
                close();
                throw new Error('Data view format error ' + e);
            }
            if (newOption) {
                api.dispatchAction({
                    type: 'changeDataView',
                    newOption: newOption
                });
            }
 
            close();
        });
 
        closeButton.innerHTML = lang[1];
        refreshButton.innerHTML = lang[2];
        refreshButton.style.cssText = buttonStyle;
        closeButton.style.cssText = buttonStyle;
 
        !model.get('readOnly') && buttonContainer.appendChild(refreshButton);
        buttonContainer.appendChild(closeButton);
 
        // http://stackoverflow.com/questions/6637341/use-tab-to-indent-in-textarea
        eventTool.addEventListener(textarea, 'keydown', function (e) {
            if ((e.keyCode || e.which) === 9) {
                // get caret position/selection
                var val = this.value;
                var start = this.selectionStart;
                var end = this.selectionEnd;
 
                // set textarea value to: text before caret + tab + text after caret
                this.value = val.substring(0, start) + ITEM_SPLITER + val.substring(end);
 
                // put caret at right position again
                this.selectionStart = this.selectionEnd = start + 1;
 
                // prevent the focus lose
                eventTool.stop(e);
            }
        });
 
        root.appendChild(header);
        root.appendChild(viewMain);
        root.appendChild(buttonContainer);
 
        viewMain.style.height = (container.clientHeight - 80) + 'px';
 
        container.appendChild(root);
        this._dom = root;
    };
 
    DataView.prototype.remove = function (ecModel, api) {
        this._dom && api.getDom().removeChild(this._dom);
    };
 
    DataView.prototype.dispose = function (ecModel, api) {
        this.remove(ecModel, api);
    };
 
    /**
     * @inner
     */
    function tryMergeDataOption(newData, originalData) {
        return zrUtil.map(newData, function (newVal, idx) {
            var original = originalData && originalData[idx];
            if (zrUtil.isObject(original) && !zrUtil.isArray(original)) {
                if (zrUtil.isObject(newVal) && !zrUtil.isArray(newVal)) {
                    newVal = newVal.value;
                }
                // Original data has option
                return zrUtil.defaults({
                    value: newVal
                }, original);
            }
            else {
                return newVal;
            }
        });
    }
 
    require('../featureManager').register('dataView', DataView);
 
    require('../../../echarts').registerAction({
        type: 'changeDataView',
        event: 'dataViewChanged',
        update: 'prepareAndUpdate'
    }, function (payload, ecModel) {
        var newSeriesOptList = [];
        zrUtil.each(payload.newOption.series, function (seriesOpt) {
            var seriesModel = ecModel.getSeriesByName(seriesOpt.name)[0];
            if (!seriesModel) {
                // New created series
                // Geuss the series type
                newSeriesOptList.push(zrUtil.extend({
                    // Default is scatter
                    type: 'scatter'
                }, seriesOpt));
            }
            else {
                var originalData = seriesModel.get('data');
                newSeriesOptList.push({
                    name: seriesOpt.name,
                    data: tryMergeDataOption(seriesOpt.data, originalData)
                });
            }
        });
 
        ecModel.mergeOption(zrUtil.defaults({
            series: newSeriesOptList
        }, payload.newOption));
    });
 
    module.exports = DataView;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/feature/DataZoom.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/feature/DataZoom.js

Statements: 24.32% (27 / 111)      Branches: 0% (0 / 73)      Functions: 0% (0 / 23)      Lines: 24.32% (27 / 111)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292      1 1 1 1   1     1     1   1                                 1                         1   1                 1       1       1             1                                       1                                                             1                 1                         1                             1                     1             1                                                                             1       1                                               1                                                                     1                 1    
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
    var BrushController = require('../../helper/BrushController');
    var BrushTargetManager = require('../../helper/BrushTargetManager');
    var history = require('../../dataZoom/history');
 
    var each = zrUtil.each;
 
    // Use dataZoomSelect
    require('../../dataZoomSelect');
 
    // Spectial component id start with \0ec\0, see echarts/model/Global.js~hasInnerId
    var DATA_ZOOM_ID_BASE = '\0_ec_\0toolbox-dataZoom_';
 
    function DataZoom(model, ecModel, api) {
 
        /**
         * @private
         * @type {module:echarts/component/helper/BrushController}
         */
        (this._brushController = new BrushController(api.getZr()))
            .on('brush', zrUtil.bind(this._onBrush, this))
            .mount();
 
        /**
         * @private
         * @type {boolean}
         */
        this._isZoomActive;
    }
 
    DataZoom.defaultOption = {
        show: true,
        // Icon group
        icon: {
            zoom: 'M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1',
            back: 'M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26'
        },
        title: {
            zoom: '区域缩放',
            back: '区域缩放还原'
        }
    };
 
    var proto = DataZoom.prototype;
 
    proto.render = function (featureModel, ecModel, api, payload) {
        this.model = featureModel;
        this.ecModel = ecModel;
        this.api = api;
 
        updateZoomBtnStatus(featureModel, ecModel, this, payload, api);
        updateBackBtnStatus(featureModel, ecModel);
    };
 
    proto.onclick = function (ecModel, api, type) {
        handlers[type].call(this);
    };
 
    proto.remove = function (ecModel, api) {
        this._brushController.unmount();
    };
 
    proto.dispose = function (ecModel, api) {
        this._brushController.dispose();
    };
 
    /**
     * @private
     */
    var handlers = {
 
        zoom: function () {
            var nextActive = !this._isZoomActive;
 
            this.api.dispatchAction({
                type: 'takeGlobalCursor',
                key: 'dataZoomSelect',
                dataZoomSelectActive: nextActive
            });
        },
 
        back: function () {
            this._dispatchZoomAction(history.pop(this.ecModel));
        }
    };
 
    /**
     * @private
     */
    proto._onBrush = function (areas, opt) {
        if (!opt.isEnd || !areas.length) {
            return;
        }
        var snapshot = {};
        var ecModel = this.ecModel;
 
        this._brushController.updateCovers([]); // remove cover
 
        var brushTargetManager = new BrushTargetManager(
            retrieveAxisSetting(this.model.option), ecModel, {include: ['grid']}
        );
        brushTargetManager.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) {
            if (coordSys.type !== 'cartesian2d') {
                return;
            }
 
            var brushType = area.brushType;
            if (brushType === 'rect') {
                setBatch('x', coordSys, coordRange[0]);
                setBatch('y', coordSys, coordRange[1]);
            }
            else {
                setBatch(({lineX: 'x', lineY: 'y'})[brushType], coordSys, coordRange);
            }
        });
 
        history.push(ecModel, snapshot);
 
        this._dispatchZoomAction(snapshot);
 
        function setBatch(dimName, coordSys, minMax) {
            var dataZoomModel = findDataZoom(dimName, coordSys.getAxis(dimName).model, ecModel);
            dataZoomModel && (snapshot[dataZoomModel.id] = {
                dataZoomId: dataZoomModel.id,
                startValue: minMax[0],
                endValue: minMax[1]
            });
        }
 
        function findDataZoom(dimName, axisModel, ecModel) {
            var found;
            ecModel.eachComponent({mainType: 'dataZoom', subType: 'select'}, function (dzModel) {
                var has = dzModel.getAxisModel(dimName, axisModel.componentIndex);
                has && (found = dzModel);
            });
            return found;
        }
    };
 
    /**
     * @private
     */
    proto._dispatchZoomAction = function (snapshot) {
        var batch = [];
 
        // Convert from hash map to array.
        each(snapshot, function (batchItem, dataZoomId) {
            batch.push(zrUtil.clone(batchItem));
        });
 
        batch.length && this.api.dispatchAction({
            type: 'dataZoom',
            from: this.uid,
            batch: batch
        });
    };
 
    function retrieveAxisSetting(option) {
        var setting = {};
        // Compatible with previous setting: null => all axis, false => no axis.
        zrUtil.each(['xAxisIndex', 'yAxisIndex'], function (name) {
            setting[name] = option[name];
            setting[name] == null && (setting[name] = 'all');
            (setting[name] === false || setting[name] === 'none') && (setting[name] = []);
        });
        return setting;
    }
 
    function updateBackBtnStatus(featureModel, ecModel) {
        featureModel.setIconStatus(
            'back',
            history.count(ecModel) > 1 ? 'emphasis' : 'normal'
        );
    }
 
    function updateZoomBtnStatus(featureModel, ecModel, view, payload, api) {
        var zoomActive = view._isZoomActive;
 
        if (payload && payload.type === 'takeGlobalCursor') {
            zoomActive = payload.key === 'dataZoomSelect'
                ? payload.dataZoomSelectActive : false;
        }
 
        view._isZoomActive = zoomActive;
 
        featureModel.setIconStatus('zoom', zoomActive ? 'emphasis' : 'normal');
 
        var brushTargetManager = new BrushTargetManager(
            retrieveAxisSetting(featureModel.option), ecModel, {include: ['grid']}
        );
 
        view._brushController
            .setPanels(brushTargetManager.makePanelOpts(api, function (targetInfo) {
                return (targetInfo.xAxisDeclared && !targetInfo.yAxisDeclared)
                    ? 'lineX'
                    : (!targetInfo.xAxisDeclared && targetInfo.yAxisDeclared)
                    ? 'lineY'
                    : 'rect';
            }))
            .enableBrush(
                zoomActive
                ? {
                    brushType: 'auto',
                    brushStyle: {
                        // FIXME user customized?
                        lineWidth: 0,
                        fill: 'rgba(0,0,0,0.2)'
                    }
                }
                : false
            );
    }
 
 
    require('../featureManager').register('dataZoom', DataZoom);
 
 
    // Create special dataZoom option for select
    require('../../../echarts').registerPreprocessor(function (option) {
        if (!option) {
            return;
        }
 
        var dataZoomOpts = option.dataZoom || (option.dataZoom = []);
        if (!zrUtil.isArray(dataZoomOpts)) {
            option.dataZoom = dataZoomOpts = [dataZoomOpts];
        }
 
        var toolboxOpt = option.toolbox;
        if (toolboxOpt) {
            // Assume there is only one toolbox
            if (zrUtil.isArray(toolboxOpt)) {
                toolboxOpt = toolboxOpt[0];
            }
 
            if (toolboxOpt && toolboxOpt.feature) {
                var dataZoomOpt = toolboxOpt.feature.dataZoom;
                addForAxis('xAxis', dataZoomOpt);
                addForAxis('yAxis', dataZoomOpt);
            }
        }
 
        function addForAxis(axisName, dataZoomOpt) {
            if (!dataZoomOpt) {
                return;
            }
 
            // Try not to modify model, because it is not merged yet.
            var axisIndicesName = axisName + 'Index';
            var givenAxisIndices = dataZoomOpt[axisIndicesName];
            if (givenAxisIndices != null
                && givenAxisIndices != 'all'
                && !zrUtil.isArray(givenAxisIndices)
            ) {
                givenAxisIndices = (givenAxisIndices === false || givenAxisIndices === 'none') ? [] : [givenAxisIndices];
            }
 
            forEachComponent(axisName, function (axisOpt, axisIndex) {
                if (givenAxisIndices != null
                    && givenAxisIndices != 'all'
                    && zrUtil.indexOf(givenAxisIndices, axisIndex) === -1
                ) {
                    return;
                }
                var newOpt = {
                    type: 'select',
                    $fromToolbox: true,
                    // Id for merge mapping.
                    id: DATA_ZOOM_ID_BASE + axisName + axisIndex
                };
                // FIXME
                // Only support one axis now.
                newOpt[axisIndicesName] = axisIndex;
                dataZoomOpts.push(newOpt);
            });
        }
 
        function forEachComponent(mainType, cb) {
            var opts = option[mainType];
            if (!zrUtil.isArray(opts)) {
                opts = opts ? [opts] : [];
            }
            each(opts, cb);
        }
    });
 
    module.exports = DataZoom;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/feature/MagicType.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/feature/MagicType.js

Statements: 20% (12 / 60)      Branches: 0% (0 / 44)      Functions: 0% (0 / 12)      Lines: 20% (12 / 60)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176      1   1       1                                       1   1                       1                                                                                         1         1                                                                                                                                         1 1               1   1    
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    function MagicType(model) {
        this.model = model;
    }
 
    MagicType.defaultOption = {
        show: true,
        type: [],
        // Icon group
        icon: {
            line: 'M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4',
            bar: 'M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7',
            stack: 'M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z', // jshint ignore:line
            tiled: 'M2.3,2.2h22.8V25H2.3V2.2z M35,2.2h22.8V25H35V2.2zM2.3,35h22.8v22.8H2.3V35z M35,35h22.8v22.8H35V35z'
        },
        title: {
            line: '切换为折线图',
            bar: '切换为柱状图',
            stack: '切换为堆叠',
            tiled: '切换为平铺'
        },
        option: {},
        seriesIndex: {}
    };
 
    var proto = MagicType.prototype;
 
    proto.getIcons = function () {
        var model = this.model;
        var availableIcons = model.get('icon');
        var icons = {};
        zrUtil.each(model.get('type'), function (type) {
            if (availableIcons[type]) {
                icons[type] = availableIcons[type];
            }
        });
        return icons;
    };
 
    var seriesOptGenreator = {
        'line': function (seriesType, seriesId, seriesModel, model) {
            if (seriesType === 'bar') {
                return zrUtil.merge({
                    id: seriesId,
                    type: 'line',
                    // Preserve data related option
                    data: seriesModel.get('data'),
                    stack: seriesModel.get('stack'),
                    markPoint: seriesModel.get('markPoint'),
                    markLine: seriesModel.get('markLine')
                }, model.get('option.line') || {}, true);
            }
        },
        'bar': function (seriesType, seriesId, seriesModel, model) {
            if (seriesType === 'line') {
                return zrUtil.merge({
                    id: seriesId,
                    type: 'bar',
                    // Preserve data related option
                    data: seriesModel.get('data'),
                    stack: seriesModel.get('stack'),
                    markPoint: seriesModel.get('markPoint'),
                    markLine: seriesModel.get('markLine')
                }, model.get('option.bar') || {}, true);
            }
        },
        'stack': function (seriesType, seriesId, seriesModel, model) {
            if (seriesType === 'line' || seriesType === 'bar') {
                return zrUtil.merge({
                    id: seriesId,
                    stack: '__ec_magicType_stack__'
                }, model.get('option.stack') || {}, true);
            }
        },
        'tiled': function (seriesType, seriesId, seriesModel, model) {
            if (seriesType === 'line' || seriesType === 'bar') {
                return zrUtil.merge({
                    id: seriesId,
                    stack: ''
                }, model.get('option.tiled') || {}, true);
            }
        }
    };
 
    var radioTypes = [
        ['line', 'bar'],
        ['stack', 'tiled']
    ];
 
    proto.onclick = function (ecModel, api, type) {
        var model = this.model;
        var seriesIndex = model.get('seriesIndex.' + type);
        // Not supported magicType
        if (!seriesOptGenreator[type]) {
            return;
        }
        var newOption = {
            series: []
        };
        var generateNewSeriesTypes = function (seriesModel) {
            var seriesType = seriesModel.subType;
            var seriesId = seriesModel.id;
            var newSeriesOpt = seriesOptGenreator[type](
                seriesType, seriesId, seriesModel, model
            );
            if (newSeriesOpt) {
                // PENDING If merge original option?
                zrUtil.defaults(newSeriesOpt, seriesModel.option);
                newOption.series.push(newSeriesOpt);
            }
            // Modify boundaryGap
            var coordSys = seriesModel.coordinateSystem;
            if (coordSys && coordSys.type === 'cartesian2d' && (type === 'line' || type === 'bar')) {
                var categoryAxis = coordSys.getAxesByScale('ordinal')[0];
                if (categoryAxis) {
                    var axisDim = categoryAxis.dim;
                    var axisType = axisDim + 'Axis';
                    var axisModel = ecModel.queryComponents({
                        mainType: axisType,
                        index: seriesModel.get(name + 'Index'),
                        id: seriesModel.get(name + 'Id')
                    })[0];
                    var axisIndex = axisModel.componentIndex;
 
                    newOption[axisType] = newOption[axisType] || [];
                    for (var i = 0; i <= axisIndex; i++) {
                        newOption[axisType][axisIndex] = newOption[axisType][axisIndex] || {};
                    }
                    newOption[axisType][axisIndex].boundaryGap = type === 'bar' ? true : false;
                }
            }
        };
 
        zrUtil.each(radioTypes, function (radio) {
            if (zrUtil.indexOf(radio, type) >= 0) {
                zrUtil.each(radio, function (item) {
                    model.setIconStatus(item, 'normal');
                });
            }
        });
 
        model.setIconStatus(type, 'emphasis');
 
        ecModel.eachComponent(
            {
                mainType: 'series',
                query: seriesIndex == null ? null : {
                    seriesIndex: seriesIndex
                }
            }, generateNewSeriesTypes
        );
        api.dispatchAction({
            type: 'changeMagicType',
            currentType: type,
            newOption: newOption
        });
    };
 
    var echarts = require('../../../echarts');
    echarts.registerAction({
        type: 'changeMagicType',
        event: 'magicTypeChanged',
        update: 'prepareAndUpdate'
    }, function (payload, ecModel) {
        ecModel.mergeOption(payload.newOption);
    });
 
    require('../featureManager').register('magicType', MagicType);
 
    module.exports = MagicType;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/feature/Restore.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/feature/Restore.js

Statements: 66.67% (8 / 12)      Branches: 100% (0 / 0)      Functions: 0% (0 / 3)      Lines: 66.67% (8 / 12)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40      1   1       1           1   1                   1     1             1    
'use strict';
 
 
    var history = require('../../dataZoom/history');
 
    function Restore(model) {
        this.model = model;
    }
 
    Restore.defaultOption = {
        show: true,
        icon: 'M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5',
        title: '还原'
    };
 
    var proto = Restore.prototype;
 
    proto.onclick = function (ecModel, api, type) {
        history.clear(ecModel);
 
        api.dispatchAction({
            type: 'restore',
            from: this.uid
        });
    };
 
 
    require('../featureManager').register('restore', Restore);
 
 
    require('../../../echarts').registerAction(
        {type: 'restore', event: 'restore', update: 'prepareAndUpdate'},
        function (payload, ecModel) {
            ecModel.resetOption('recreate');
        }
    );
 
    module.exports = Restore;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/feature/SaveAsImage.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/toolbox/feature/SaveAsImage.js

Statements: 33.33% (8 / 24)      Branches: 0% (0 / 16)      Functions: 0% (0 / 2)      Lines: 33.33% (8 / 24)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68    1   1       1                         1   1   1                                                                       1       1    
 
 
    var env = require('zrender/lib/core/env');
 
    function SaveAsImage (model) {
        this.model = model;
    }
 
    SaveAsImage.defaultOption = {
        show: true,
        icon: 'M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0',
        title: '保存为图片',
        type: 'png',
        // Default use option.backgroundColor
        // backgroundColor: '#fff',
        name: '',
        excludeComponents: ['toolbox'],
        pixelRatio: 1,
        lang: ['右键另存为图片']
    };
 
    SaveAsImage.prototype.unusable = !env.canvasSupported;
 
    var proto = SaveAsImage.prototype;
 
    proto.onclick = function (ecModel, api) {
        var model = this.model;
        var title = model.get('name') || ecModel.get('title.0.text') || 'echarts';
        var $a = document.createElement('a');
        var type = model.get('type', true) || 'png';
        $a.download = title + '.' + type;
        $a.target = '_blank';
        var url = api.getConnectedDataURL({
            type: type,
            backgroundColor: model.get('backgroundColor', true)
                || ecModel.get('backgroundColor') || '#fff',
            excludeComponents: model.get('excludeComponents'),
            pixelRatio: model.get('pixelRatio')
        });
        $a.href = url;
        // Chrome and Firefox
        if (typeof MouseEvent === 'function' && !env.browser.ie && !env.browser.edge) {
            var evt = new MouseEvent('click', {
                view: window,
                bubbles: true,
                cancelable: false
            });
            $a.dispatchEvent(evt);
        }
        // IE
        else {
            var lang = model.get('lang');
            var html = ''
                + '<body style="margin:0;">'
                + '<img src="' + url + '" style="max-width:100%;" title="' + ((lang && lang[0]) || '') + '" />'
                + '</body>';
            var tab = window.open();
            tab.document.write(html);
        }
    };
 
    require('../featureManager').register(
        'saveAsImage', SaveAsImage
    );
 
    module.exports = SaveAsImage;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/tooltip/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/tooltip/

Statements: 9.22% (39 / 423)      Branches: 0% (0 / 245)      Functions: 0% (0 / 54)      Lines: 9.22% (39 / 423)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/component/tooltip/
File Statements Branches Functions Lines
TooltipContent.js 13.89% (15 / 108) 0% (0 / 57) 0% (0 / 19) 13.89% (15 / 108)
TooltipModel.js 100% (1 / 1) 100% (0 / 0) 100% (0 / 0) 100% (1 / 1)
TooltipView.js 7.32% (23 / 314) 0% (0 / 188) 0% (0 / 35) 7.32% (23 / 314)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/tooltip/TooltipContent.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/tooltip/TooltipContent.js

Statements: 13.89% (15 / 108)      Branches: 0% (0 / 57)      Functions: 0% (0 / 19)      Lines: 13.89% (15 / 108)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262          1 1 1 1 1 1 1   1   1             1                           1                                                   1                                                                                                   1                                                                                                 1                                                                                                                                                                                                   1    
/**
 * @module echarts/component/tooltip/TooltipContent
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
    var zrColor = require('zrender/lib/tool/color');
    var eventUtil = require('zrender/lib/core/event');
    var formatUtil = require('../../util/format');
    var each = zrUtil.each;
    var toCamelCase = formatUtil.toCamelCase;
    var env = require('zrender/lib/core/env');
 
    var vendors = ['', '-webkit-', '-moz-', '-o-'];
 
    var gCssText = 'position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;';
 
    /**
     * @param {number} duration
     * @return {string}
     * @inner
     */
    function assembleTransition(duration) {
        var transitionCurve = 'cubic-bezier(0.23, 1, 0.32, 1)';
        var transitionText = 'left ' + duration + 's ' + transitionCurve + ','
                            + 'top ' + duration + 's ' + transitionCurve;
        return zrUtil.map(vendors, function (vendorPrefix) {
            return vendorPrefix + 'transition:' + transitionText;
        }).join(';');
    }
 
    /**
     * @param {Object} textStyle
     * @return {string}
     * @inner
     */
    function assembleFont(textStyleModel) {
        var cssText = [];
 
        var fontSize = textStyleModel.get('fontSize');
        var color = textStyleModel.getTextColor();
 
        color && cssText.push('color:' + color);
 
        cssText.push('font:' + textStyleModel.getFont());
 
        fontSize &&
            cssText.push('line-height:' + Math.round(fontSize * 3 / 2) + 'px');
 
        each(['decoration', 'align'], function (name) {
            var val = textStyleModel.get(name);
            val && cssText.push('text-' + name + ':' + val);
        });
 
        return cssText.join(';');
    }
 
    /**
     * @param {Object} tooltipModel
     * @return {string}
     * @inner
     */
    function assembleCssText(tooltipModel) {
 
        var cssText = [];
 
        var transitionDuration = tooltipModel.get('transitionDuration');
        var backgroundColor = tooltipModel.get('backgroundColor');
        var textStyleModel = tooltipModel.getModel('textStyle');
        var padding = tooltipModel.get('padding');
 
        // Animation transition. Do not animate when transitionDuration is 0.
        transitionDuration &&
            cssText.push(assembleTransition(transitionDuration));
 
        if (backgroundColor) {
            if (env.canvasSupported) {
                cssText.push('background-Color:' + backgroundColor);
            }
            else {
                // for ie
                cssText.push(
                    'background-Color:#' + zrColor.toHex(backgroundColor)
                );
                cssText.push('filter:alpha(opacity=70)');
            }
        }
 
        // Border style
        each(['width', 'color', 'radius'], function (name) {
            var borderName = 'border-' + name;
            var camelCase = toCamelCase(borderName);
            var val = tooltipModel.get(camelCase);
            val != null &&
                cssText.push(borderName + ':' + val + (name === 'color' ? '' : 'px'));
        });
 
        // Text style
        cssText.push(assembleFont(textStyleModel));
 
        // Padding
        if (padding != null) {
            cssText.push('padding:' + formatUtil.normalizeCssArray(padding).join('px ') + 'px');
        }
 
        return cssText.join(';') + ';';
    }
 
    /**
     * @alias module:echarts/component/tooltip/TooltipContent
     * @constructor
     */
    function TooltipContent(container, api) {
        var el = document.createElement('div');
        var zr = this._zr = api.getZr();
 
        this.el = el;
 
        this._x = api.getWidth() / 2;
        this._y = api.getHeight() / 2;
 
        container.appendChild(el);
 
        this._container = container;
 
        this._show = false;
 
        /**
         * @private
         */
        this._hideTimeout;
 
        var self = this;
        el.onmouseenter = function () {
            // clear the timeout in hideLater and keep showing tooltip
            if (self._enterable) {
                clearTimeout(self._hideTimeout);
                self._show = true;
            }
            self._inContent = true;
        };
        el.onmousemove = function (e) {
            e = e || window.event;
            if (!self._enterable) {
                // Try trigger zrender event to avoid mouse
                // in and out shape too frequently
                var handler = zr.handler;
                eventUtil.normalizeEvent(container, e, true);
                handler.dispatch('mousemove', e);
            }
        };
        el.onmouseleave = function () {
            if (self._enterable) {
                if (self._show) {
                    self.hideLater(self._hideDelay);
                }
            }
            self._inContent = false;
        };
    }
 
    TooltipContent.prototype = {
 
        constructor: TooltipContent,
 
        /**
         * @private
         * @type {boolean}
         */
        _enterable: true,
 
        /**
         * Update when tooltip is rendered
         */
        update: function () {
            // FIXME
            // Move this logic to ec main?
            var container = this._container;
            var stl = container.currentStyle
                || document.defaultView.getComputedStyle(container);
            var domStyle = container.style;
            if (domStyle.position !== 'absolute' && stl.position !== 'absolute') {
                domStyle.position = 'relative';
            }
            // Hide the tooltip
            // PENDING
            // this.hide();
        },
 
        show: function (tooltipModel) {
            clearTimeout(this._hideTimeout);
            var el = this.el;
 
            el.style.cssText = gCssText + assembleCssText(tooltipModel)
                // http://stackoverflow.com/questions/21125587/css3-transition-not-working-in-chrome-anymore
                + ';left:' + this._x + 'px;top:' + this._y + 'px;'
                + (tooltipModel.get('extraCssText') || '');
 
            el.style.display = el.innerHTML ?  'block' : 'none';
 
            this._show = true;
        },
 
        setContent: function (content) {
            this.el.innerHTML = content == null ? '' : content;
        },
 
        setEnterable: function (enterable) {
            this._enterable = enterable;
        },
 
        getSize: function () {
            var el = this.el;
            return [el.clientWidth, el.clientHeight];
        },
 
        moveTo: function (x, y) {
            // xy should be based on canvas root. But tooltipContent is
            // the sibling of canvas root. So padding of ec container
            // should be considered here.
            var zr = this._zr;
            var viewportRoot;
            if (zr && zr.painter && (viewportRoot = zr.painter.getViewportRoot())) {
                x += viewportRoot.offsetLeft || 0;
                y += viewportRoot.offsetTop || 0;
            }
 
            var style = this.el.style;
            style.left = x + 'px';
            style.top = y + 'px';
 
            this._x = x;
            this._y = y;
        },
 
        hide: function () {
            this.el.style.display = 'none';
            this._show = false;
        },
 
        hideLater: function (time) {
            if (this._show && !(this._inContent && this._enterable)) {
                if (time) {
                    this._hideDelay = time;
                    // Set show false to avoid invoke hideLater mutiple times
                    this._show = false;
                    this._hideTimeout = setTimeout(zrUtil.bind(this.hide, this), time);
                }
                else {
                    this.hide();
                }
            }
        },
 
        isShow: function () {
            return this._show;
        }
    };
 
    module.exports = TooltipContent;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/tooltip/TooltipModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/tooltip/TooltipModel.js

Statements: 100% (1 / 1)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (1 / 1)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106    1                                                                                                                                                                                                              
 
 
    require('../../echarts').extendComponentModel({
 
        type: 'tooltip',
 
        dependencies: ['axisPointer'],
 
        defaultOption: {
            zlevel: 0,
 
            z: 8,
 
            show: true,
 
            // tooltip主体内容
            showContent: true,
 
            // 'trigger' only works on coordinate system.
            // 'item' | 'axis' | 'none'
            trigger: 'item',
 
            // 'click' | 'mousemove' | 'none'
            triggerOn: 'mousemove|click',
 
            alwaysShowContent: false,
 
            displayMode: 'single', // 'single' | 'multipleByCoordSys'
 
            // 位置 {Array} | {Function}
            // position: null
            // Consider triggered from axisPointer handle, verticalAlign should be 'middle'
            // align: null,
            // verticalAlign: null,
 
            // 是否约束 content 在 viewRect 中。默认 false 是为了兼容以前版本。
            confine: false,
 
            // 内容格式器:{string}(Template) ¦ {Function}
            // formatter: null
 
            showDelay: 0,
 
            // 隐藏延迟,单位ms
            hideDelay: 100,
 
            // 动画变换时间,单位s
            transitionDuration: 0.4,
 
            enterable: false,
 
            // 提示背景颜色,默认为透明度为0.7的黑色
            backgroundColor: 'rgba(50,50,50,0.7)',
 
            // 提示边框颜色
            borderColor: '#333',
 
            // 提示边框圆角,单位px,默认为4
            borderRadius: 4,
 
            // 提示边框线宽,单位px,默认为0(无边框)
            borderWidth: 0,
 
            // 提示内边距,单位px,默认各方向内边距为5,
            // 接受数组分别设定上右下左边距,同css
            padding: 5,
 
            // Extra css text
            extraCssText: '',
 
            // 坐标轴指示器,坐标轴触发有效
            axisPointer: {
                // 默认为直线
                // 可选为:'line' | 'shadow' | 'cross'
                type: 'line',
 
                // type 为 line 的时候有效,指定 tooltip line 所在的轴,可选
                // 可选 'x' | 'y' | 'angle' | 'radius' | 'auto'
                // 默认 'auto',会选择类型为 cateogry 的轴,对于双数值轴,笛卡尔坐标系会默认选择 x 轴
                // 极坐标系会默认选择 angle 轴
                axis: 'auto',
 
                animation: 'auto',
                animationDurationUpdate: 200,
                animationEasingUpdate: 'exponentialOut',
 
                crossStyle: {
                    color: '#999',
                    width: 1,
                    type: 'dashed',
 
                    // TODO formatter
                    textStyle: {}
                }
 
                // lineStyle and shadowStyle should not be specified here,
                // otherwise it will always override those styles on option.axisPointer.
            },
            textStyle: {
                color: '#fff',
                fontSize: 14
            }
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/tooltip/TooltipView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/tooltip/TooltipView.js

Statements: 7.32% (23 / 314)      Branches: 0% (0 / 188)      Functions: 0% (0 / 35)      Lines: 7.32% (23 / 314)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772    1 1 1 1 1 1 1 1 1 1 1 1   1 1 1     1       1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 1                                           1       1                                             1                       1                                                               1          
 
 
    var TooltipContent = require('./TooltipContent');
    var zrUtil = require('zrender/lib/core/util');
    var formatUtil = require('../../util/format');
    var numberUtil = require('../../util/number');
    var graphic = require('../../util/graphic');
    var findPointFromSeries = require('../axisPointer/findPointFromSeries');
    var layoutUtil = require('../../util/layout');
    var env = require('zrender/lib/core/env');
    var Model = require('../../model/Model');
    var globalListener = require('../axisPointer/globalListener');
    var axisHelper = require('../../coord/axisHelper');
    var axisPointerViewHelper = require('../axisPointer/viewHelper');
 
    var bind = zrUtil.bind;
    var each = zrUtil.each;
    var parsePercent = numberUtil.parsePercent;
 
 
    var proxyRect = new graphic.Rect({
        shape: {x: -1, y: -1, width: 2, height: 2}
    });
 
    require('../../echarts').extendComponentView({
 
        type: 'tooltip',
 
        init: function (ecModel, api) {
            if (env.node) {
                return;
            }
            var tooltipContent = new TooltipContent(api.getDom(), api);
            this._tooltipContent = tooltipContent;
        },
 
        render: function (tooltipModel, ecModel, api) {
            if (env.node) {
                return;
            }
 
            // Reset
            this.group.removeAll();
 
            /**
             * @private
             * @type {module:echarts/component/tooltip/TooltipModel}
             */
            this._tooltipModel = tooltipModel;
 
            /**
             * @private
             * @type {module:echarts/model/Global}
             */
            this._ecModel = ecModel;
 
            /**
             * @private
             * @type {module:echarts/ExtensionAPI}
             */
            this._api = api;
 
            /**
             * Should be cleaned when render.
             * @private
             * @type {Array.<Array.<Object>>}
             */
            this._lastDataByCoordSys = null;
 
            /**
             * @private
             * @type {boolean}
             */
            this._alwaysShowContent = tooltipModel.get('alwaysShowContent');
 
            var tooltipContent = this._tooltipContent;
            tooltipContent.update();
            tooltipContent.setEnterable(tooltipModel.get('enterable'));
 
            this._initGlobalListener();
 
            this._keepShow();
        },
 
        _initGlobalListener: function () {
            var tooltipModel = this._tooltipModel;
            var triggerOn = tooltipModel.get('triggerOn');
 
            globalListener.register(
                'itemTooltip',
                this._api,
                bind(function (currTrigger, e, dispatchAction) {
                    // If 'none', it is not controlled by mouse totally.
                    if (triggerOn !== 'none') {
                        if (triggerOn.indexOf(currTrigger) >= 0) {
                            this._tryShow(e, dispatchAction);
                        }
                        else if (currTrigger === 'leave') {
                            this._hide(dispatchAction);
                        }
                    }
                }, this)
            );
        },
 
        _keepShow: function () {
            var tooltipModel = this._tooltipModel;
            var ecModel = this._ecModel;
            var api = this._api;
 
            // Try to keep the tooltip show when refreshing
            if (this._lastX != null
                && this._lastY != null
                // When user is willing to control tooltip totally using API,
                // self.manuallyShowTip({x, y}) might cause tooltip hide,
                // which is not expected.
                && tooltipModel.get('triggerOn') !== 'none'
            ) {
                var self = this;
                clearTimeout(this._refreshUpdateTimeout);
                this._refreshUpdateTimeout = setTimeout(function () {
                    // Show tip next tick after other charts are rendered
                    // In case highlight action has wrong result
                    // FIXME
                    self.manuallyShowTip(tooltipModel, ecModel, api, {
                        x: self._lastX,
                        y: self._lastY
                    });
                });
            }
        },
 
        /**
         * Show tip manually by
         * dispatchAction({
         *     type: 'showTip',
         *     x: 10,
         *     y: 10
         * });
         * Or
         * dispatchAction({
         *      type: 'showTip',
         *      seriesIndex: 0,
         *      dataIndex or dataIndexInside or name
         * });
         *
         *  TODO Batch
         */
        manuallyShowTip: function (tooltipModel, ecModel, api, payload) {
            if (payload.from === this.uid || env.node) {
                return;
            }
 
            var dispatchAction = makeDispatchAction(payload, api);
 
            // Reset ticket
            this._ticket = '';
 
            // When triggered from axisPointer.
            var dataByCoordSys = payload.dataByCoordSys;
 
            if (payload.tooltip && payload.x != null && payload.y != null) {
                var el = proxyRect;
                el.position = [payload.x, payload.y];
                el.update();
                el.tooltip = payload.tooltip;
                // Manually show tooltip while view is not using zrender elements.
                this._tryShow({
                    offsetX: payload.x,
                    offsetY: payload.y,
                    target: el
                }, dispatchAction);
            }
            else if (dataByCoordSys) {
                this._tryShow({
                    offsetX: payload.x,
                    offsetY: payload.y,
                    position: payload.position,
                    event: {},
                    dataByCoordSys: payload.dataByCoordSys,
                    tooltipOption: payload.tooltipOption
                }, dispatchAction);
            }
            else if (payload.seriesIndex != null) {
 
                if (this._manuallyAxisShowTip(tooltipModel, ecModel, api, payload)) {
                    return;
                }
 
                var pointInfo = findPointFromSeries(payload, ecModel);
                var cx = pointInfo.point[0];
                var cy = pointInfo.point[1];
                if (cx != null && cy != null) {
                    this._tryShow({
                        offsetX: cx,
                        offsetY: cy,
                        position: payload.position,
                        target: pointInfo.el,
                        event: {}
                    }, dispatchAction);
                }
            }
            else if (payload.x != null && payload.y != null) {
                // FIXME
                // should wrap dispatchAction like `axisPointer/globalListener` ?
                api.dispatchAction({
                    type: 'updateAxisPointer',
                    x: payload.x,
                    y: payload.y
                });
 
                this._tryShow({
                    offsetX: payload.x,
                    offsetY: payload.y,
                    position: payload.position,
                    target: api.getZr().findHover(payload.x, payload.y).target,
                    event: {}
                }, dispatchAction);
            }
        },
 
        manuallyHideTip: function (tooltipModel, ecModel, api, payload) {
            var tooltipContent = this._tooltipContent;
 
            if (!this._alwaysShowContent) {
                tooltipContent.hideLater(this._tooltipModel.get('hideDelay'));
            }
 
            this._lastX = this._lastY = null;
 
            if (payload.from !== this.uid) {
                this._hide(makeDispatchAction(payload, api));
            }
        },
 
        // Be compatible with previous design, that is, when tooltip.type is 'axis' and
        // dispatchAction 'showTip' with seriesIndex and dataIndex will trigger axis pointer
        // and tooltip.
        _manuallyAxisShowTip: function (tooltipModel, ecModel, api, payload) {
            var seriesIndex = payload.seriesIndex;
            var dataIndex = payload.dataIndex;
            var coordSysAxesInfo = ecModel.getComponent('axisPointer').coordSysAxesInfo;
 
            if (seriesIndex == null || dataIndex == null || coordSysAxesInfo == null) {
                return;
            }
 
            var seriesModel = ecModel.getSeriesByIndex(seriesIndex);
            if (!seriesModel) {
                return;
            }
 
            var data = seriesModel.getData();
            var tooltipModel = buildTooltipModel([
                data.getItemModel(dataIndex),
                seriesModel,
                (seriesModel.coordinateSystem || {}).model,
                tooltipModel
            ]);
 
            if (tooltipModel.get('trigger') !== 'axis') {
                return;
            }
 
            api.dispatchAction({
                type: 'updateAxisPointer',
                seriesIndex: seriesIndex,
                dataIndex: dataIndex
            });
 
            return true;
        },
 
        _tryShow: function (e, dispatchAction) {
            var el = e.target;
            var tooltipModel = this._tooltipModel;
 
            if (!tooltipModel) {
                return;
            }
 
            // Save mouse x, mouse y. So we can try to keep showing the tip if chart is refreshed
            this._lastX = e.offsetX;
            this._lastY = e.offsetY;
 
            var dataByCoordSys = e.dataByCoordSys;
            if (dataByCoordSys && dataByCoordSys.length) {
                this._showAxisTooltip(dataByCoordSys, e);
            }
            // Always show item tooltip if mouse is on the element with dataIndex
            else if (el && el.dataIndex != null) {
                this._lastDataByCoordSys = null;
                this._showSeriesItemTooltip(e, el, dispatchAction);
            }
            // Tooltip provided directly. Like legend.
            else if (el && el.tooltip) {
                this._lastDataByCoordSys = null;
                this._showComponentItemTooltip(e, el, dispatchAction);
            }
            else {
                this._lastDataByCoordSys = null;
                this._hide(dispatchAction);
            }
        },
 
        _showOrMove: function (tooltipModel, cb) {
            // showDelay is used in this case: tooltip.enterable is set
            // as true. User intent to move mouse into tooltip and click
            // something. `showDelay` makes it easyer to enter the content
            // but tooltip do not move immediately.
            var delay = tooltipModel.get('showDelay');
            cb = zrUtil.bind(cb, this);
            clearTimeout(this._showTimout);
            delay > 0
                ? (this._showTimout = setTimeout(cb, delay))
                : cb();
        },
 
        _showAxisTooltip: function (dataByCoordSys, e) {
            var ecModel = this._ecModel;
            var globalTooltipModel = this._tooltipModel;
            var point = [e.offsetX, e.offsetY];
            var singleDefaultHTML = [];
            var singleParamsList = [];
            var singleTooltipModel = buildTooltipModel([
                e.tooltipOption,
                globalTooltipModel
            ]);
 
            each(dataByCoordSys, function (itemCoordSys) {
                // var coordParamList = [];
                // var coordDefaultHTML = [];
                // var coordTooltipModel = buildTooltipModel([
                //     e.tooltipOption,
                //     itemCoordSys.tooltipOption,
                //     ecModel.getComponent(itemCoordSys.coordSysMainType, itemCoordSys.coordSysIndex),
                //     globalTooltipModel
                // ]);
                // var displayMode = coordTooltipModel.get('displayMode');
                // var paramsList = displayMode === 'single' ? singleParamsList : [];
 
                each(itemCoordSys.dataByAxis, function (item) {
                    var axisModel = ecModel.getComponent(item.axisDim + 'Axis', item.axisIndex);
                    var axisValue = item.value;
                    var seriesDefaultHTML = [];
 
                    if (!axisModel || axisValue == null) {
                        return;
                    }
 
                    var valueLabel = axisPointerViewHelper.getValueLabel(
                        axisValue, axisModel.axis, ecModel,
                        item.seriesDataIndices,
                        item.valueLabelOpt
                    );
 
                    zrUtil.each(item.seriesDataIndices, function (idxItem) {
                        var series = ecModel.getSeriesByIndex(idxItem.seriesIndex);
                        var dataIndex = idxItem.dataIndexInside;
                        var dataParams = series && series.getDataParams(dataIndex);
                        dataParams.axisDim = item.axisDim;
                        dataParams.axisIndex = item.axisIndex;
                        dataParams.axisType = item.axisType;
                        dataParams.axisId = item.axisId;
                        dataParams.axisValue = axisHelper.getAxisRawValue(axisModel.axis, axisValue);
                        dataParams.axisValueLabel = valueLabel;
 
                        if (dataParams) {
                            singleParamsList.push(dataParams);
                            seriesDefaultHTML.push(series.formatTooltip(dataIndex, true));
                        }
                    });
 
                    // Default tooltip content
                    // FIXME
                    // (1) shold be the first data which has name?
                    // (2) themeRiver, firstDataIndex is array, and first line is unnecessary.
                    var firstLine = valueLabel;
                    singleDefaultHTML.push(
                        (firstLine ? formatUtil.encodeHTML(firstLine) + '<br />' : '')
                        + seriesDefaultHTML.join('<br />')
                    );
                });
            }, this);
 
            // In most case, the second axis is shown upper than the first one.
            singleDefaultHTML.reverse();
            singleDefaultHTML = singleDefaultHTML.join('<br /><br />');
 
            var positionExpr = e.position;
            this._showOrMove(singleTooltipModel, function () {
                if (this._updateContentNotChangedOnAxis(dataByCoordSys)) {
                    this._updatePosition(
                        singleTooltipModel,
                        positionExpr,
                        point[0], point[1],
                        this._tooltipContent,
                        singleParamsList
                    );
                }
                else {
                    this._showTooltipContent(
                        singleTooltipModel, singleDefaultHTML, singleParamsList, Math.random(),
                        point[0], point[1], positionExpr
                    );
                }
            });
 
            // Do not trigger events here, because this branch only be entered
            // from dispatchAction.
        },
 
        _showSeriesItemTooltip: function (e, el, dispatchAction) {
            var ecModel = this._ecModel;
            // Use dataModel in element if possible
            // Used when mouseover on a element like markPoint or edge
            // In which case, the data is not main data in series.
            var seriesIndex = el.seriesIndex;
            var seriesModel = ecModel.getSeriesByIndex(seriesIndex);
 
            // For example, graph link.
            var dataModel = el.dataModel || seriesModel;
            var dataIndex = el.dataIndex;
            var dataType = el.dataType;
            var data = dataModel.getData();
 
            var tooltipModel = buildTooltipModel([
                data.getItemModel(dataIndex),
                dataModel,
                seriesModel && (seriesModel.coordinateSystem || {}).model,
                this._tooltipModel
            ]);
 
            var tooltipTrigger = tooltipModel.get('trigger');
            if (tooltipTrigger != null && tooltipTrigger !== 'item') {
                return;
            }
 
            var params = dataModel.getDataParams(dataIndex, dataType);
            var defaultHtml = dataModel.formatTooltip(dataIndex, false, dataType);
            var asyncTicket = 'item_' + dataModel.name + '_' + dataIndex;
 
            this._showOrMove(tooltipModel, function () {
                this._showTooltipContent(
                    tooltipModel, defaultHtml, params, asyncTicket,
                    e.offsetX, e.offsetY, e.position, e.target
                );
            });
 
            // FIXME
            // duplicated showtip if manuallyShowTip is called from dispatchAction.
            dispatchAction({
                type: 'showTip',
                dataIndexInside: dataIndex,
                dataIndex: data.getRawIndex(dataIndex),
                seriesIndex: seriesIndex,
                from: this.uid
            });
        },
 
        _showComponentItemTooltip: function (e, el, dispatchAction) {
            var tooltipOpt = el.tooltip;
            if (typeof tooltipOpt === 'string') {
                var content = tooltipOpt;
                tooltipOpt = {
                    content: content,
                    // Fixed formatter
                    formatter: content
                };
            }
            var subTooltipModel = new Model(tooltipOpt, this._tooltipModel, this._ecModel);
            var defaultHtml = subTooltipModel.get('content');
            var asyncTicket = Math.random();
 
            // Do not check whether `trigger` is 'none' here, because `trigger`
            // only works on cooridinate system. In fact, we have not found case
            // that requires setting `trigger` nothing on component yet.
 
            this._showOrMove(subTooltipModel, function () {
                this._showTooltipContent(
                    subTooltipModel, defaultHtml, subTooltipModel.get('formatterParams') || {},
                    asyncTicket, e.offsetX, e.offsetY, e.position, el
                );
            });
 
            // If not dispatch showTip, tip may be hide triggered by axis.
            dispatchAction({
                type: 'showTip',
                from: this.uid
            });
        },
 
        _showTooltipContent: function (
            tooltipModel, defaultHtml, params, asyncTicket, x, y, positionExpr, el
        ) {
            // Reset ticket
            this._ticket = '';
 
            if (!tooltipModel.get('showContent') || !tooltipModel.get('show')) {
                return;
            }
 
            var tooltipContent = this._tooltipContent;
 
            var formatter = tooltipModel.get('formatter');
            positionExpr = positionExpr || tooltipModel.get('position');
            var html = defaultHtml;
 
            if (formatter && typeof formatter === 'string') {
                html = formatUtil.formatTpl(formatter, params, true);
            }
            else if (typeof formatter === 'function') {
                var callback = bind(function (cbTicket, html) {
                    if (cbTicket === this._ticket) {
                        tooltipContent.setContent(html);
                        this._updatePosition(
                            tooltipModel, positionExpr, x, y, tooltipContent, params, el
                        );
                    }
                }, this);
                this._ticket = asyncTicket;
                html = formatter(params, asyncTicket, callback);
            }
 
            tooltipContent.setContent(html);
            tooltipContent.show(tooltipModel);
 
            this._updatePosition(
                tooltipModel, positionExpr, x, y, tooltipContent, params, el
            );
        },
 
        /**
         * @param  {string|Function|Array.<number>} positionExpr
         * @param  {number} x Mouse x
         * @param  {number} y Mouse y
         * @param  {boolean} confine Whether confine tooltip content in view rect.
         * @param  {Object|<Array.<Object>} params
         * @param  {module:zrender/Element} el target element
         * @param  {module:echarts/ExtensionAPI} api
         * @return {Array.<number>}
         */
        _updatePosition: function (tooltipModel, positionExpr, x, y, content, params, el) {
            var viewWidth = this._api.getWidth();
            var viewHeight = this._api.getHeight();
            positionExpr = positionExpr || tooltipModel.get('position');
 
            var contentSize = content.getSize();
            var align = tooltipModel.get('align');
            var vAlign = tooltipModel.get('verticalAlign');
            var rect = el && el.getBoundingRect().clone();
            el && rect.applyTransform(el.transform);
 
            if (typeof positionExpr === 'function') {
                // Callback of position can be an array or a string specify the position
                positionExpr = positionExpr([x, y], params, content.el, rect, {
                    viewSize: [viewWidth, viewHeight],
                    contentSize: contentSize.slice()
                });
            }
 
            if (zrUtil.isArray(positionExpr)) {
                x = parsePercent(positionExpr[0], viewWidth);
                y = parsePercent(positionExpr[1], viewHeight);
            }
            else if (zrUtil.isObject(positionExpr)) {
                positionExpr.width = contentSize[0];
                positionExpr.height = contentSize[1];
                var layoutRect = layoutUtil.getLayoutRect(
                    positionExpr, {width: viewWidth, height: viewHeight}
                );
                x = layoutRect.x;
                y = layoutRect.y;
                align = null;
                // When positionExpr is left/top/right/bottom,
                // align and verticalAlign will not work.
                vAlign = null;
            }
            // Specify tooltip position by string 'top' 'bottom' 'left' 'right' around graphic element
            else if (typeof positionExpr === 'string' && el) {
                var pos = calcTooltipPosition(
                    positionExpr, rect, contentSize
                );
                x = pos[0];
                y = pos[1];
            }
            else {
                var pos = refixTooltipPosition(
                    x, y, content.el, viewWidth, viewHeight, align ? null : 20, vAlign ? null : 20
                );
                x = pos[0];
                y = pos[1];
            }
 
            align && (x -= isCenterAlign(align) ? contentSize[0] / 2 : align === 'right' ? contentSize[0] : 0);
            vAlign && (y -= isCenterAlign(vAlign) ? contentSize[1] / 2 : vAlign === 'bottom' ? contentSize[1] : 0);
 
            if (tooltipModel.get('confine')) {
                var pos = confineTooltipPosition(
                    x, y, content.el, viewWidth, viewHeight
                );
                x = pos[0];
                y = pos[1];
            }
 
            content.moveTo(x, y);
        },
 
        // FIXME
        // Should we remove this but leave this to user?
        _updateContentNotChangedOnAxis: function (dataByCoordSys) {
            var lastCoordSys = this._lastDataByCoordSys;
            var contentNotChanged = !!lastCoordSys
                && lastCoordSys.length === dataByCoordSys.length;
 
            each(lastCoordSys, function (lastItemCoordSys, indexCoordSys) {
                var lastDataByAxis = lastItemCoordSys.dataByAxis || {};
                var thisItemCoordSys = dataByCoordSys[indexCoordSys] || {};
                var thisDataByAxis = thisItemCoordSys.dataByAxis || [];
                contentNotChanged &= lastDataByAxis.length === thisDataByAxis.length;
 
                each(lastDataByAxis, function (lastItem, indexAxis) {
                    var thisItem = thisDataByAxis[indexAxis] || {};
                    var lastIndices = lastItem.seriesDataIndices || [];
                    var newIndices = thisItem.seriesDataIndices || [];
 
                    contentNotChanged &=
                        lastItem.value === thisItem.value
                        && lastItem.axisType === thisItem.axisType
                        && lastItem.axisId === thisItem.axisId
                        && lastIndices.length === newIndices.length;
 
                    each(lastIndices, function (lastIdxItem, j) {
                        var newIdxItem = newIndices[j];
                        contentNotChanged &=
                            lastIdxItem.seriesIndex === newIdxItem.seriesIndex
                            && lastIdxItem.dataIndex === newIdxItem.dataIndex;
                    });
                });
            });
 
            this._lastDataByCoordSys = dataByCoordSys;
 
            return !!contentNotChanged;
        },
 
        _hide: function (dispatchAction) {
            // Do not directly hideLater here, because this behavior may be prevented
            // in dispatchAction when showTip is dispatched.
 
            // FIXME
            // duplicated hideTip if manuallyHideTip is called from dispatchAction.
            this._lastDataByCoordSys = null;
            dispatchAction({
                type: 'hideTip',
                from: this.uid
            });
        },
 
        dispose: function (ecModel, api) {
            if (env.node) {
                return;
            }
            this._tooltipContent.hide();
            globalListener.unregister('itemTooltip', api);
        }
    });
 
 
    /**
     * @param {Array.<Object|module:echarts/model/Model>} modelCascade
     * From top to bottom. (the last one should be globalTooltipModel);
     */
    function buildTooltipModel(modelCascade) {
        var resultModel = modelCascade.pop();
        while (modelCascade.length) {
            var tooltipOpt = modelCascade.pop();
            if (tooltipOpt) {
                if (tooltipOpt instanceof Model) {
                    tooltipOpt = tooltipOpt.get('tooltip', true);
                }
                // In each data item tooltip can be simply write:
                // {
                //  value: 10,
                //  tooltip: 'Something you need to know'
                // }
                if (typeof tooltipOpt === 'string') {
                    tooltipOpt = {formatter: tooltipOpt};
                }
                resultModel = new Model(tooltipOpt, resultModel, resultModel.ecModel);
            }
        }
        return resultModel;
    }
 
    function makeDispatchAction(payload, api) {
        return payload.dispatchAction || zrUtil.bind(api.dispatchAction, api);
    }
 
    function refixTooltipPosition(x, y, el, viewWidth, viewHeight, gapH, gapV) {
        var width = el.clientWidth;
        var height = el.clientHeight;
 
        if (gapH != null) {
            if (x + width + gapH > viewWidth) {
                x -= width + gapH;
            }
            else {
                x += gapH;
            }
        }
        if (gapV != null) {
            if (y + height + gapV > viewHeight) {
                y -= height + gapV;
            }
            else {
                y += gapV;
            }
        }
        return [x, y];
    }
 
    function confineTooltipPosition(x, y, el, viewWidth, viewHeight) {
        var width = el.clientWidth;
        var height = el.clientHeight;
 
        x = Math.min(x + width, viewWidth) - width;
        y = Math.min(y + height, viewHeight) - height;
        x = Math.max(x, 0);
        y = Math.max(y, 0);
 
        return [x, y];
    }
 
    function calcTooltipPosition(position, rect, contentSize) {
        var domWidth = contentSize[0];
        var domHeight = contentSize[1];
        var gap = 5;
        var x = 0;
        var y = 0;
        var rectWidth = rect.width;
        var rectHeight = rect.height;
        switch (position) {
            case 'inside':
                x = rect.x + rectWidth / 2 - domWidth / 2;
                y = rect.y + rectHeight / 2 - domHeight / 2;
                break;
            case 'top':
                x = rect.x + rectWidth / 2 - domWidth / 2;
                y = rect.y - domHeight - gap;
                break;
            case 'bottom':
                x = rect.x + rectWidth / 2 - domWidth / 2;
                y = rect.y + rectHeight + gap;
                break;
            case 'left':
                x = rect.x - domWidth - gap;
                y = rect.y + rectHeight / 2 - domHeight / 2;
                break;
            case 'right':
                x = rect.x + rectWidth + gap;
                y = rect.y + rectHeight / 2 - domHeight / 2;
        }
        return [x, y];
    }
 
    function isCenterAlign(align) {
        return align === 'center' || align === 'middle';
    }
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/

Statements: 11.63% (104 / 894)      Branches: 0% (0 / 532)      Functions: 0% (0 / 151)      Lines: 11.63% (104 / 894)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/
File Statements Branches Functions Lines
ContinuousModel.js 9.09% (8 / 88) 0% (0 / 63) 0% (0 / 15) 9.09% (8 / 88)
ContinuousView.js 7.94% (22 / 277) 0% (0 / 136) 0% (0 / 38) 7.94% (22 / 277)
PiecewiseModel.js 6.04% (11 / 182) 0% (0 / 114) 0% (0 / 33) 6.04% (11 / 182)
PiecewiseView.js 12.99% (10 / 77) 0% (0 / 34) 0% (0 / 11) 12.99% (10 / 77)
VisualMapModel.js 16.18% (22 / 136) 0% (0 / 105) 0% (0 / 26) 16.18% (22 / 136)
VisualMapView.js 20% (9 / 45) 0% (0 / 20) 0% (0 / 8) 20% (9 / 45)
helper.js 16% (4 / 25) 0% (0 / 16) 0% (0 / 3) 16% (4 / 25)
preprocessor.js 18.18% (4 / 22) 0% (0 / 29) 0% (0 / 4) 18.18% (4 / 22)
typeDefaulter.js 50% (1 / 2) 0% (0 / 7) 0% (0 / 1) 50% (1 / 2)
visualEncoding.js 28.57% (10 / 35) 0% (0 / 8) 0% (0 / 10) 28.57% (10 / 35)
visualMapAction.js 60% (3 / 5) 100% (0 / 0) 0% (0 / 2) 60% (3 / 5)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/ContinuousModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/ContinuousModel.js

Statements: 9.09% (8 / 88)      Branches: 0% (0 / 63)      Functions: 0% (0 / 15)      Lines: 9.09% (8 / 88)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250          1 1 1     1   1                                                                                                                                                                                                                                                                                                                                   1                                                                                                 1                                             1      
/**
 * @file Data zoom model
 */
 
 
    var VisualMapModel = require('./VisualMapModel');
    var zrUtil = require('zrender/lib/core/util');
    var numberUtil = require('../../util/number');
 
    // Constant
    var DEFAULT_BAR_BOUND = [20, 140];
 
    var ContinuousModel = VisualMapModel.extend({
 
        type: 'visualMap.continuous',
 
        /**
         * @protected
         */
        defaultOption: {
            align: 'auto',          // 'auto', 'left', 'right', 'top', 'bottom'
            calculable: false,      // This prop effect default component type determine,
                                    // See echarts/component/visualMap/typeDefaulter.
            range: null,            // selected range. In default case `range` is [min, max]
                                    // and can auto change along with modification of min max,
                                    // util use specifid a range.
            realtime: true,         // Whether realtime update.
            itemHeight: null,       // The length of the range control edge.
            itemWidth: null,        // The length of the other side.
            hoverLink: true,        // Enable hover highlight.
            hoverLinkDataSize: null,// The size of hovered data.
            hoverLinkOnHandle: true // Whether trigger hoverLink when hover handle.
        },
 
        /**
         * @override
         */
        optionUpdated: function (newOption, isInit) {
            ContinuousModel.superApply(this, 'optionUpdated', arguments);
 
            this.resetTargetSeries();
            this.resetExtent();
 
            this.resetVisual(function (mappingOption) {
                mappingOption.mappingMethod = 'linear';
                mappingOption.dataExtent = this.getExtent();
            });
 
            this._resetRange();
        },
 
        /**
         * @protected
         * @override
         */
        resetItemSize: function () {
            ContinuousModel.superApply(this, 'resetItemSize', arguments);
 
            var itemSize = this.itemSize;
 
            this._orient === 'horizontal' && itemSize.reverse();
 
            (itemSize[0] == null || isNaN(itemSize[0])) && (itemSize[0] = DEFAULT_BAR_BOUND[0]);
            (itemSize[1] == null || isNaN(itemSize[1])) && (itemSize[1] = DEFAULT_BAR_BOUND[1]);
        },
 
        /**
         * @private
         */
        _resetRange: function () {
            var dataExtent = this.getExtent();
            var range = this.option.range;
 
            if (!range || range.auto) {
                // `range` should always be array (so we dont use other
                // value like 'auto') for user-friend. (consider getOption).
                dataExtent.auto = 1;
                this.option.range = dataExtent;
            }
            else if (zrUtil.isArray(range)) {
                if (range[0] > range[1]) {
                    range.reverse();
                }
                range[0] = Math.max(range[0], dataExtent[0]);
                range[1] = Math.min(range[1], dataExtent[1]);
            }
        },
 
        /**
         * @protected
         * @override
         */
        completeVisualOption: function () {
            VisualMapModel.prototype.completeVisualOption.apply(this, arguments);
 
            zrUtil.each(this.stateList, function (state) {
                var symbolSize = this.option.controller[state].symbolSize;
                if (symbolSize && symbolSize[0] !== symbolSize[1]) {
                    symbolSize[0] = 0; // For good looking.
                }
            }, this);
        },
 
        /**
         * @override
         */
        setSelected: function (selected) {
            this.option.range = selected.slice();
            this._resetRange();
        },
 
        /**
         * @public
         */
        getSelected: function () {
            var dataExtent = this.getExtent();
 
            var dataInterval = numberUtil.asc(
                (this.get('range') || []).slice()
            );
 
            // Clamp
            dataInterval[0] > dataExtent[1] && (dataInterval[0] = dataExtent[1]);
            dataInterval[1] > dataExtent[1] && (dataInterval[1] = dataExtent[1]);
            dataInterval[0] < dataExtent[0] && (dataInterval[0] = dataExtent[0]);
            dataInterval[1] < dataExtent[0] && (dataInterval[1] = dataExtent[0]);
 
            return dataInterval;
        },
 
        /**
         * @override
         */
        getValueState: function (value) {
            var range = this.option.range;
            var dataExtent = this.getExtent();
 
            // When range[0] === dataExtent[0], any value larger than dataExtent[0] maps to 'inRange'.
            // range[1] is processed likewise.
            return (
                (range[0] <= dataExtent[0] || range[0] <= value)
                && (range[1] >= dataExtent[1] || value <= range[1])
            ) ? 'inRange' : 'outOfRange';
        },
 
        /**
         * @params {Array.<number>} range target value: range[0] <= value && value <= range[1]
         * @return {Array.<Object>} [{seriesId, dataIndices: <Array.<number>>}, ...]
         */
        findTargetDataIndices: function (range) {
            var result = [];
 
            this.eachTargetSeries(function (seriesModel) {
                var dataIndices = [];
                var data = seriesModel.getData();
 
                data.each(this.getDataDimension(data), function (value, dataIndex) {
                    range[0] <= value && value <= range[1] && dataIndices.push(dataIndex);
                }, true, this);
 
                result.push({seriesId: seriesModel.id, dataIndex: dataIndices});
            }, this);
 
            return result;
        },
 
        /**
         * @implement
         */
        getVisualMeta: function (getColorVisual) {
            var oVals = getColorStopValues(this, 'outOfRange', this.getExtent());
            var iVals = getColorStopValues(this, 'inRange', this.option.range.slice());
            var stops = [];
 
            function setStop(value, valueState) {
                stops.push({
                    value: value,
                    color: getColorVisual(value, valueState)
                });
            }
 
            // Format to: outOfRange -- inRange -- outOfRange.
            var iIdx = 0;
            var oIdx = 0;
            var iLen = iVals.length;
            var oLen = oVals.length;
 
            for (; oIdx < oLen && (!iVals.length || oVals[oIdx] <= iVals[0]); oIdx++) {
                // If oVal[oIdx] === iVals[iIdx], oVal[oIdx] should be ignored.
                if (oVals[oIdx] < iVals[iIdx]) {
                    setStop(oVals[oIdx], 'outOfRange');
                }
            }
            for (var first = 1; iIdx < iLen; iIdx++, first = 0) {
                // If range is full, value beyond min, max will be clamped.
                // make a singularity
                first && stops.length && setStop(iVals[iIdx], 'outOfRange');
                setStop(iVals[iIdx], 'inRange');
            }
            for (var first = 1; oIdx < oLen; oIdx++) {
                if (!iVals.length || iVals[iVals.length - 1] < oVals[oIdx]) {
                    // make a singularity
                    if (first) {
                        stops.length && setStop(stops[stops.length - 1].value, 'outOfRange');
                        first = 0;
                    }
                    setStop(oVals[oIdx], 'outOfRange');
                }
            }
 
            var stopsLen = stops.length;
 
            return {
                stops: stops,
                outerColors: [
                    stopsLen ? stops[0].color : 'transparent',
                    stopsLen ? stops[stopsLen - 1].color : 'transparent'
                ]
            };
        }
 
    });
 
    function getColorStopValues(visualMapModel, valueState, dataExtent) {
        if (dataExtent[0] === dataExtent[1]) {
            return dataExtent.slice();
        }
 
        // When using colorHue mapping, it is not linear color any more.
        // Moreover, canvas gradient seems not to be accurate linear.
        // FIXME
        // Should be arbitrary value 100? or based on pixel size?
        var count = 200;
        var step = (dataExtent[1] - dataExtent[0]) / count;
 
        var value = dataExtent[0];
        var stopValues = [];
        for (var i = 0; i <= count && value < dataExtent[1]; i++) {
            stopValues.push(value);
            value += step;
        }
        stopValues.push(dataExtent[1]);
 
        return stopValues;
    }
 
    module.exports = ContinuousModel;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/ContinuousView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/ContinuousView.js

Statements: 7.94% (22 / 277)      Branches: 0% (0 / 136)      Functions: 0% (0 / 38)      Lines: 7.94% (22 / 277)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844    1 1 1 1 1 1 1 1 1   1 1 1 1     1 1                   1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           1                           1           1                       1                 1       1      
 
 
    var VisualMapView = require('./VisualMapView');
    var graphic = require('../../util/graphic');
    var zrUtil = require('zrender/lib/core/util');
    var numberUtil = require('../../util/number');
    var sliderMove = require('../helper/sliderMove');
    var LinearGradient = require('zrender/lib/graphic/LinearGradient');
    var helper = require('./helper');
    var modelUtil = require('../../util/model');
    var eventTool = require('zrender/lib/core/event');
 
    var linearMap = numberUtil.linearMap;
    var each = zrUtil.each;
    var mathMin = Math.min;
    var mathMax = Math.max;
 
    // Arbitrary value
    var HOVER_LINK_SIZE = 12;
    var HOVER_LINK_OUT = 6;
 
    // Notice:
    // Any "interval" should be by the order of [low, high].
    // "handle0" (handleIndex === 0) maps to
    // low data value: this._dataInterval[0] and has low coord.
    // "handle1" (handleIndex === 1) maps to
    // high data value: this._dataInterval[1] and has high coord.
    // The logic of transform is implemented in this._createBarGroup.
 
    var ContinuousView = VisualMapView.extend({
 
        type: 'visualMap.continuous',
 
        /**
         * @override
         */
        init: function () {
 
            ContinuousView.superApply(this, 'init', arguments);
 
            /**
             * @private
             */
            this._shapes = {};
 
            /**
             * @private
             */
            this._dataInterval = [];
 
            /**
             * @private
             */
            this._handleEnds = [];
 
            /**
             * @private
             */
            this._orient;
 
            /**
             * @private
             */
            this._useHandle;
 
            /**
             * @private
             */
            this._hoverLinkDataIndices = [];
 
            /**
             * @private
             */
            this._dragging;
 
            /**
             * @private
             */
            this._hovering;
        },
 
        /**
         * @protected
         * @override
         */
        doRender: function (visualMapModel, ecModel, api, payload) {
            if (!payload || payload.type !== 'selectDataRange' || payload.from !== this.uid) {
                this._buildView();
            }
        },
 
        /**
         * @private
         */
        _buildView: function () {
            this.group.removeAll();
 
            var visualMapModel = this.visualMapModel;
            var thisGroup = this.group;
 
            this._orient = visualMapModel.get('orient');
            this._useHandle = visualMapModel.get('calculable');
 
            this._resetInterval();
 
            this._renderBar(thisGroup);
 
            var dataRangeText = visualMapModel.get('text');
            this._renderEndsText(thisGroup, dataRangeText, 0);
            this._renderEndsText(thisGroup, dataRangeText, 1);
 
            // Do this for background size calculation.
            this._updateView(true);
 
            // After updating view, inner shapes is built completely,
            // and then background can be rendered.
            this.renderBackground(thisGroup);
 
            // Real update view
            this._updateView();
 
            this._enableHoverLinkToSeries();
            this._enableHoverLinkFromSeries();
 
            this.positionGroup(thisGroup);
        },
 
        /**
         * @private
         */
        _renderEndsText: function (group, dataRangeText, endsIndex) {
            if (!dataRangeText) {
                return;
            }
 
            // Compatible with ec2, text[0] map to high value, text[1] map low value.
            var text = dataRangeText[1 - endsIndex];
            text = text != null ? text + '' : '';
 
            var visualMapModel = this.visualMapModel;
            var textGap = visualMapModel.get('textGap');
            var itemSize = visualMapModel.itemSize;
 
            var barGroup = this._shapes.barGroup;
            var position = this._applyTransform(
                [
                    itemSize[0] / 2,
                    endsIndex === 0 ? -textGap : itemSize[1] + textGap
                ],
                barGroup
            );
            var align = this._applyTransform(
                endsIndex === 0 ? 'bottom' : 'top',
                barGroup
            );
            var orient = this._orient;
            var textStyleModel = this.visualMapModel.textStyleModel;
 
            this.group.add(new graphic.Text({
                style: {
                    x: position[0],
                    y: position[1],
                    textVerticalAlign: orient === 'horizontal' ? 'middle' : align,
                    textAlign: orient === 'horizontal' ? align : 'center',
                    text: text,
                    textFont: textStyleModel.getFont(),
                    fill: textStyleModel.getTextColor()
                }
            }));
        },
 
        /**
         * @private
         */
        _renderBar: function (targetGroup) {
            var visualMapModel = this.visualMapModel;
            var shapes = this._shapes;
            var itemSize = visualMapModel.itemSize;
            var orient = this._orient;
            var useHandle = this._useHandle;
            var itemAlign = helper.getItemAlign(visualMapModel, this.api, itemSize);
            var barGroup = shapes.barGroup = this._createBarGroup(itemAlign);
 
            // Bar
            barGroup.add(shapes.outOfRange = createPolygon());
            barGroup.add(shapes.inRange = createPolygon(
                null,
                useHandle ? 'move' : null,
                zrUtil.bind(this._dragHandle, this, 'all', false),
                zrUtil.bind(this._dragHandle, this, 'all', true)
            ));
 
            var textRect = visualMapModel.textStyleModel.getTextRect('国');
            var textSize = mathMax(textRect.width, textRect.height);
 
            // Handle
            if (useHandle) {
                shapes.handleThumbs = [];
                shapes.handleLabels = [];
                shapes.handleLabelPoints = [];
 
                this._createHandle(barGroup, 0, itemSize, textSize, orient, itemAlign);
                this._createHandle(barGroup, 1, itemSize, textSize, orient, itemAlign);
            }
 
            this._createIndicator(barGroup, itemSize, textSize, orient);
 
            targetGroup.add(barGroup);
        },
 
        /**
         * @private
         */
        _createHandle: function (barGroup, handleIndex, itemSize, textSize, orient) {
            var onDrift = zrUtil.bind(this._dragHandle, this, handleIndex, false);
            var onDragEnd = zrUtil.bind(this._dragHandle, this, handleIndex, true);
            var handleThumb = createPolygon(
                createHandlePoints(handleIndex, textSize),
                'move',
                onDrift,
                onDragEnd
            );
            handleThumb.position[0] = itemSize[0];
            barGroup.add(handleThumb);
 
            // Text is always horizontal layout but should not be effected by
            // transform (orient/inverse). So label is built separately but not
            // use zrender/graphic/helper/RectText, and is located based on view
            // group (according to handleLabelPoint) but not barGroup.
            var textStyleModel = this.visualMapModel.textStyleModel;
            var handleLabel = new graphic.Text({
                draggable: true,
                drift: onDrift,
                onmousemove: function (e) {
                    // Fot mobile devicem, prevent screen slider on the button.
                    eventTool.stop(e.event);
                },
                ondragend: onDragEnd,
                style: {
                    x: 0, y: 0, text: '',
                    textFont: textStyleModel.getFont(),
                    fill: textStyleModel.getTextColor()
                }
            });
            this.group.add(handleLabel);
 
            var handleLabelPoint = [
                orient === 'horizontal'
                    ? textSize / 2
                    : textSize * 1.5,
                orient === 'horizontal'
                    ? (handleIndex === 0 ? -(textSize * 1.5) : (textSize * 1.5))
                    : (handleIndex === 0 ? -textSize / 2 : textSize / 2)
            ];
 
            var shapes = this._shapes;
            shapes.handleThumbs[handleIndex] = handleThumb;
            shapes.handleLabelPoints[handleIndex] = handleLabelPoint;
            shapes.handleLabels[handleIndex] = handleLabel;
        },
 
        /**
         * @private
         */
        _createIndicator: function (barGroup, itemSize, textSize, orient) {
            var indicator = createPolygon([[0, 0]], 'move');
            indicator.position[0] = itemSize[0];
            indicator.attr({invisible: true, silent: true});
            barGroup.add(indicator);
 
            var textStyleModel = this.visualMapModel.textStyleModel;
            var indicatorLabel = new graphic.Text({
                silent: true,
                invisible: true,
                style: {
                    x: 0, y: 0, text: '',
                    textFont: textStyleModel.getFont(),
                    fill: textStyleModel.getTextColor()
                }
            });
            this.group.add(indicatorLabel);
 
            var indicatorLabelPoint = [
                orient === 'horizontal' ? textSize / 2 : HOVER_LINK_OUT + 3,
                0
            ];
 
            var shapes = this._shapes;
            shapes.indicator = indicator;
            shapes.indicatorLabel = indicatorLabel;
            shapes.indicatorLabelPoint = indicatorLabelPoint;
        },
 
        /**
         * @private
         */
        _dragHandle: function (handleIndex, isEnd, dx, dy) {
            if (!this._useHandle) {
                return;
            }
 
            this._dragging = !isEnd;
 
            if (!isEnd) {
                // Transform dx, dy to bar coordination.
                var vertex = this._applyTransform([dx, dy], this._shapes.barGroup, true);
                this._updateInterval(handleIndex, vertex[1]);
 
                // Considering realtime, update view should be executed
                // before dispatch action.
                this._updateView();
            }
 
            // dragEnd do not dispatch action when realtime.
            if (isEnd === !this.visualMapModel.get('realtime')) { // jshint ignore:line
                this.api.dispatchAction({
                    type: 'selectDataRange',
                    from: this.uid,
                    visualMapId: this.visualMapModel.id,
                    selected: this._dataInterval.slice()
                });
            }
 
            if (isEnd) {
                !this._hovering && this._clearHoverLinkToSeries();
            }
            else if (useHoverLinkOnHandle(this.visualMapModel)) {
                this._doHoverLinkToSeries(this._handleEnds[handleIndex], false);
            }
        },
 
        /**
         * @private
         */
        _resetInterval: function () {
            var visualMapModel = this.visualMapModel;
 
            var dataInterval = this._dataInterval = visualMapModel.getSelected();
            var dataExtent = visualMapModel.getExtent();
            var sizeExtent = [0, visualMapModel.itemSize[1]];
 
            this._handleEnds = [
                linearMap(dataInterval[0], dataExtent, sizeExtent, true),
                linearMap(dataInterval[1], dataExtent, sizeExtent, true)
            ];
        },
 
        /**
         * @private
         * @param {(number|string)} handleIndex 0 or 1 or 'all'
         * @param {number} dx
         * @param {number} dy
         */
        _updateInterval: function (handleIndex, delta) {
            delta = delta || 0;
            var visualMapModel = this.visualMapModel;
            var handleEnds = this._handleEnds;
 
            sliderMove(
                delta,
                handleEnds,
                [0, visualMapModel.itemSize[1]],
                handleIndex === 'all' ? 'rigid' : 'push',
                handleIndex
            );
            var dataExtent = visualMapModel.getExtent();
            var sizeExtent = [0, visualMapModel.itemSize[1]];
            // Update data interval.
            this._dataInterval = [
                linearMap(handleEnds[0], sizeExtent, dataExtent, true),
                linearMap(handleEnds[1], sizeExtent, dataExtent, true)
            ];
        },
 
        /**
         * @private
         */
        _updateView: function (forSketch) {
            var visualMapModel = this.visualMapModel;
            var dataExtent = visualMapModel.getExtent();
            var shapes = this._shapes;
 
            var outOfRangeHandleEnds = [0, visualMapModel.itemSize[1]];
            var inRangeHandleEnds = forSketch ? outOfRangeHandleEnds : this._handleEnds;
 
            var visualInRange = this._createBarVisual(
                this._dataInterval, dataExtent, inRangeHandleEnds, 'inRange'
            );
            var visualOutOfRange = this._createBarVisual(
                dataExtent, dataExtent, outOfRangeHandleEnds, 'outOfRange'
            );
 
            shapes.inRange
                .setStyle({
                    fill: visualInRange.barColor,
                    opacity: visualInRange.opacity
                })
                .setShape('points', visualInRange.barPoints);
            shapes.outOfRange
                .setStyle({
                    fill: visualOutOfRange.barColor,
                    opacity: visualOutOfRange.opacity
                })
                .setShape('points', visualOutOfRange.barPoints);
 
            this._updateHandle(inRangeHandleEnds, visualInRange);
        },
 
        /**
         * @private
         */
        _createBarVisual: function (dataInterval, dataExtent, handleEnds, forceState) {
            var opts = {
                forceState: forceState,
                convertOpacityToAlpha: true
            };
            var colorStops = this._makeColorGradient(dataInterval, opts);
 
            var symbolSizes = [
                this.getControllerVisual(dataInterval[0], 'symbolSize', opts),
                this.getControllerVisual(dataInterval[1], 'symbolSize', opts)
            ];
            var barPoints = this._createBarPoints(handleEnds, symbolSizes);
 
            return {
                barColor: new LinearGradient(0, 0, 0, 1, colorStops),
                barPoints: barPoints,
                handlesColor: [
                    colorStops[0].color,
                    colorStops[colorStops.length - 1].color
                ]
            };
        },
 
        /**
         * @private
         */
        _makeColorGradient: function (dataInterval, opts) {
            // Considering colorHue, which is not linear, so we have to sample
            // to calculate gradient color stops, but not only caculate head
            // and tail.
            var sampleNumber = 100; // Arbitrary value.
            var colorStops = [];
            var step = (dataInterval[1] - dataInterval[0]) / sampleNumber;
 
            colorStops.push({
                color: this.getControllerVisual(dataInterval[0], 'color', opts),
                offset: 0
            });
 
            for (var i = 1; i < sampleNumber; i++) {
                var currValue = dataInterval[0] + step * i;
                if (currValue > dataInterval[1]) {
                    break;
                }
                colorStops.push({
                    color: this.getControllerVisual(currValue, 'color', opts),
                    offset: i / sampleNumber
                });
            }
 
            colorStops.push({
                color: this.getControllerVisual(dataInterval[1], 'color', opts),
                offset: 1
            });
 
            return colorStops;
        },
 
        /**
         * @private
         */
        _createBarPoints: function (handleEnds, symbolSizes) {
            var itemSize = this.visualMapModel.itemSize;
 
            return [
                [itemSize[0] - symbolSizes[0], handleEnds[0]],
                [itemSize[0], handleEnds[0]],
                [itemSize[0], handleEnds[1]],
                [itemSize[0] - symbolSizes[1], handleEnds[1]]
            ];
        },
 
        /**
         * @private
         */
        _createBarGroup: function (itemAlign) {
            var orient = this._orient;
            var inverse = this.visualMapModel.get('inverse');
 
            return new graphic.Group(
                (orient === 'horizontal' && !inverse)
                ? {scale: itemAlign === 'bottom' ? [1, 1] : [-1, 1], rotation: Math.PI / 2}
                : (orient === 'horizontal' && inverse)
                ? {scale: itemAlign === 'bottom' ? [-1, 1] : [1, 1], rotation: -Math.PI / 2}
                : (orient === 'vertical' && !inverse)
                ? {scale: itemAlign === 'left' ? [1, -1] : [-1, -1]}
                : {scale: itemAlign === 'left' ? [1, 1] : [-1, 1]}
            );
        },
 
        /**
         * @private
         */
        _updateHandle: function (handleEnds, visualInRange) {
            if (!this._useHandle) {
                return;
            }
 
            var shapes = this._shapes;
            var visualMapModel = this.visualMapModel;
            var handleThumbs = shapes.handleThumbs;
            var handleLabels = shapes.handleLabels;
 
            each([0, 1], function (handleIndex) {
                var handleThumb = handleThumbs[handleIndex];
                handleThumb.setStyle('fill', visualInRange.handlesColor[handleIndex]);
                handleThumb.position[1] = handleEnds[handleIndex];
 
                // Update handle label position.
                var textPoint = graphic.applyTransform(
                    shapes.handleLabelPoints[handleIndex],
                    graphic.getTransform(handleThumb, this.group)
                );
                handleLabels[handleIndex].setStyle({
                    x: textPoint[0],
                    y: textPoint[1],
                    text: visualMapModel.formatValueText(this._dataInterval[handleIndex]),
                    textVerticalAlign: 'middle',
                    textAlign: this._applyTransform(
                        this._orient === 'horizontal'
                            ? (handleIndex === 0 ? 'bottom' : 'top')
                            : 'left',
                        shapes.barGroup
                    )
                });
            }, this);
        },
 
        /**
         * @private
         * @param {number} cursorValue
         * @param {number} textValue
         * @param {string} [rangeSymbol]
         * @param {number} [halfHoverLinkSize]
         */
        _showIndicator: function (cursorValue, textValue, rangeSymbol, halfHoverLinkSize) {
            var visualMapModel = this.visualMapModel;
            var dataExtent = visualMapModel.getExtent();
            var itemSize = visualMapModel.itemSize;
            var sizeExtent = [0, itemSize[1]];
            var pos = linearMap(cursorValue, dataExtent, sizeExtent, true);
 
            var shapes = this._shapes;
            var indicator = shapes.indicator;
            if (!indicator) {
                return;
            }
 
            indicator.position[1] = pos;
            indicator.attr('invisible', false);
            indicator.setShape('points', createIndicatorPoints(
                !!rangeSymbol, halfHoverLinkSize, pos, itemSize[1]
            ));
 
            var opts = {convertOpacityToAlpha: true};
            var color = this.getControllerVisual(cursorValue, 'color', opts);
            indicator.setStyle('fill', color);
 
            // Update handle label position.
            var textPoint = graphic.applyTransform(
                shapes.indicatorLabelPoint,
                graphic.getTransform(indicator, this.group)
            );
 
            var indicatorLabel = shapes.indicatorLabel;
            indicatorLabel.attr('invisible', false);
            var align = this._applyTransform('left', shapes.barGroup);
            var orient = this._orient;
            indicatorLabel.setStyle({
                text: (rangeSymbol ? rangeSymbol : '') + visualMapModel.formatValueText(textValue),
                textVerticalAlign: orient === 'horizontal' ? align : 'middle',
                textAlign: orient === 'horizontal' ? 'center' : align,
                x: textPoint[0],
                y: textPoint[1]
            });
        },
 
        /**
         * @private
         */
        _enableHoverLinkToSeries: function () {
            var self = this;
            this._shapes.barGroup
 
                .on('mousemove', function (e) {
                    self._hovering = true;
 
                    if (!self._dragging) {
                        var itemSize = self.visualMapModel.itemSize;
                        var pos = self._applyTransform(
                            [e.offsetX, e.offsetY], self._shapes.barGroup, true, true
                        );
                        // For hover link show when hover handle, which might be
                        // below or upper than sizeExtent.
                        pos[1] = mathMin(mathMax(0, pos[1]), itemSize[1]);
 
                        self._doHoverLinkToSeries(
                            pos[1],
                            0 <= pos[0] && pos[0] <= itemSize[0]
                        );
                    }
                })
 
                .on('mouseout', function () {
                    // When mouse is out of handle, hoverLink still need
                    // to be displayed when realtime is set as false.
                    self._hovering = false;
                    !self._dragging && self._clearHoverLinkToSeries();
                });
        },
 
        /**
         * @private
         */
        _enableHoverLinkFromSeries: function () {
            var zr = this.api.getZr();
 
            if (this.visualMapModel.option.hoverLink) {
                zr.on('mouseover', this._hoverLinkFromSeriesMouseOver, this);
                zr.on('mouseout', this._hideIndicator, this);
            }
            else {
                this._clearHoverLinkFromSeries();
            }
        },
 
        /**
         * @private
         */
        _doHoverLinkToSeries: function (cursorPos, hoverOnBar) {
            var visualMapModel = this.visualMapModel;
            var itemSize = visualMapModel.itemSize;
 
            if (!visualMapModel.option.hoverLink) {
                return;
            }
 
            var sizeExtent = [0, itemSize[1]];
            var dataExtent = visualMapModel.getExtent();
 
            // For hover link show when hover handle, which might be below or upper than sizeExtent.
            cursorPos = mathMin(mathMax(sizeExtent[0], cursorPos), sizeExtent[1]);
 
            var halfHoverLinkSize = getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent);
            var hoverRange = [cursorPos - halfHoverLinkSize, cursorPos + halfHoverLinkSize];
            var cursorValue = linearMap(cursorPos, sizeExtent, dataExtent, true);
            var valueRange = [
                linearMap(hoverRange[0], sizeExtent, dataExtent, true),
                linearMap(hoverRange[1], sizeExtent, dataExtent, true)
            ];
            // Consider data range is out of visualMap range, see test/visualMap-continuous.html,
            // where china and india has very large population.
            hoverRange[0] < sizeExtent[0] && (valueRange[0] = -Infinity);
            hoverRange[1] > sizeExtent[1] && (valueRange[1] = Infinity);
 
            // Do not show indicator when mouse is over handle,
            // otherwise labels overlap, especially when dragging.
            if (hoverOnBar) {
                if (valueRange[0] === -Infinity) {
                    this._showIndicator(cursorValue, valueRange[1], '< ', halfHoverLinkSize);
                }
                else if (valueRange[1] === Infinity) {
                    this._showIndicator(cursorValue, valueRange[0], '> ', halfHoverLinkSize);
                }
                else {
                    this._showIndicator(cursorValue, cursorValue, '≈ ', halfHoverLinkSize);
                }
            }
 
            // When realtime is set as false, handles, which are in barGroup,
            // also trigger hoverLink, which help user to realize where they
            // focus on when dragging. (see test/heatmap-large.html)
            // When realtime is set as true, highlight will not show when hover
            // handle, because the label on handle, which displays a exact value
            // but not range, might mislead users.
            var oldBatch = this._hoverLinkDataIndices;
            var newBatch = [];
            if (hoverOnBar || useHoverLinkOnHandle(visualMapModel)) {
                newBatch = this._hoverLinkDataIndices = visualMapModel.findTargetDataIndices(valueRange);
            }
 
            var resultBatches = modelUtil.compressBatches(oldBatch, newBatch);
            this._dispatchHighDown('downplay', helper.convertDataIndex(resultBatches[0]));
            this._dispatchHighDown('highlight', helper.convertDataIndex(resultBatches[1]));
        },
 
        /**
         * @private
         */
        _hoverLinkFromSeriesMouseOver: function (e) {
            var el = e.target;
            var visualMapModel = this.visualMapModel;
 
            if (!el || el.dataIndex == null) {
                return;
            }
 
            var dataModel = this.ecModel.getSeriesByIndex(el.seriesIndex);
 
            if (!visualMapModel.isTargetSeries(dataModel)) {
                return;
            }
 
            var data = dataModel.getData(el.dataType);
            var dim = data.getDimension(visualMapModel.getDataDimension(data));
            var value = data.get(dim, el.dataIndex, true);
 
            if (!isNaN(value)) {
                this._showIndicator(value, value);
            }
        },
 
        /**
         * @private
         */
        _hideIndicator: function () {
            var shapes = this._shapes;
            shapes.indicator && shapes.indicator.attr('invisible', true);
            shapes.indicatorLabel && shapes.indicatorLabel.attr('invisible', true);
        },
 
        /**
         * @private
         */
        _clearHoverLinkToSeries: function () {
            this._hideIndicator();
 
            var indices = this._hoverLinkDataIndices;
 
            this._dispatchHighDown('downplay', helper.convertDataIndex(indices));
 
            indices.length = 0;
        },
 
        /**
         * @private
         */
        _clearHoverLinkFromSeries: function () {
            this._hideIndicator();
 
            var zr = this.api.getZr();
            zr.off('mouseover', this._hoverLinkFromSeriesMouseOver);
            zr.off('mouseout', this._hideIndicator);
        },
 
        /**
         * @private
         */
        _applyTransform: function (vertex, element, inverse, global) {
            var transform = graphic.getTransform(element, global ? null : this.group);
 
            return graphic[
                zrUtil.isArray(vertex) ? 'applyTransform' : 'transformDirection'
            ](vertex, transform, inverse);
        },
 
        /**
         * @private
         */
        _dispatchHighDown: function (type, batch) {
            batch && batch.length && this.api.dispatchAction({
                type: type,
                batch: batch
            });
        },
 
        /**
         * @override
         */
        dispose: function () {
            this._clearHoverLinkFromSeries();
            this._clearHoverLinkToSeries();
        },
 
        /**
         * @override
         */
        remove: function () {
            this._clearHoverLinkFromSeries();
            this._clearHoverLinkToSeries();
        }
 
    });
 
    function createPolygon(points, cursor, onDrift, onDragEnd) {
        return new graphic.Polygon({
            shape: {points: points},
            draggable: !!onDrift,
            cursor: cursor,
            drift: onDrift,
            onmousemove: function (e) {
                // Fot mobile devicem, prevent screen slider on the button.
                eventTool.stop(e.event);
            },
            ondragend: onDragEnd
        });
    }
 
    function createHandlePoints(handleIndex, textSize) {
        return handleIndex === 0
            ? [[0, 0], [textSize, 0], [textSize, -textSize]]
            : [[0, 0], [textSize, 0], [textSize, textSize]];
    }
 
    function createIndicatorPoints(isRange, halfHoverLinkSize, pos, extentMax) {
        return isRange
            ? [ // indicate range
                [0, -mathMin(halfHoverLinkSize, mathMax(pos, 0))],
                [HOVER_LINK_OUT, 0],
                [0, mathMin(halfHoverLinkSize, mathMax(extentMax - pos, 0))]
            ]
            : [ // indicate single value
                [0, 0], [5, -5], [5, 5]
            ];
    }
 
    function getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent) {
        var halfHoverLinkSize = HOVER_LINK_SIZE / 2;
        var hoverLinkDataSize = visualMapModel.get('hoverLinkDataSize');
        if (hoverLinkDataSize) {
            halfHoverLinkSize = linearMap(hoverLinkDataSize, dataExtent, sizeExtent, true) / 2;
        }
        return halfHoverLinkSize;
    }
 
    function useHoverLinkOnHandle(visualMapModel) {
        return !visualMapModel.get('realtime') && visualMapModel.get('hoverLinkOnHandle');
    }
 
    module.exports = ContinuousView;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/PiecewiseModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/PiecewiseModel.js

Statements: 6.04% (11 / 182)      Branches: 0% (0 / 114)      Functions: 0% (0 / 33)      Lines: 6.04% (11 / 182)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529    1 1 1 1 1   1                                                                                                                                                                                                                                                                                                             1                                                                                                                                                                                                                                                                                                               1                                                                                                         1                                                                                                                                                                                                                                                                                                                     1             1    
 
 
    var VisualMapModel = require('./VisualMapModel');
    var zrUtil = require('zrender/lib/core/util');
    var VisualMapping = require('../../visual/VisualMapping');
    var visualDefault = require('../../visual/visualDefault');
    var reformIntervals = require('../../util/number').reformIntervals;
 
    var PiecewiseModel = VisualMapModel.extend({
 
        type: 'visualMap.piecewise',
 
        /**
         * Order Rule:
         *
         * option.categories / option.pieces / option.text / option.selected:
         *     If !option.inverse,
         *     Order when vertical: ['top', ..., 'bottom'].
         *     Order when horizontal: ['left', ..., 'right'].
         *     If option.inverse, the meaning of
         *     the order should be reversed.
         *
         * this._pieceList:
         *     The order is always [low, ..., high].
         *
         * Mapping from location to low-high:
         *     If !option.inverse
         *     When vertical, top is high.
         *     When horizontal, right is high.
         *     If option.inverse, reverse.
         */
 
        /**
         * @protected
         */
        defaultOption: {
            selected: null,             // Object. If not specified, means selected.
                                        // When pieces and splitNumber: {'0': true, '5': true}
                                        // When categories: {'cate1': false, 'cate3': true}
                                        // When selected === false, means all unselected.
 
            minOpen: false,             // Whether include values that smaller than `min`.
            maxOpen: false,             // Whether include values that bigger than `max`.
 
            align: 'auto',              // 'auto', 'left', 'right'
            itemWidth: 20,              // When put the controller vertically, it is the length of
                                        // horizontal side of each item. Otherwise, vertical side.
            itemHeight: 14,             // When put the controller vertically, it is the length of
                                        // vertical side of each item. Otherwise, horizontal side.
            itemSymbol: 'roundRect',
            pieceList: null,            // Each item is Object, with some of those attrs:
                                        // {min, max, lt, gt, lte, gte, value,
                                        // color, colorSaturation, colorAlpha, opacity,
                                        // symbol, symbolSize}, which customize the range or visual
                                        // coding of the certain piece. Besides, see "Order Rule".
            categories: null,           // category names, like: ['some1', 'some2', 'some3'].
                                        // Attr min/max are ignored when categories set. See "Order Rule"
            splitNumber: 5,             // If set to 5, auto split five pieces equally.
                                        // If set to 0 and component type not set, component type will be
                                        // determined as "continuous". (It is less reasonable but for ec2
                                        // compatibility, see echarts/component/visualMap/typeDefaulter)
            selectedMode: 'multiple',   // Can be 'multiple' or 'single'.
            itemGap: 10,                // The gap between two items, in px.
            hoverLink: true,            // Enable hover highlight.
 
            showLabel: null             // By default, when text is used, label will hide (the logic
                                        // is remained for compatibility reason)
        },
 
        /**
         * @override
         */
        optionUpdated: function (newOption, isInit) {
            PiecewiseModel.superApply(this, 'optionUpdated', arguments);
 
            /**
             * The order is always [low, ..., high].
             * [{text: string, interval: Array.<number>}, ...]
             * @private
             * @type {Array.<Object>}
             */
            this._pieceList = [];
 
            this.resetTargetSeries();
            this.resetExtent();
 
            /**
             * 'pieces', 'categories', 'splitNumber'
             * @type {string}
             */
            var mode = this._mode = this._determineMode();
 
            resetMethods[this._mode].call(this);
 
            this._resetSelected(newOption, isInit);
 
            var categories = this.option.categories;
 
            this.resetVisual(function (mappingOption, state) {
                if (mode === 'categories') {
                    mappingOption.mappingMethod = 'category';
                    mappingOption.categories = zrUtil.clone(categories);
                }
                else {
                    mappingOption.dataExtent = this.getExtent();
                    mappingOption.mappingMethod = 'piecewise';
                    mappingOption.pieceList = zrUtil.map(this._pieceList, function (piece) {
                        var piece = zrUtil.clone(piece);
                        if (state !== 'inRange') {
                            // FIXME
                            // outOfRange do not support special visual in pieces.
                            piece.visual = null;
                        }
                        return piece;
                    });
                }
            });
        },
 
        /**
         * @protected
         * @override
         */
        completeVisualOption: function () {
            // Consider this case:
            // visualMap: {
            //      pieces: [{symbol: 'circle', lt: 0}, {symbol: 'rect', gte: 0}]
            // }
            // where no inRange/outOfRange set but only pieces. So we should make
            // default inRange/outOfRange for this case, otherwise visuals that only
            // appear in `pieces` will not be taken into account in visual encoding.
 
            var option = this.option;
            var visualTypesInPieces = {};
            var visualTypes = VisualMapping.listVisualTypes();
            var isCategory = this.isCategory();
 
            zrUtil.each(option.pieces, function (piece) {
                zrUtil.each(visualTypes, function (visualType) {
                    if (piece.hasOwnProperty(visualType)) {
                        visualTypesInPieces[visualType] = 1;
                    }
                });
            });
 
            zrUtil.each(visualTypesInPieces, function (v, visualType) {
                var exists = 0;
                zrUtil.each(this.stateList, function (state) {
                    exists |= has(option, state, visualType)
                        || has(option.target, state, visualType);
                }, this);
 
                !exists && zrUtil.each(this.stateList, function (state) {
                    (option[state] || (option[state] = {}))[visualType] = visualDefault.get(
                        visualType, state === 'inRange' ? 'active' : 'inactive', isCategory
                    );
                });
            }, this);
 
            function has(obj, state, visualType) {
                return obj && obj[state] && (
                    zrUtil.isObject(obj[state])
                        ? obj[state].hasOwnProperty(visualType)
                        : obj[state] === visualType // e.g., inRange: 'symbol'
                );
            }
 
            VisualMapModel.prototype.completeVisualOption.apply(this, arguments);
        },
 
        _resetSelected: function (newOption, isInit) {
            var thisOption = this.option;
            var pieceList = this._pieceList;
 
            // Selected do not merge but all override.
            var selected = (isInit ? thisOption : newOption).selected || {};
            thisOption.selected = selected;
 
            // Consider 'not specified' means true.
            zrUtil.each(pieceList, function (piece, index) {
                var key = this.getSelectedMapKey(piece);
                if (!selected.hasOwnProperty(key)) {
                    selected[key] = true;
                }
            }, this);
 
            if (thisOption.selectedMode === 'single') {
                // Ensure there is only one selected.
                var hasSel = false;
 
                zrUtil.each(pieceList, function (piece, index) {
                    var key = this.getSelectedMapKey(piece);
                    if (selected[key]) {
                        hasSel
                            ? (selected[key] = false)
                            : (hasSel = true);
                    }
                }, this);
            }
            // thisOption.selectedMode === 'multiple', default: all selected.
        },
 
        /**
         * @public
         */
        getSelectedMapKey: function (piece) {
            return this._mode === 'categories'
                ? piece.value + '' : piece.index + '';
        },
 
        /**
         * @public
         */
        getPieceList: function () {
            return this._pieceList;
        },
 
        /**
         * @private
         * @return {string}
         */
        _determineMode: function () {
            var option = this.option;
 
            return option.pieces && option.pieces.length > 0
                ? 'pieces'
                : this.option.categories
                ? 'categories'
                : 'splitNumber';
        },
 
        /**
         * @public
         * @override
         */
        setSelected: function (selected) {
            this.option.selected = zrUtil.clone(selected);
        },
 
        /**
         * @public
         * @override
         */
        getValueState: function (value) {
            var index = VisualMapping.findPieceIndex(value, this._pieceList);
 
            return index != null
                ? (this.option.selected[this.getSelectedMapKey(this._pieceList[index])]
                    ? 'inRange' : 'outOfRange'
                )
                : 'outOfRange';
        },
 
        /**
         * @public
         * @params {number} pieceIndex piece index in visualMapModel.getPieceList()
         * @return {Array.<Object>} [{seriesId, dataIndices: <Array.<number>>}, ...]
         */
        findTargetDataIndices: function (pieceIndex) {
            var result = [];
 
            this.eachTargetSeries(function (seriesModel) {
                var dataIndices = [];
                var data = seriesModel.getData();
 
                data.each(this.getDataDimension(data), function (value, dataIndex) {
                    // Should always base on model pieceList, because it is order sensitive.
                    var pIdx = VisualMapping.findPieceIndex(value, this._pieceList);
                    pIdx === pieceIndex && dataIndices.push(dataIndex);
                }, true, this);
 
                result.push({seriesId: seriesModel.id, dataIndex: dataIndices});
            }, this);
 
            return result;
        },
 
        /**
         * @private
         * @param {Object} piece piece.value or piece.interval is required.
         * @return {number} Can be Infinity or -Infinity
         */
        getRepresentValue: function (piece) {
            var representValue;
            if (this.isCategory()) {
                representValue = piece.value;
            }
            else {
                if (piece.value != null) {
                    representValue = piece.value;
                }
                else {
                    var pieceInterval = piece.interval || [];
                    representValue = (pieceInterval[0] === -Infinity && pieceInterval[1] === Infinity)
                        ? 0
                        : (pieceInterval[0] + pieceInterval[1]) / 2;
                }
            }
            return representValue;
        },
 
        getVisualMeta: function (getColorVisual) {
            // Do not support category. (category axis is ordinal, numerical)
            if (this.isCategory()) {
                return;
            }
 
            var stops = [];
            var outerColors = [];
            var visualMapModel = this;
 
            function setStop(interval, valueState) {
                var representValue = visualMapModel.getRepresentValue({interval: interval});
                if (!valueState) {
                    valueState = visualMapModel.getValueState(representValue);
                }
                var color = getColorVisual(representValue, valueState);
                if (interval[0] === -Infinity) {
                    outerColors[0] = color;
                }
                else if (interval[1] === Infinity) {
                    outerColors[1] = color;
                }
                else {
                    stops.push(
                        {value: interval[0], color: color},
                        {value: interval[1], color: color}
                    );
                }
            }
 
            // Suplement
            var pieceList = this._pieceList.slice();
            if (!pieceList.length) {
                pieceList.push({interval: [-Infinity, Infinity]});
            }
            else {
                var edge = pieceList[0].interval[0];
                edge !== -Infinity && pieceList.unshift({interval: [-Infinity, edge]});
                edge = pieceList[pieceList.length - 1].interval[1];
                edge !== Infinity && pieceList.push({interval: [edge, Infinity]});
            }
 
            var curr = -Infinity;
            zrUtil.each(pieceList, function (piece) {
                var interval = piece.interval;
                if (interval) {
                    // Fulfill gap.
                    interval[0] > curr && setStop([curr, interval[0]], 'outOfRange');
                    setStop(interval.slice());
                    curr = interval[1];
                }
            }, this);
 
            return {stops: stops, outerColors: outerColors};
        }
 
    });
 
    /**
     * Key is this._mode
     * @type {Object}
     * @this {module:echarts/component/viusalMap/PiecewiseMode}
     */
    var resetMethods = {
 
        splitNumber: function () {
            var thisOption = this.option;
            var pieceList = this._pieceList;
            var precision = thisOption.precision;
            var dataExtent = this.getExtent();
            var splitNumber = thisOption.splitNumber;
            splitNumber = Math.max(parseInt(splitNumber, 10), 1);
            thisOption.splitNumber = splitNumber;
 
            var splitStep = (dataExtent[1] - dataExtent[0]) / splitNumber;
            // Precision auto-adaption
            while (+splitStep.toFixed(precision) !== splitStep && precision < 5) {
                precision++;
            }
            thisOption.precision = precision;
            splitStep = +splitStep.toFixed(precision);
 
            var index = 0;
 
            if (thisOption.minOpen) {
                pieceList.push({
                    index: index++,
                    interval: [-Infinity, dataExtent[0]],
                    close: [0, 0]
                });
            }
 
            for (
                var curr = dataExtent[0], len = index + splitNumber;
                index < len;
                curr += splitStep
            ) {
                var max = index === splitNumber - 1 ? dataExtent[1] : (curr + splitStep);
 
                pieceList.push({
                    index: index++,
                    interval: [curr, max],
                    close: [1, 1]
                });
            }
 
            if (thisOption.maxOpen) {
                pieceList.push({
                    index: index++,
                    interval: [dataExtent[1], Infinity],
                    close: [0, 0]
                });
            }
 
            reformIntervals(pieceList);
 
            zrUtil.each(pieceList, function (piece) {
                piece.text = this.formatValueText(piece.interval);
            }, this);
        },
 
        categories: function () {
            var thisOption = this.option;
            zrUtil.each(thisOption.categories, function (cate) {
                // FIXME category模式也使用pieceList,但在visualMapping中不是使用pieceList。
                // 是否改一致。
                this._pieceList.push({
                    text: this.formatValueText(cate, true),
                    value: cate
                });
            }, this);
 
            // See "Order Rule".
            normalizeReverse(thisOption, this._pieceList);
        },
 
        pieces: function () {
            var thisOption = this.option;
            var pieceList = this._pieceList;
 
            zrUtil.each(thisOption.pieces, function (pieceListItem, index) {
 
                if (!zrUtil.isObject(pieceListItem)) {
                    pieceListItem = {value: pieceListItem};
                }
 
                var item = {text: '', index: index};
 
                if (pieceListItem.label != null) {
                    item.text = pieceListItem.label;
                }
 
                if (pieceListItem.hasOwnProperty('value')) {
                    var value = item.value = pieceListItem.value;
                    item.interval = [value, value];
                    item.close = [1, 1];
                }
                else {
                    // `min` `max` is legacy option.
                    // `lt` `gt` `lte` `gte` is recommanded.
                    var interval = item.interval = [];
                    var close = item.close = [0, 0];
 
                    var closeList = [1, 0, 1];
                    var infinityList = [-Infinity, Infinity];
 
                    var useMinMax = [];
                    for (var lg = 0; lg < 2; lg++) {
                        var names = [['gte', 'gt', 'min'], ['lte', 'lt', 'max']][lg];
                        for (var i = 0; i < 3 && interval[lg] == null; i++) {
                            interval[lg] = pieceListItem[names[i]];
                            close[lg] = closeList[i];
                            useMinMax[lg] = i === 2;
                        }
                        interval[lg] == null && (interval[lg] = infinityList[lg]);
                    }
                    useMinMax[0] && interval[1] === Infinity && (close[0] = 0);
                    useMinMax[1] && interval[0] === -Infinity && (close[1] = 0);
 
                    if (__DEV__) {
                        if (interval[0] > interval[1]) {
                            console.warn(
                                'Piece ' + index + 'is illegal: ' + interval
                                + ' lower bound should not greater then uppper bound.'
                            );
                        }
                    }
 
                    if (interval[0] === interval[1] && close[0] && close[1]) {
                        // Consider: [{min: 5, max: 5, visual: {...}}, {min: 0, max: 5}],
                        // we use value to lift the priority when min === max
                        item.value = interval[0];
                    }
                }
 
                item.visual = VisualMapping.retrieveVisuals(pieceListItem);
 
                pieceList.push(item);
 
            }, this);
 
            // See "Order Rule".
            normalizeReverse(thisOption, pieceList);
            // Only pieces
            reformIntervals(pieceList);
 
            zrUtil.each(pieceList, function (piece) {
                var close = piece.close;
                var edgeSymbols = [['<', '≤'][close[1]], ['>', '≥'][close[0]]];
                piece.text = piece.text || this.formatValueText(
                    piece.value != null ? piece.value : piece.interval,
                    false,
                    edgeSymbols
                );
            }, this);
        }
    };
 
    function normalizeReverse(thisOption, pieceList) {
        var inverse = thisOption.inverse;
        if (thisOption.orient === 'vertical' ? !inverse : inverse) {
             pieceList.reverse();
        }
    }
 
    module.exports = PiecewiseModel;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/PiecewiseView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/PiecewiseView.js

Statements: 12.99% (10 / 77)      Branches: 0% (0 / 34)      Functions: 0% (0 / 11)      Lines: 12.99% (10 / 77)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224    1 1 1 1 1 1   1                                                                                   1                                                                                     1                                                                                                                                                                                                                                                           1      
 
 
    var VisualMapView = require('./VisualMapView');
    var zrUtil = require('zrender/lib/core/util');
    var graphic = require('../../util/graphic');
    var symbolCreators = require('../../util/symbol');
    var layout = require('../../util/layout');
    var helper = require('./helper');
 
    var PiecewiseVisualMapView = VisualMapView.extend({
 
        type: 'visualMap.piecewise',
 
        /**
         * @protected
         * @override
         */
        doRender: function () {
            var thisGroup = this.group;
 
            thisGroup.removeAll();
 
            var visualMapModel = this.visualMapModel;
            var textGap = visualMapModel.get('textGap');
            var textStyleModel = visualMapModel.textStyleModel;
            var textFont = textStyleModel.getFont();
            var textFill = textStyleModel.getTextColor();
            var itemAlign = this._getItemAlign();
            var itemSize = visualMapModel.itemSize;
            var viewData = this._getViewData();
            var endsText = viewData.endsText;
            var showLabel = zrUtil.retrieve(visualMapModel.get('showLabel', true), !endsText);
 
            endsText && this._renderEndsText(
                thisGroup, endsText[0], itemSize, showLabel, itemAlign
            );
 
            zrUtil.each(viewData.viewPieceList, renderItem, this);
 
            endsText && this._renderEndsText(
                thisGroup, endsText[1], itemSize, showLabel, itemAlign
            );
 
            layout.box(
                visualMapModel.get('orient'), thisGroup, visualMapModel.get('itemGap')
            );
 
            this.renderBackground(thisGroup);
 
            this.positionGroup(thisGroup);
 
            function renderItem(item) {
                var piece = item.piece;
 
                var itemGroup = new graphic.Group();
                itemGroup.onclick = zrUtil.bind(this._onItemClick, this, piece);
 
                this._enableHoverLink(itemGroup, item.indexInModelPieceList);
 
                var representValue = visualMapModel.getRepresentValue(piece);
 
                this._createItemSymbol(
                    itemGroup, representValue, [0, 0, itemSize[0], itemSize[1]]
                );
 
                if (showLabel) {
                    var visualState = this.visualMapModel.getValueState(representValue);
 
                    itemGroup.add(new graphic.Text({
                        style: {
                            x: itemAlign === 'right' ? -textGap : itemSize[0] + textGap,
                            y: itemSize[1] / 2,
                            text: piece.text,
                            textVerticalAlign: 'middle',
                            textAlign: itemAlign,
                            textFont: textFont,
                            fill: textFill,
                            opacity: visualState === 'outOfRange' ? 0.5 : 1
                        }
                    }));
                }
 
                thisGroup.add(itemGroup);
            }
        },
 
        /**
         * @private
         */
        _enableHoverLink: function (itemGroup, pieceIndex) {
            itemGroup
                .on('mouseover', zrUtil.bind(onHoverLink, this, 'highlight'))
                .on('mouseout', zrUtil.bind(onHoverLink, this, 'downplay'));
 
            function onHoverLink(method) {
                var visualMapModel = this.visualMapModel;
 
                visualMapModel.option.hoverLink && this.api.dispatchAction({
                    type: method,
                    batch: helper.convertDataIndex(
                        visualMapModel.findTargetDataIndices(pieceIndex)
                    )
                });
            }
        },
 
        /**
         * @private
         */
        _getItemAlign: function () {
            var visualMapModel = this.visualMapModel;
            var modelOption = visualMapModel.option;
 
            if (modelOption.orient === 'vertical') {
                return helper.getItemAlign(
                    visualMapModel, this.api, visualMapModel.itemSize
                );
            }
            else { // horizontal, most case left unless specifying right.
                var align = modelOption.align;
                if (!align || align === 'auto') {
                    align = 'left';
                }
                return align;
            }
        },
 
        /**
         * @private
         */
        _renderEndsText: function (group, text, itemSize, showLabel, itemAlign) {
            if (!text) {
                return;
            }
 
            var itemGroup = new graphic.Group();
            var textStyleModel = this.visualMapModel.textStyleModel;
 
            itemGroup.add(new graphic.Text({
                style: {
                    x: showLabel ? (itemAlign === 'right' ? itemSize[0] : 0) : itemSize[0] / 2,
                    y: itemSize[1] / 2,
                    textVerticalAlign: 'middle',
                    textAlign: showLabel ? itemAlign : 'center',
                    text: text,
                    textFont: textStyleModel.getFont(),
                    fill: textStyleModel.getTextColor()
                }
            }));
 
            group.add(itemGroup);
        },
 
        /**
         * @private
         * @return {Object} {peiceList, endsText} The order is the same as screen pixel order.
         */
        _getViewData: function () {
            var visualMapModel = this.visualMapModel;
 
            var viewPieceList = zrUtil.map(visualMapModel.getPieceList(), function (piece, index) {
                return {piece: piece, indexInModelPieceList: index};
            });
            var endsText = visualMapModel.get('text');
 
            // Consider orient and inverse.
            var orient = visualMapModel.get('orient');
            var inverse = visualMapModel.get('inverse');
 
            // Order of model pieceList is always [low, ..., high]
            if (orient === 'horizontal' ? inverse : !inverse) {
                viewPieceList.reverse();
            }
            // Origin order of endsText is [high, low]
            else if (endsText) {
                endsText = endsText.slice().reverse();
            }
 
            return {viewPieceList: viewPieceList, endsText: endsText};
        },
 
        /**
         * @private
         */
        _createItemSymbol: function (group, representValue, shapeParam) {
            group.add(symbolCreators.createSymbol(
                this.getControllerVisual(representValue, 'symbol'),
                shapeParam[0], shapeParam[1], shapeParam[2], shapeParam[3],
                this.getControllerVisual(representValue, 'color')
            ));
        },
 
        /**
         * @private
         */
        _onItemClick: function (piece) {
            var visualMapModel = this.visualMapModel;
            var option = visualMapModel.option;
            var selected = zrUtil.clone(option.selected);
            var newKey = visualMapModel.getSelectedMapKey(piece);
 
            if (option.selectedMode === 'single') {
                selected[newKey] = true;
                zrUtil.each(selected, function (o, key) {
                    selected[key] = key === newKey;
                });
            }
            else {
                selected[newKey] = !selected[newKey];
            }
 
            this.api.dispatchAction({
                type: 'selectDataRange',
                from: this.uid,
                visualMapId: this.visualMapModel.id,
                selected: selected
            });
        }
    });
 
    module.exports = PiecewiseVisualMapView;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/VisualMapModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/VisualMapModel.js

Statements: 16.18% (22 / 136)      Branches: 0% (0 / 105)      Functions: 0% (0 / 26)      Lines: 16.18% (22 / 136)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523          1 1 1 1 1 1 1 1 1 1 1 1 1 1 1   1   1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               1                                                                                                                                 1                                                                             1                                                           1                                                                                                                                                                                                                   1      
/**
 * @file Controller visual map model
 */
 
 
    var echarts = require('../../echarts');
    var zrUtil = require('zrender/lib/core/util');
    var env = require('zrender/lib/core/env');
    var visualDefault = require('../../visual/visualDefault');
    var VisualMapping = require('../../visual/VisualMapping');
    var visualSolution = require('../../visual/visualSolution');
    var mapVisual = VisualMapping.mapVisual;
    var modelUtil = require('../../util/model');
    var eachVisual = VisualMapping.eachVisual;
    var numberUtil = require('../../util/number');
    var isArray = zrUtil.isArray;
    var each = zrUtil.each;
    var asc = numberUtil.asc;
    var linearMap = numberUtil.linearMap;
    var noop = zrUtil.noop;
 
    var DEFAULT_COLOR = ['#f6efa6', '#d88273', '#bf444c'];
 
    var VisualMapModel = echarts.extendComponentModel({
 
        type: 'visualMap',
 
        dependencies: ['series'],
 
        /**
         * @readOnly
         * @type {Array.<string>}
         */
        stateList: ['inRange', 'outOfRange'],
 
        /**
         * @readOnly
         * @type {Array.<string>}
         */
        replacableOptionKeys: [
            'inRange', 'outOfRange', 'target', 'controller', 'color'
        ],
 
        /**
         * [lowerBound, upperBound]
         *
         * @readOnly
         * @type {Array.<number>}
         */
        dataBound: [-Infinity, Infinity],
 
        /**
         * @readOnly
         * @type {string|Object}
         */
        layoutMode: {type: 'box', ignoreSize: true},
 
        /**
         * @protected
         */
        defaultOption: {
            show: true,
 
            zlevel: 0,
            z: 4,
 
            seriesIndex: null,       // 所控制的series indices,默认所有有value的series.
 
                                    // set min: 0, max: 200, only for campatible with ec2.
                                    // In fact min max should not have default value.
            min: 0,                 // min value, must specified if pieces is not specified.
            max: 200,               // max value, must specified if pieces is not specified.
 
            dimension: null,
            inRange: null,          // 'color', 'colorHue', 'colorSaturation', 'colorLightness', 'colorAlpha',
                                    // 'symbol', 'symbolSize'
            outOfRange: null,       // 'color', 'colorHue', 'colorSaturation',
                                    // 'colorLightness', 'colorAlpha',
                                    // 'symbol', 'symbolSize'
 
            left: 0,                // 'center' ¦ 'left' ¦ 'right' ¦ {number} (px)
            right: null,            // The same as left.
            top: null,              // 'top' ¦ 'bottom' ¦ 'center' ¦ {number} (px)
            bottom: 0,              // The same as top.
 
            itemWidth: null,
            itemHeight: null,
            inverse: false,
            orient: 'vertical',        // 'horizontal' ¦ 'vertical'
 
            backgroundColor: 'rgba(0,0,0,0)',
            borderColor: '#ccc',       // 值域边框颜色
            contentColor: '#5793f3',
            inactiveColor: '#aaa',
            borderWidth: 0,            // 值域边框线宽,单位px,默认为0(无边框)
            padding: 5,                // 值域内边距,单位px,默认各方向内边距为5,
                                       // 接受数组分别设定上右下左边距,同css
            textGap: 10,               //
            precision: 0,              // 小数精度,默认为0,无小数点
            color: null,               //颜色(deprecated,兼容ec2,顺序同pieces,不同于inRange/outOfRange)
 
            formatter: null,
            text: null,                // 文本,如['高', '低'],兼容ec2,text[0]对应高值,text[1]对应低值
            textStyle: {
                color: '#333'          // 值域文字颜色
            }
        },
 
        /**
         * @protected
         */
        init: function (option, parentModel, ecModel) {
 
            /**
             * @private
             * @type {Array.<number>}
             */
            this._dataExtent;
 
            /**
             * @readOnly
             */
            this.targetVisuals = {};
 
            /**
             * @readOnly
             */
            this.controllerVisuals = {};
 
            /**
             * @readOnly
             */
            this.textStyleModel;
 
            /**
             * [width, height]
             * @readOnly
             * @type {Array.<number>}
             */
            this.itemSize;
 
            this.mergeDefaultAndTheme(option, ecModel);
        },
 
        /**
         * @protected
         */
        optionUpdated: function (newOption, isInit) {
            var thisOption = this.option;
 
            // FIXME
            // necessary?
            // Disable realtime view update if canvas is not supported.
            if (!env.canvasSupported) {
                thisOption.realtime = false;
            }
 
            !isInit && visualSolution.replaceVisualOption(
                thisOption, newOption, this.replacableOptionKeys
            );
 
            this.textStyleModel = this.getModel('textStyle');
 
            this.resetItemSize();
 
            this.completeVisualOption();
        },
 
        /**
         * @protected
         */
        resetVisual: function (supplementVisualOption) {
            var stateList = this.stateList;
            supplementVisualOption = zrUtil.bind(supplementVisualOption, this);
 
            this.controllerVisuals = visualSolution.createVisualMappings(
                this.option.controller, stateList, supplementVisualOption
            );
            this.targetVisuals = visualSolution.createVisualMappings(
                this.option.target, stateList, supplementVisualOption
            );
        },
 
 
        /**
         * @protected
         */
        resetTargetSeries: function () {
            var thisOption = this.option;
            var allSeriesIndex = thisOption.seriesIndex == null;
            thisOption.seriesIndex = allSeriesIndex
                ? [] : modelUtil.normalizeToArray(thisOption.seriesIndex);
 
            allSeriesIndex && this.ecModel.eachSeries(function (seriesModel, index) {
                thisOption.seriesIndex.push(index);
            });
        },
 
        /**
         * @public
         */
        eachTargetSeries: function (callback, context) {
            zrUtil.each(this.option.seriesIndex, function (seriesIndex) {
                callback.call(context, this.ecModel.getSeriesByIndex(seriesIndex));
            }, this);
        },
 
        /**
         * @pubilc
         */
        isTargetSeries: function (seriesModel) {
            var is = false;
            this.eachTargetSeries(function (model) {
                model === seriesModel && (is = true);
            });
            return is;
        },
 
        /**
         * @example
         * this.formatValueText(someVal); // format single numeric value to text.
         * this.formatValueText(someVal, true); // format single category value to text.
         * this.formatValueText([min, max]); // format numeric min-max to text.
         * this.formatValueText([this.dataBound[0], max]); // using data lower bound.
         * this.formatValueText([min, this.dataBound[1]]); // using data upper bound.
         *
         * @param {number|Array.<number>} value Real value, or this.dataBound[0 or 1].
         * @param {boolean} [isCategory=false] Only available when value is number.
         * @param {Array.<string>} edgeSymbols Open-close symbol when value is interval.
         * @return {string}
         * @protected
         */
        formatValueText: function(value, isCategory, edgeSymbols) {
            var option = this.option;
            var precision = option.precision;
            var dataBound = this.dataBound;
            var formatter = option.formatter;
            var isMinMax;
            var textValue;
            edgeSymbols = edgeSymbols || ['<', '>'];
 
            if (zrUtil.isArray(value)) {
                value = value.slice();
                isMinMax = true;
            }
 
            textValue = isCategory
                ? value
                : (isMinMax
                    ? [toFixed(value[0]), toFixed(value[1])]
                    : toFixed(value)
                );
 
            if (zrUtil.isString(formatter)) {
                return formatter
                    .replace('{value}', isMinMax ? textValue[0] : textValue)
                    .replace('{value2}', isMinMax ? textValue[1] : textValue);
            }
            else if (zrUtil.isFunction(formatter)) {
                return isMinMax
                    ? formatter(value[0], value[1])
                    : formatter(value);
            }
 
            if (isMinMax) {
                if (value[0] === dataBound[0]) {
                    return edgeSymbols[0] + ' ' + textValue[1];
                }
                else if (value[1] === dataBound[1]) {
                    return edgeSymbols[1] + ' ' + textValue[0];
                }
                else {
                    return textValue[0] + ' - ' + textValue[1];
                }
            }
            else { // Format single value (includes category case).
                return textValue;
            }
 
            function toFixed(val) {
                return val === dataBound[0]
                    ? 'min'
                    : val === dataBound[1]
                    ? 'max'
                    : (+val).toFixed(precision);
            }
        },
 
        /**
         * @protected
         */
        resetExtent: function () {
            var thisOption = this.option;
 
            // Can not calculate data extent by data here.
            // Because series and data may be modified in processing stage.
            // So we do not support the feature "auto min/max".
 
            var extent = asc([thisOption.min, thisOption.max]);
 
            this._dataExtent = extent;
        },
 
        /**
         * @public
         * @param {module:echarts/data/List} list
         * @return {string} Concrete dimention. If return null/undefined,
         *                  no dimension used.
         */
        getDataDimension: function (list) {
            var optDim = this.option.dimension;
            return optDim != null
                ? optDim : list.dimensions.length - 1;
        },
 
        /**
         * @public
         * @override
         */
        getExtent: function () {
            return this._dataExtent.slice();
        },
 
        /**
         * @protected
         */
        completeVisualOption: function () {
            var thisOption = this.option;
            var base = {inRange: thisOption.inRange, outOfRange: thisOption.outOfRange};
 
            var target = thisOption.target || (thisOption.target = {});
            var controller = thisOption.controller || (thisOption.controller = {});
 
            zrUtil.merge(target, base); // Do not override
            zrUtil.merge(controller, base); // Do not override
 
            var isCategory = this.isCategory();
 
            completeSingle.call(this, target);
            completeSingle.call(this, controller);
            completeInactive.call(this, target, 'inRange', 'outOfRange');
            // completeInactive.call(this, target, 'outOfRange', 'inRange');
            completeController.call(this, controller);
 
            function completeSingle(base) {
                // Compatible with ec2 dataRange.color.
                // The mapping order of dataRange.color is: [high value, ..., low value]
                // whereas inRange.color and outOfRange.color is [low value, ..., high value]
                // Notice: ec2 has no inverse.
                if (isArray(thisOption.color)
                    // If there has been inRange: {symbol: ...}, adding color is a mistake.
                    // So adding color only when no inRange defined.
                    && !base.inRange
                ) {
                    base.inRange = {color: thisOption.color.slice().reverse()};
                }
 
                // Compatible with previous logic, always give a defautl color, otherwise
                // simple config with no inRange and outOfRange will not work.
                // Originally we use visualMap.color as the default color, but setOption at
                // the second time the default color will be erased. So we change to use
                // constant DEFAULT_COLOR.
                // If user do not want the defualt color, set inRange: {color: null}.
                base.inRange = base.inRange || {color: DEFAULT_COLOR};
 
                // If using shortcut like: {inRange: 'symbol'}, complete default value.
                each(this.stateList, function (state) {
                    var visualType = base[state];
 
                    if (zrUtil.isString(visualType)) {
                        var defa = visualDefault.get(visualType, 'active', isCategory);
                        if (defa) {
                            base[state] = {};
                            base[state][visualType] = defa;
                        }
                        else {
                            // Mark as not specified.
                            delete base[state];
                        }
                    }
                }, this);
            }
 
            function completeInactive(base, stateExist, stateAbsent) {
                var optExist = base[stateExist];
                var optAbsent = base[stateAbsent];
 
                if (optExist && !optAbsent) {
                    optAbsent = base[stateAbsent] = {};
                    each(optExist, function (visualData, visualType) {
                        if (!VisualMapping.isValidType(visualType)) {
                            return;
                        }
 
                        var defa = visualDefault.get(visualType, 'inactive', isCategory);
 
                        if (defa != null) {
                            optAbsent[visualType] = defa;
 
                            // Compatibable with ec2:
                            // Only inactive color to rgba(0,0,0,0) can not
                            // make label transparent, so use opacity also.
                            if (visualType === 'color'
                                && !optAbsent.hasOwnProperty('opacity')
                                && !optAbsent.hasOwnProperty('colorAlpha')
                            ) {
                                optAbsent.opacity = [0, 0];
                            }
                        }
                    });
                }
            }
 
            function completeController(controller) {
                var symbolExists = (controller.inRange || {}).symbol
                    || (controller.outOfRange || {}).symbol;
                var symbolSizeExists = (controller.inRange || {}).symbolSize
                    || (controller.outOfRange || {}).symbolSize;
                var inactiveColor = this.get('inactiveColor');
 
                each(this.stateList, function (state) {
 
                    var itemSize = this.itemSize;
                    var visuals = controller[state];
 
                    // Set inactive color for controller if no other color
                    // attr (like colorAlpha) specified.
                    if (!visuals) {
                        visuals = controller[state] = {
                            color: isCategory ? inactiveColor : [inactiveColor]
                        };
                    }
 
                    // Consistent symbol and symbolSize if not specified.
                    if (visuals.symbol == null) {
                        visuals.symbol = symbolExists
                            && zrUtil.clone(symbolExists)
                            || (isCategory ? 'roundRect' : ['roundRect']);
                    }
                    if (visuals.symbolSize == null) {
                        visuals.symbolSize = symbolSizeExists
                            && zrUtil.clone(symbolSizeExists)
                            || (isCategory ? itemSize[0] : [itemSize[0], itemSize[0]]);
                    }
 
                    // Filter square and none.
                    visuals.symbol = mapVisual(visuals.symbol, function (symbol) {
                        return (symbol === 'none' || symbol === 'square') ? 'roundRect' : symbol;
                    });
 
                    // Normalize symbolSize
                    var symbolSize = visuals.symbolSize;
 
                    if (symbolSize != null) {
                        var max = -Infinity;
                        // symbolSize can be object when categories defined.
                        eachVisual(symbolSize, function (value) {
                            value > max && (max = value);
                        });
                        visuals.symbolSize = mapVisual(symbolSize, function (value) {
                            return linearMap(value, [0, max], [0, itemSize[0]], true);
                        });
                    }
 
                }, this);
            }
        },
 
        /**
         * @protected
         */
        resetItemSize: function () {
            this.itemSize = [
                parseFloat(this.get('itemWidth')),
                parseFloat(this.get('itemHeight'))
            ];
        },
 
        /**
         * @public
         */
        isCategory: function () {
            return !!this.option.categories;
        },
 
        /**
         * @public
         * @abstract
         */
        setSelected: noop,
 
        /**
         * @public
         * @abstract
         * @param {*|module:echarts/data/List} valueOrData
         * @param {number} dataIndex
         * @return {string} state See this.stateList
         */
        getValueState: noop,
 
        /**
         * FIXME
         * Do not publish to thirt-part-dev temporarily
         * util the interface is stable. (Should it return
         * a function but not visual meta?)
         *
         * @pubilc
         * @abstract
         * @param {Function} getColorVisual
         *        params: value, valueState
         *        return: color
         * @return {Object} visualMeta
         *        should includes {stops, outerColors}
         *        outerColor means [colorBeyondMinValue, colorBeyondMaxValue]
         */
        getVisualMeta: noop
 
    });
 
    module.exports = VisualMapModel;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/VisualMapView.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/VisualMapView.js

Statements: 20% (9 / 45)      Branches: 0% (0 / 20)      Functions: 0% (0 / 8)      Lines: 20% (9 / 45)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156    1 1 1 1 1 1   1                                                                                                                                                                                           1       1                                                                                                
 
 
    var zrUtil = require('zrender/lib/core/util');
    var graphic = require('../../util/graphic');
    var formatUtil = require('../../util/format');
    var layout = require('../../util/layout');
    var echarts = require('../../echarts');
    var VisualMapping = require('../../visual/VisualMapping');
 
    module.exports = echarts.extendComponentView({
 
        type: 'visualMap',
 
        /**
         * @readOnly
         * @type {Object}
         */
        autoPositionValues: {left: 1, right: 1, top: 1, bottom: 1},
 
        init: function (ecModel, api) {
            /**
             * @readOnly
             * @type {module:echarts/model/Global}
             */
            this.ecModel = ecModel;
 
            /**
             * @readOnly
             * @type {module:echarts/ExtensionAPI}
             */
            this.api = api;
 
            /**
             * @readOnly
             * @type {module:echarts/component/visualMap/visualMapModel}
             */
            this.visualMapModel;
        },
 
        /**
         * @protected
         */
        render: function (visualMapModel, ecModel, api, payload) {
            this.visualMapModel = visualMapModel;
 
            if (visualMapModel.get('show') === false) {
                this.group.removeAll();
                return;
            }
 
            this.doRender.apply(this, arguments);
        },
 
        /**
         * @protected
         */
        renderBackground: function (group) {
            var visualMapModel = this.visualMapModel;
            var padding = formatUtil.normalizeCssArray(visualMapModel.get('padding') || 0);
            var rect = group.getBoundingRect();
 
            group.add(new graphic.Rect({
                z2: -1, // Lay background rect on the lowest layer.
                silent: true,
                shape: {
                    x: rect.x - padding[3],
                    y: rect.y - padding[0],
                    width: rect.width + padding[3] + padding[1],
                    height: rect.height + padding[0] + padding[2]
                },
                style: {
                    fill: visualMapModel.get('backgroundColor'),
                    stroke: visualMapModel.get('borderColor'),
                    lineWidth: visualMapModel.get('borderWidth')
                }
            }));
        },
 
        /**
         * @protected
         * @param {number} targetValue can be Infinity or -Infinity
         * @param {string=} visualCluster Only can be 'color' 'opacity' 'symbol' 'symbolSize'
         * @param {Object} [opts]
         * @param {string=} [opts.forceState] Specify state, instead of using getValueState method.
         * @param {string=} [opts.convertOpacityToAlpha=false] For color gradient in controller widget.
         * @return {*} Visual value.
         */
        getControllerVisual: function (targetValue, visualCluster, opts) {
            opts = opts || {};
 
            var forceState = opts.forceState;
            var visualMapModel = this.visualMapModel;
            var visualObj = {};
 
            // Default values.
            if (visualCluster === 'symbol') {
                visualObj.symbol = visualMapModel.get('itemSymbol');
            }
            if (visualCluster === 'color') {
                var defaultColor = visualMapModel.get('contentColor');
                visualObj.color = defaultColor;
            }
 
            function getter(key) {
                return visualObj[key];
            }
 
            function setter(key, value) {
                visualObj[key] = value;
            }
 
            var mappings = visualMapModel.controllerVisuals[
                forceState || visualMapModel.getValueState(targetValue)
            ];
            var visualTypes = VisualMapping.prepareVisualTypes(mappings);
 
            zrUtil.each(visualTypes, function (type) {
                var visualMapping = mappings[type];
                if (opts.convertOpacityToAlpha && type === 'opacity') {
                    type = 'colorAlpha';
                    visualMapping = mappings.__alphaForOpacity;
                }
                if (VisualMapping.dependsOn(type, visualCluster)) {
                    visualMapping && visualMapping.applyVisual(
                        targetValue, getter, setter
                    );
                }
            });
 
            return visualObj[visualCluster];
        },
 
        /**
         * @protected
         */
        positionGroup: function (group) {
            var model = this.visualMapModel;
            var api = this.api;
 
            layout.positionElement(
                group,
                model.getBoxLayoutParams(),
                {width: api.getWidth(), height: api.getHeight()}
            );
        },
 
        /**
         * @protected
         * @abstract
         */
        doRender: zrUtil.noop
 
    });
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/helper.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/helper.js

Statements: 16% (4 / 25)      Branches: 0% (0 / 16)      Functions: 0% (0 / 3)      Lines: 16% (4 / 25)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68    1 1   1                                                                                                                     1      
 
 
    var zrUtil = require('zrender/lib/core/util');
    var layout = require('../../util/layout');
 
    var helper = {
 
        /**
         * @param {module:echarts/component/visualMap/VisualMapModel} visualMapModel\
         * @param {module:echarts/ExtensionAPI} api
         * @param {Array.<number>} itemSize always [short, long]
         * @return {string} 'left' or 'right' or 'top' or 'bottom'
         */
        getItemAlign: function (visualMapModel, api, itemSize) {
            var modelOption = visualMapModel.option;
            var itemAlign = modelOption.align;
 
            if (itemAlign != null && itemAlign !== 'auto') {
                return itemAlign;
            }
 
            // Auto decision align.
            var ecSize = {width: api.getWidth(), height: api.getHeight()};
            var realIndex = modelOption.orient === 'horizontal' ? 1 : 0;
 
            var paramsSet = [
                ['left', 'right', 'width'],
                ['top', 'bottom', 'height']
            ];
            var reals = paramsSet[realIndex];
            var fakeValue = [0, null, 10];
 
            var layoutInput = {};
            for (var i = 0; i < 3; i++) {
                layoutInput[paramsSet[1 - realIndex][i]] = fakeValue[i];
                layoutInput[reals[i]] = i === 2 ? itemSize[0] : modelOption[reals[i]];
            }
 
            var rParam = [['x', 'width', 3], ['y', 'height', 0]][realIndex];
            var rect = layout.getLayoutRect(layoutInput, ecSize, modelOption.padding);
 
            return reals[
                (rect.margin[rParam[2]] || 0) + rect[rParam[0]] + rect[rParam[1]] * 0.5
                    < ecSize[rParam[1]] * 0.5 ? 0 : 1
            ];
        },
 
        /**
         * Prepare dataIndex for outside usage, where dataIndex means rawIndex, and
         * dataIndexInside means filtered index.
         */
        convertDataIndex: function (batch) {
            zrUtil.each(batch || [], function (batchItem) {
                if (batch.dataIndex != null) {
                    batch.dataIndexInside = batch.dataIndex;
                    batch.dataIndex = null;
                }
            });
            return batch;
        }
 
    };
 
 
    module.exports = helper;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/preprocessor.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/preprocessor.js

Statements: 18.18% (4 / 22)      Branches: 0% (0 / 29)      Functions: 0% (0 / 4)      Lines: 18.18% (4 / 22)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48          1 1   1                                                                   1          
/**
 * @file VisualMap preprocessor
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
    var each = zrUtil.each;
 
    module.exports = function (option) {
        var visualMap = option && option.visualMap;
 
        if (!zrUtil.isArray(visualMap)) {
            visualMap = visualMap ? [visualMap] : [];
        }
 
        each(visualMap, function (opt) {
            if (!opt) {
                return;
            }
 
            // rename splitList to pieces
            if (has(opt, 'splitList') && !has(opt, 'pieces')) {
                opt.pieces = opt.splitList;
                delete opt.splitList;
            }
 
            var pieces = opt.pieces;
            if (pieces && zrUtil.isArray(pieces)) {
                each(pieces, function (piece) {
                    if (zrUtil.isObject(piece)) {
                        if (has(piece, 'start') && !has(piece, 'min')) {
                            piece.min = piece.start;
                        }
                        if (has(piece, 'end') && !has(piece, 'max')) {
                            piece.max = piece.end;
                        }
                    }
                });
            }
        });
    };
 
    function has(obj, name) {
        return obj && obj.hasOwnProperty && obj.hasOwnProperty(name);
    }
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/typeDefaulter.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/typeDefaulter.js

Statements: 50% (1 / 2)      Branches: 0% (0 / 7)      Functions: 0% (0 / 1)      Lines: 50% (1 / 2)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20    1                                  
 
 
    require('../../model/Component').registerSubTypeDefaulter('visualMap', function (option) {
        // Compatible with ec2, when splitNumber === 0, continuous visualMap will be used.
        return (
                !option.categories
                && (
                    !(
                        option.pieces
                            ? option.pieces.length > 0
                            : option.splitNumber > 0
                    )
                    || option.calculable
                )
            )
            ? 'continuous' : 'piecewise';
    });
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/visualEncoding.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/visualEncoding.js

Statements: 28.57% (10 / 35)      Branches: 0% (0 / 8)      Functions: 0% (0 / 10)      Lines: 28.57% (10 / 35)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86          1 1 1 1   1               1                               1                                             1                                 1       1              
/**
 * @file Data range visual coding.
 */
 
 
    var echarts = require('../../echarts');
    var visualSolution = require('../../visual/visualSolution');
    var VisualMapping = require('../../visual/VisualMapping');
    var zrUtil = require('zrender/lib/core/util');
 
    echarts.registerVisual(echarts.PRIORITY.VISUAL.COMPONENT, function (ecModel) {
        ecModel.eachComponent('visualMap', function (visualMapModel) {
            processSingleVisualMap(visualMapModel, ecModel);
        });
 
        prepareVisualMeta(ecModel);
    });
 
    function processSingleVisualMap(visualMapModel, ecModel) {
        visualMapModel.eachTargetSeries(function (seriesModel) {
            var data = seriesModel.getData();
 
            visualSolution.applyVisual(
                visualMapModel.stateList,
                visualMapModel.targetVisuals,
                data,
                visualMapModel.getValueState,
                visualMapModel,
                visualMapModel.getDataDimension(data)
            );
        });
    }
 
    // Only support color.
    function prepareVisualMeta(ecModel) {
        ecModel.eachSeries(function (seriesModel) {
            var data = seriesModel.getData();
            var visualMetaList = [];
 
            ecModel.eachComponent('visualMap', function (visualMapModel) {
                if (visualMapModel.isTargetSeries(seriesModel)) {
                    var visualMeta = visualMapModel.getVisualMeta(
                        zrUtil.bind(getColorVisual, null, seriesModel, visualMapModel)
                    ) || {stops: [], outerColors: []};
                    visualMeta.dimension = visualMapModel.getDataDimension(data);
                    visualMetaList.push(visualMeta);
                }
            });
 
            // console.log(JSON.stringify(visualMetaList.map(a => a.stops)));
            seriesModel.getData().setVisual('visualMeta', visualMetaList);
        });
    }
 
    // FIXME
    // performance and export for heatmap?
    // value can be Infinity or -Infinity
    function getColorVisual(seriesModel, visualMapModel, value, valueState) {
        var mappings = visualMapModel.targetVisuals[valueState];
        var visualTypes = VisualMapping.prepareVisualTypes(mappings);
        var resultVisual = {
            color: seriesModel.getData().getVisual('color') // default color.
        };
 
        for (var i = 0, len = visualTypes.length; i < len; i++) {
            var type = visualTypes[i];
            var mapping = mappings[
                type === 'opacity' ? '__alphaForOpacity' : type
            ];
            mapping && mapping.applyVisual(value, getVisual, setVisual);
        }
 
        return resultVisual.color;
 
        function getVisual(key) {
            return resultVisual[key];
        }
 
        function setVisual(key, value) {
            resultVisual[key] = value;
        }
    }
 
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/visualMapAction.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/component/visualMap/visualMapAction.js

Statements: 60% (3 / 5)      Branches: 100% (0 / 0)      Functions: 0% (0 / 2)      Lines: 60% (3 / 5)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24          1   1             1                  
/**
 * @file Data range action
 */
 
 
    var echarts = require('../../echarts');
 
    var actionInfo = {
        type: 'selectDataRange',
        event: 'dataRangeSelected',
        // FIXME use updateView appears wrong
        update: 'update'
    };
 
    echarts.registerAction(actionInfo, function (payload, ecModel) {
 
        ecModel.eachComponent({mainType: 'visualMap', query: payload}, function (model) {
            model.setSelected(payload.selected);
        });
 
    });
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/

Statements: 17.86% (60 / 336)      Branches: 0% (0 / 199)      Functions: 3.33% (2 / 60)      Lines: 17.86% (60 / 336)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/coord/
File Statements Branches Functions Lines
Axis.js 11.76% (8 / 68) 0% (0 / 24) 0% (0 / 14) 11.76% (8 / 68)
ICoordSys.js 100% (0 / 0) 100% (0 / 0) 100% (0 / 0) 100% (0 / 0)
View.js 15.29% (13 / 85) 0% (0 / 30) 0% (0 / 20) 15.29% (13 / 85)
axisDefault.js 100% (8 / 8) 100% (0 / 0) 100% (0 / 0) 100% (8 / 8)
axisHelper.js 14.41% (17 / 118) 0% (0 / 99) 0% (0 / 10) 14.41% (17 / 118)
axisModelCommonMixin.js 16.67% (4 / 24) 0% (0 / 30) 0% (0 / 8) 16.67% (4 / 24)
axisModelCreator.js 52.94% (9 / 17) 0% (0 / 4) 66.67% (2 / 3) 52.94% (9 / 17)
axisModelZoomMixin.js 6.25% (1 / 16) 0% (0 / 12) 0% (0 / 5) 6.25% (1 / 16)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/Axis.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/Axis.js

Statements: 11.76% (8 / 68)      Branches: 0% (0 / 24)      Functions: 0% (0 / 14)      Lines: 11.76% (8 / 68)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233    1 1 1   1               1         1                                                               1                                                                                                                                                                                                                                                                                                                                                                     1    
 
 
    var numberUtil = require('../util/number');
    var linearMap = numberUtil.linearMap;
    var zrUtil = require('zrender/lib/core/util');
 
    function fixExtentWithBands(extent, nTick) {
        var size = extent[1] - extent[0];
        var len = nTick;
        var margin = size / len / 2;
        extent[0] += margin;
        extent[1] -= margin;
    }
 
    var normalizedExtent = [0, 1];
    /**
     * @name module:echarts/coord/CartesianAxis
     * @constructor
     */
    var Axis = function (dim, scale, extent) {
 
        /**
         * Axis dimension. Such as 'x', 'y', 'z', 'angle', 'radius'
         * @type {string}
         */
        this.dim = dim;
 
        /**
         * Axis scale
         * @type {module:echarts/coord/scale/*}
         */
        this.scale = scale;
 
        /**
         * @type {Array.<number>}
         * @private
         */
        this._extent = extent || [0, 0];
 
        /**
         * @type {boolean}
         */
        this.inverse = false;
 
        /**
         * Usually true when axis has a ordinal scale
         * @type {boolean}
         */
        this.onBand = false;
    };
 
    Axis.prototype = {
 
        constructor: Axis,
 
        /**
         * If axis extent contain given coord
         * @param {number} coord
         * @return {boolean}
         */
        contain: function (coord) {
            var extent = this._extent;
            var min = Math.min(extent[0], extent[1]);
            var max = Math.max(extent[0], extent[1]);
            return coord >= min && coord <= max;
        },
 
        /**
         * If axis extent contain given data
         * @param {number} data
         * @return {boolean}
         */
        containData: function (data) {
            return this.contain(this.dataToCoord(data));
        },
 
        /**
         * Get coord extent.
         * @return {Array.<number>}
         */
        getExtent: function () {
            var ret = this._extent.slice();
            return ret;
        },
 
        /**
         * Get precision used for formatting
         * @param {Array.<number>} [dataExtent]
         * @return {number}
         */
        getPixelPrecision: function (dataExtent) {
            return numberUtil.getPixelPrecision(
                dataExtent || this.scale.getExtent(),
                this._extent
            );
        },
 
        /**
         * Set coord extent
         * @param {number} start
         * @param {number} end
         */
        setExtent: function (start, end) {
            var extent = this._extent;
            extent[0] = start;
            extent[1] = end;
        },
 
        /**
         * Convert data to coord. Data is the rank if it has a ordinal scale
         * @param {number} data
         * @param  {boolean} clamp
         * @return {number}
         */
        dataToCoord: function (data, clamp) {
            var extent = this._extent;
            var scale = this.scale;
            data = scale.normalize(data);
 
            if (this.onBand && scale.type === 'ordinal') {
                extent = extent.slice();
                fixExtentWithBands(extent, scale.count());
            }
 
            return linearMap(data, normalizedExtent, extent, clamp);
        },
 
        /**
         * Convert coord to data. Data is the rank if it has a ordinal scale
         * @param {number} coord
         * @param  {boolean} clamp
         * @return {number}
         */
        coordToData: function (coord, clamp) {
            var extent = this._extent;
            var scale = this.scale;
 
            if (this.onBand && scale.type === 'ordinal') {
                extent = extent.slice();
                fixExtentWithBands(extent, scale.count());
            }
 
            var t = linearMap(coord, extent, normalizedExtent, clamp);
 
            return this.scale.scale(t);
        },
 
        /**
         * Convert pixel point to data in axis
         * @param {Array.<number>} point
         * @param  {boolean} clamp
         * @return {number} data
         */
        pointToData: function (point, clamp) {
            // Should be implemented in derived class if necessary.
        },
 
        /**
         * @return {Array.<number>}
         */
        getTicksCoords: function (alignWithLabel) {
            if (this.onBand && !alignWithLabel) {
                var bands = this.getBands();
                var coords = [];
                for (var i = 0; i < bands.length; i++) {
                    coords.push(bands[i][0]);
                }
                if (bands[i - 1]) {
                    coords.push(bands[i - 1][1]);
                }
                return coords;
            }
            else {
                return zrUtil.map(this.scale.getTicks(), this.dataToCoord, this);
            }
        },
 
        /**
         * Coords of labels are on the ticks or on the middle of bands
         * @return {Array.<number>}
         */
        getLabelsCoords: function () {
            return zrUtil.map(this.scale.getTicks(), this.dataToCoord, this);
        },
 
        /**
         * Get bands.
         *
         * If axis has labels [1, 2, 3, 4]. Bands on the axis are
         * |---1---|---2---|---3---|---4---|.
         *
         * @return {Array}
         */
         // FIXME Situation when labels is on ticks
        getBands: function () {
            var extent = this.getExtent();
            var bands = [];
            var len = this.scale.count();
            var start = extent[0];
            var end = extent[1];
            var span = end - start;
 
            for (var i = 0; i < len; i++) {
                bands.push([
                    span * i / len + start,
                    span * (i + 1) / len + start
                ]);
            }
            return bands;
        },
 
        /**
         * Get width of band
         * @return {number}
         */
        getBandWidth: function () {
            var axisExtent = this._extent;
            var dataExtent = this.scale.getExtent();
 
            var len = dataExtent[1] - dataExtent[0] + (this.onBand ? 1 : 0);
            // Fix #2728, avoid NaN when only one data.
            len === 0 && (len = 1);
 
            var size = Math.abs(axisExtent[1] - axisExtent[0]);
 
            return Math.abs(size) / len;
        }
 
    };
 
    module.exports = Axis;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/ICoordSys.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/ICoordSys.js

Statements: 100% (0 / 0)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (0 / 0)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29                                                         
/**
 * Coordinate System Interface:
 *
 * Class members:
 *  + dimensions {Array.<strign>}: mandatory
 *
 * Instance members:
 *  + dimensions {Array.<strign>}: mandatory
 *
 *  + dataToPoint {Function}: mandatory
 *      @param {Array.<*>} data
 *      @param {boolean} [clamp=false]
 *      @return {Array.<number>} point Point in global pixel coordinate system.
 *
 *  + pointToData {Function}: mandatory
 *      @param {Array.<number>} point Point in global pixel coordinate system.
 *      @param {boolean} [clamp=false]
 *      @return {Array.<*>} data
 *
 *  + containPoint {Function}: mandatory
 *      @param {Array.<number>} point Point in global pixel coordinate system.
 *      @return {boolean}
 *
 *  + getDimensionsInfo {Function}: optional
 *      @return {Array.<string|Object>} dimensionsInfo
 *              Like [{name: ..., type: ...}, 'xxx', ...]
 */
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/View.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/View.js

Statements: 15.29% (13 / 85)      Branches: 0% (0 / 30)      Functions: 0% (0 / 20)      Lines: 15.29% (13 / 85)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297            1 1   1 1   1   1     1     1   1                                         1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     1   1           1    
/**
 * Simple view coordinate system
 * Mapping given x, y to transformd view x, y
 */
 
 
    var vector = require('zrender/lib/core/vector');
    var matrix = require('zrender/lib/core/matrix');
 
    var Transformable = require('zrender/lib/mixin/Transformable');
    var zrUtil = require('zrender/lib/core/util');
 
    var BoundingRect = require('zrender/lib/core/BoundingRect');
 
    var v2ApplyTransform = vector.applyTransform;
 
    // Dummy transform node
    function TransformDummy() {
        Transformable.call(this);
    }
    zrUtil.mixin(TransformDummy, Transformable);
 
    function View(name) {
        /**
         * @type {string}
         */
        this.name = name;
 
        /**
         * @type {Object}
         */
        this.zoomLimit;
 
        Transformable.call(this);
 
        this._roamTransform = new TransformDummy();
 
        this._viewTransform = new TransformDummy();
 
        this._center;
        this._zoom;
    }
 
    View.prototype = {
 
        constructor: View,
 
        type: 'view',
 
        /**
         * @param {Array.<string>}
         * @readOnly
         */
        dimensions: ['x', 'y'],
 
        /**
         * Set bounding rect
         * @param {number} x
         * @param {number} y
         * @param {number} width
         * @param {number} height
         */
 
        // PENDING to getRect
        setBoundingRect: function (x, y, width, height) {
            this._rect = new BoundingRect(x, y, width, height);
            return this._rect;
        },
 
        /**
         * @return {module:zrender/core/BoundingRect}
         */
        // PENDING to getRect
        getBoundingRect: function () {
            return this._rect;
        },
 
        /**
         * @param {number} x
         * @param {number} y
         * @param {number} width
         * @param {number} height
         */
        setViewRect: function (x, y, width, height) {
            this.transformTo(x, y, width, height);
            this._viewRect = new BoundingRect(x, y, width, height);
        },
 
        /**
         * Transformed to particular position and size
         * @param {number} x
         * @param {number} y
         * @param {number} width
         * @param {number} height
         */
        transformTo: function (x, y, width, height) {
            var rect = this.getBoundingRect();
            var viewTransform = this._viewTransform;
 
            viewTransform.transform = rect.calculateTransform(
                new BoundingRect(x, y, width, height)
            );
 
            viewTransform.decomposeTransform();
 
            this._updateTransform();
        },
 
        /**
         * Set center of view
         * @param {Array.<number>} [centerCoord]
         */
        setCenter: function (centerCoord) {
            if (!centerCoord) {
                return;
            }
            this._center = centerCoord;
 
            this._updateCenterAndZoom();
        },
 
        /**
         * @param {number} zoom
         */
        setZoom: function (zoom) {
            zoom = zoom || 1;
 
            var zoomLimit = this.zoomLimit;
            if (zoomLimit) {
                if (zoomLimit.max != null) {
                    zoom = Math.min(zoomLimit.max, zoom);
                }
                if (zoomLimit.min != null) {
                    zoom = Math.max(zoomLimit.min, zoom);
                }
            }
            this._zoom = zoom;
 
            this._updateCenterAndZoom();
        },
 
        /**
         * Get default center without roam
         */
        getDefaultCenter: function () {
            // Rect before any transform
            var rawRect = this.getBoundingRect();
            var cx = rawRect.x + rawRect.width / 2;
            var cy = rawRect.y + rawRect.height / 2;
 
            return [cx, cy];
        },
 
        getCenter: function () {
            return this._center || this.getDefaultCenter();
        },
 
        getZoom: function () {
            return this._zoom || 1;
        },
 
        /**
         * @return {Array.<number}
         */
        getRoamTransform: function () {
            return this._roamTransform;
        },
 
        _updateCenterAndZoom: function () {
            // Must update after view transform updated
            var viewTransformMatrix = this._viewTransform.getLocalTransform();
            var roamTransform = this._roamTransform;
            var defaultCenter = this.getDefaultCenter();
            var center = this.getCenter();
            var zoom = this.getZoom();
 
            center = vector.applyTransform([], center, viewTransformMatrix);
            defaultCenter = vector.applyTransform([], defaultCenter, viewTransformMatrix);
 
            roamTransform.origin = center;
            roamTransform.position = [
                defaultCenter[0] - center[0],
                defaultCenter[1] - center[1]
            ];
            roamTransform.scale = [zoom, zoom];
 
            this._updateTransform();
        },
 
        /**
         * Update transform from roam and mapLocation
         * @private
         */
        _updateTransform: function () {
            var roamTransform = this._roamTransform;
            var viewTransform = this._viewTransform;
 
            viewTransform.parent = roamTransform;
            roamTransform.updateTransform();
            viewTransform.updateTransform();
 
            viewTransform.transform
                && matrix.copy(this.transform || (this.transform = []), viewTransform.transform);
 
            if (this.transform) {
                this.invTransform = this.invTransform || [];
                matrix.invert(this.invTransform, this.transform);
            }
            else {
                this.invTransform = null;
            }
            this.decomposeTransform();
        },
 
        /**
         * @return {module:zrender/core/BoundingRect}
         */
        getViewRect: function () {
            return this._viewRect;
        },
 
        /**
         * Get view rect after roam transform
         * @return {module:zrender/core/BoundingRect}
         */
        getViewRectAfterRoam: function () {
            var rect = this.getBoundingRect().clone();
            rect.applyTransform(this.transform);
            return rect;
        },
 
        /**
         * Convert a single (lon, lat) data item to (x, y) point.
         * @param {Array.<number>} data
         * @return {Array.<number>}
         */
        dataToPoint: function (data) {
            var transform = this.transform;
            return transform
                ? v2ApplyTransform([], data, transform)
                : [data[0], data[1]];
        },
 
        /**
         * Convert a (x, y) point to (lon, lat) data
         * @param {Array.<number>} point
         * @return {Array.<number>}
         */
        pointToData: function (point) {
            var invTransform = this.invTransform;
            return invTransform
                ? v2ApplyTransform([], point, invTransform)
                : [point[0], point[1]];
        },
 
        /**
         * @implements
         * see {module:echarts/CoodinateSystem}
         */
        convertToPixel: zrUtil.curry(doConvert, 'dataToPoint'),
 
        /**
         * @implements
         * see {module:echarts/CoodinateSystem}
         */
        convertFromPixel: zrUtil.curry(doConvert, 'pointToData'),
 
        /**
         * @implements
         * see {module:echarts/CoodinateSystem}
         */
        containPoint: function (point) {
            return this.getViewRectAfterRoam().contain(point[0], point[1]);
        }
 
        /**
         * @return {number}
         */
        // getScalarScale: function () {
        //     // Use determinant square root of transform to mutiply scalar
        //     var m = this.transform;
        //     var det = Math.sqrt(Math.abs(m[0] * m[3] - m[2] * m[1]));
        //     return det;
        // }
    };
 
    zrUtil.mixin(View, Transformable);
 
    function doConvert(methodName, ecModel, finder, value) {
        var seriesModel = finder.seriesModel;
        var coordSys = seriesModel ? seriesModel.coordinateSystem : null; // e.g., graph.
        return coordSys === this ? coordSys[methodName](value) : null;
    }
 
    module.exports = View;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/axisDefault.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/axisDefault.js

Statements: 100% (8 / 8)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (8 / 8)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157    1   1                                                                                                                                                                                           1                                         1                                       1         1     1   1              
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    var defaultOption = {
        show: true,
        zlevel: 0,                  // 一级层叠
        z: 0,                       // 二级层叠
        // 反向坐标轴
        inverse: false,
 
        // 坐标轴名字,默认为空
        name: '',
        // 坐标轴名字位置,支持'start' | 'middle' | 'end'
        nameLocation: 'end',
        // 坐标轴名字旋转,degree。
        nameRotate: null, // Adapt to axis rotate, when nameLocation is 'middle'.
        nameTruncate: {
            maxWidth: null,
            ellipsis: '...',
            placeholder: '.'
        },
        // 坐标轴文字样式,默认取全局样式
        nameTextStyle: {},
        // 文字与轴线距离
        nameGap: 15,
 
        silent: false, // Default false to support tooltip.
        triggerEvent: false, // Default false to avoid legacy user event listener fail.
 
        tooltip: {
            show: false
        },
 
        axisPointer: {},
 
        // 坐标轴线
        axisLine: {
            // 默认显示,属性show控制显示与否
            show: true,
            onZero: true,
            // 属性lineStyle控制线条样式
            lineStyle: {
                color: '#333',
                width: 1,
                type: 'solid'
            }
        },
        // 坐标轴小标记
        axisTick: {
            // 属性show控制显示与否,默认显示
            show: true,
            // 控制小标记是否在grid里
            inside: false,
            // 属性length控制线长
            length: 5,
            // 属性lineStyle控制线条样式
            lineStyle: {
                width: 1
            }
        },
        // 坐标轴文本标签,详见axis.axisLabel
        axisLabel: {
            show: true,
            // 控制文本标签是否在grid里
            inside: false,
            rotate: 0,
            showMinLabel: null, // true | false | null (auto)
            showMaxLabel: null, // true | false | null (auto)
            margin: 8,
            // formatter: null,
            // 其余属性默认使用全局文本样式,详见TEXTSTYLE
            textStyle: {
                fontSize: 12
            }
        },
        // 分隔线
        splitLine: {
            // 默认显示,属性show控制显示与否
            show: true,
            // 属性lineStyle(详见lineStyle)控制线条样式
            lineStyle: {
                color: ['#ccc'],
                width: 1,
                type: 'solid'
            }
        },
        // 分隔区域
        splitArea: {
            // 默认不显示,属性show控制显示与否
            show: false,
            // 属性areaStyle(详见areaStyle)控制区域样式
            areaStyle: {
                color: ['rgba(250,250,250,0.3)','rgba(200,200,200,0.3)']
            }
        }
    };
 
    var categoryAxis = zrUtil.merge({
        // 类目起始和结束两端空白策略
        boundaryGap: true,
        // splitArea: {
            // show: false
        // },
        splitLine: {
            show: false
        },
        // 坐标轴小标记
        axisTick: {
            // If tick is align with label when boundaryGap is true
            alignWithLabel: false,
            interval: 'auto'
        },
        // 坐标轴文本标签,详见axis.axisLabel
        axisLabel: {
            interval: 'auto'
        }
    }, defaultOption);
 
    var valueAxis = zrUtil.merge({
        // 数值起始和结束两端空白策略
        boundaryGap: [0, 0],
        // 最小值, 设置成 'dataMin' 则从数据中计算最小值
        // min: null,
        // 最大值,设置成 'dataMax' 则从数据中计算最大值
        // max: null,
        // Readonly prop, specifies start value of the range when using data zoom.
        // rangeStart: null
        // Readonly prop, specifies end value of the range when using data zoom.
        // rangeEnd: null
        // 脱离0值比例,放大聚焦到最终_min,_max区间
        // scale: false,
        // 分割段数,默认为5
        splitNumber: 5
        // Minimum interval
        // minInterval: null
    }, defaultOption);
 
    // FIXME
    var timeAxis = zrUtil.defaults({
        scale: true,
        min: 'dataMin',
        max: 'dataMax'
    }, valueAxis);
    var logAxis = zrUtil.defaults({
        logBase: 10
    }, valueAxis);
    logAxis.scale = true;
 
    module.exports = {
        categoryAxis: categoryAxis,
        valueAxis: valueAxis,
        timeAxis: timeAxis,
        logAxis: logAxis
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/axisHelper.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/axisHelper.js

Statements: 14.41% (17 / 118)      Branches: 0% (0 / 99)      Functions: 0% (0 / 10)      Lines: 14.41% (17 / 118)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276    1 1 1 1 1   1 1 1 1           1                                                                                                                                                                               1                                                                                                         1                                         1                           1                                                                                             1                                                   1             1    
 
 
    var OrdinalScale = require('../scale/Ordinal');
    var IntervalScale = require('../scale/Interval');
    require('../scale/Time');
    require('../scale/Log');
    var Scale = require('../scale/Scale');
 
    var numberUtil = require('../util/number');
    var zrUtil = require('zrender/lib/core/util');
    var textContain = require('zrender/lib/contain/text');
    var axisHelper = {};
 
    /**
     * Get axis scale extent before niced.
     * Item of returned array can only be number (including Infinity and NaN).
     */
    axisHelper.getScaleExtent = function (scale, model) {
        var scaleType = scale.type;
 
        var min = model.getMin();
        var max = model.getMax();
        var fixMin = min != null;
        var fixMax = max != null;
        var originalExtent = scale.getExtent();
 
        var axisDataLen;
        var boundaryGap;
        var span;
        if (scaleType === 'ordinal') {
            axisDataLen = (model.get('data') || []).length;
        }
        else {
            boundaryGap = model.get('boundaryGap');
            if (!zrUtil.isArray(boundaryGap)) {
                boundaryGap = [boundaryGap || 0, boundaryGap || 0];
            }
            if (typeof boundaryGap[0] === 'boolean') {
                if (__DEV__) {
                    console.warn('Boolean type for boundaryGap is only '
                        + 'allowed for ordinal axis. Please use string in '
                        + 'percentage instead, e.g., "20%". Currently, '
                        + 'boundaryGap is set to be 0.');
                }
                boundaryGap = [0, 0];
            }
            boundaryGap[0] = numberUtil.parsePercent(boundaryGap[0], 1);
            boundaryGap[1] = numberUtil.parsePercent(boundaryGap[1], 1);
            span = (originalExtent[1] - originalExtent[0])
                || Math.abs(originalExtent[0]);
        }
 
        // Notice: When min/max is not set (that is, when there are null/undefined,
        // which is the most common case), these cases should be ensured:
        // (1) For 'ordinal', show all axis.data.
        // (2) For others:
        //      + `boundaryGap` is applied (if min/max set, boundaryGap is
        //      disabled).
        //      + If `needCrossZero`, min/max should be zero, otherwise, min/max should
        //      be the result that originalExtent enlarged by boundaryGap.
        // (3) If no data, it should be ensured that `scale.setBlank` is set.
 
        // FIXME
        // (1) When min/max is 'dataMin' or 'dataMax', should boundaryGap be able to used?
        // (2) When `needCrossZero` and all data is positive/negative, should it be ensured
        // that the results processed by boundaryGap are positive/negative?
 
        if (min == null) {
            min = scaleType === 'ordinal'
                ? (axisDataLen ? 0 : NaN)
                : originalExtent[0] - boundaryGap[0] * span;
        }
        if (max == null) {
            max = scaleType === 'ordinal'
                ? (axisDataLen ? axisDataLen - 1 : NaN)
                : originalExtent[1] + boundaryGap[1] * span;
        }
 
        if (min === 'dataMin') {
            min = originalExtent[0];
        }
        if (max === 'dataMax') {
            max = originalExtent[1];
        }
 
        (min == null || !isFinite(min)) && (min = NaN);
        (max == null || !isFinite(max)) && (max = NaN);
 
        scale.setBlank(zrUtil.eqNaN(min) || zrUtil.eqNaN(max));
 
        // Evaluate if axis needs cross zero
        if (model.getNeedCrossZero()) {
            // Axis is over zero and min is not set
            if (min > 0 && max > 0 && !fixMin) {
                min = 0;
            }
            // Axis is under zero and max is not set
            if (min < 0 && max < 0 && !fixMax) {
                max = 0;
            }
        }
 
        return [min, max];
    };
 
    axisHelper.niceScaleExtent = function (scale, model) {
        var extent = axisHelper.getScaleExtent(scale, model);
        var fixMin = model.getMin() != null;
        var fixMax = model.getMax() != null;
        var splitNumber = model.get('splitNumber');
 
        if (scale.type === 'log') {
            scale.base = model.get('logBase');
        }
 
        scale.setExtent(extent[0], extent[1]);
        scale.niceExtent(splitNumber, fixMin, fixMax);
 
        // Use minInterval to constraint the calculated interval.
        // If calculated interval is less than minInterval. increase the interval quantity until
        // it is larger than minInterval.
        // For example:
        //  minInterval is 1, calculated interval is 0.2, so increase it to be 1. In this way we can get
        //  an integer axis.
        var minInterval = model.get('minInterval');
        if (isFinite(minInterval) && !fixMin && !fixMax && scale.type === 'interval') {
            var interval = scale.getInterval();
            var intervalScale = Math.max(Math.abs(interval), minInterval) / interval;
            // while (interval < minInterval) {
            //     var quantity = numberUtil.quantity(interval);
            //     interval = quantity * 10;
            //     scaleQuantity *= 10;
            // }
            extent = scale.getExtent();
            var origin = (extent[1] + extent[0]) / 2;
            scale.setExtent(
                intervalScale * (extent[0] - origin) + origin,
                intervalScale * (extent[1] - origin) + origin
            );
            scale.niceExtent(splitNumber);
        }
 
        // If some one specified the min, max. And the default calculated interval
        // is not good enough. He can specify the interval. It is often appeared
        // in angle axis with angle 0 - 360. Interval calculated in interval scale is hard
        // to be 60.
        // FIXME
        var interval = model.get('interval');
        if (interval != null) {
            scale.setInterval && scale.setInterval(interval);
        }
    };
 
    /**
     * @param {module:echarts/model/Model} model
     * @param {string} [axisType] Default retrieve from model.type
     * @return {module:echarts/scale/*}
     */
    axisHelper.createScaleByModel = function(model, axisType) {
        axisType = axisType || model.get('type');
        if (axisType) {
            switch (axisType) {
                // Buildin scale
                case 'category':
                    return new OrdinalScale(
                        model.getCategories(), [Infinity, -Infinity]
                    );
                case 'value':
                    return new IntervalScale();
                // Extended scale, like time and log
                default:
                    return (Scale.getClass(axisType) || IntervalScale).create(model);
            }
        }
    };
 
    /**
     * Check if the axis corss 0
     */
    axisHelper.ifAxisCrossZero = function (axis) {
        var dataExtent = axis.scale.getExtent();
        var min = dataExtent[0];
        var max = dataExtent[1];
        return !((min > 0 && max > 0) || (min < 0 && max < 0));
    };
 
    /**
     * @param {Array.<number>} tickCoords In axis self coordinate.
     * @param {Array.<string>} labels
     * @param {string} font
     * @param {boolean} isAxisHorizontal
     * @return {number}
     */
    axisHelper.getAxisLabelInterval = function (tickCoords, labels, font, isAxisHorizontal) {
        // FIXME
        // 不同角的axis和label,不只是horizontal和vertical.
 
        var textSpaceTakenRect;
        var autoLabelInterval = 0;
        var accumulatedLabelInterval = 0;
 
        var step = 1;
        if (labels.length > 40) {
            // Simple optimization for large amount of labels
            step = Math.floor(labels.length / 40);
        }
 
        for (var i = 0; i < tickCoords.length; i += step) {
            var tickCoord = tickCoords[i];
            var rect = textContain.getBoundingRect(
                labels[i], font, 'center', 'top'
            );
            rect[isAxisHorizontal ? 'x' : 'y'] += tickCoord;
            // FIXME Magic number 1.5
            rect[isAxisHorizontal ? 'width' : 'height'] *= 1.3;
            if (!textSpaceTakenRect) {
                textSpaceTakenRect = rect.clone();
            }
            // There is no space for current label;
            else if (textSpaceTakenRect.intersect(rect)) {
                accumulatedLabelInterval++;
                autoLabelInterval = Math.max(autoLabelInterval, accumulatedLabelInterval);
            }
            else {
                textSpaceTakenRect.union(rect);
                // Reset
                accumulatedLabelInterval = 0;
            }
        }
        if (autoLabelInterval === 0 && step > 1) {
            return step;
        }
        return (autoLabelInterval + 1) * step - 1;
    };
 
    /**
     * @param {Object} axis
     * @param {Function} labelFormatter
     * @return {Array.<string>}
     */
    axisHelper.getFormattedLabels = function (axis, labelFormatter) {
        var scale = axis.scale;
        var labels = scale.getTicksLabels();
        var ticks = scale.getTicks();
        if (typeof labelFormatter === 'string') {
            labelFormatter = (function (tpl) {
                return function (val) {
                    return tpl.replace('{value}', val != null ? val : '');
                };
            })(labelFormatter);
            // Consider empty array
            return zrUtil.map(labels, labelFormatter);
        }
        else if (typeof labelFormatter === 'function') {
            return zrUtil.map(ticks, function (tick, idx) {
                return labelFormatter(
                    axisHelper.getAxisRawValue(axis, tick),
                    idx
                );
            }, this);
        }
        else {
            return labels;
        }
    };
 
    axisHelper.getAxisRawValue = function (axis, value) {
        // In category axis with data zoom, tick is not the original
        // index of axis.data. So tick should not be exposed to user
        // in category axis.
        return axis.type === 'category' ? axis.scale.getLabel(value) : value;
    };
 
    module.exports = axisHelper;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/axisModelCommonMixin.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/axisModelCommonMixin.js

Statements: 16.67% (4 / 24)      Branches: 0% (0 / 30)      Functions: 0% (0 / 8)      Lines: 16.67% (4 / 24)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99    1 1   1                 1                                                                                                                                                                        
 
 
    var zrUtil = require('zrender/lib/core/util');
    var axisHelper = require('./axisHelper');
 
    function getName(obj) {
        if (zrUtil.isObject(obj) && obj.value != null) {
            return obj.value;
        }
        else {
            return obj;
        }
    }
 
    module.exports = {
 
        /**
         * Format labels
         * @return {Array.<string>}
         */
        getFormattedLabels: function () {
            return axisHelper.getFormattedLabels(
                this.axis,
                this.get('axisLabel.formatter')
            );
        },
 
        /**
         * Get categories
         */
        getCategories: function () {
            return this.get('type') === 'category'
                && zrUtil.map(this.get('data'), getName);
        },
 
        /**
         * @param {boolean} origin
         * @return {number|string} min value or 'dataMin' or null/undefined (means auto) or NaN
         */
        getMin: function (origin) {
            var option = this.option;
            var min = (!origin && option.rangeStart != null)
                ? option.rangeStart : option.min;
 
            if (this.axis && min != null && min !== 'dataMin' && !zrUtil.eqNaN(min)) {
                min = this.axis.scale.parse(min);
            }
            return min;
        },
 
        /**
         * @param {boolean} origin
         * @return {number|string} max value or 'dataMax' or null/undefined (means auto) or NaN
         */
        getMax: function (origin) {
            var option = this.option;
            var max = (!origin && option.rangeEnd != null)
                ? option.rangeEnd : option.max;
 
            if (this.axis && max != null && max !== 'dataMax' && !zrUtil.eqNaN(max)) {
                max = this.axis.scale.parse(max);
            }
            return max;
        },
 
        /**
         * @return {boolean}
         */
        getNeedCrossZero: function () {
            var option = this.option;
            return (option.rangeStart != null || option.rangeEnd != null)
                ? false : !option.scale;
        },
 
        /**
         * Should be implemented by each axis model if necessary.
         * @return {module:echarts/model/Component} coordinate system model
         */
        getCoordSysModel: zrUtil.noop,
 
        /**
         * @param {number} rangeStart Can only be finite number or null/undefined or NaN.
         * @param {number} rangeEnd Can only be finite number or null/undefined or NaN.
         */
        setRange: function (rangeStart, rangeEnd) {
            this.option.rangeStart = rangeStart;
            this.option.rangeEnd = rangeEnd;
        },
 
        /**
         * Reset range
         */
        resetRange: function () {
            // rangeStart and rangeEnd is readonly.
            this.option.rangeStart = this.option.rangeEnd = null;
        }
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/axisModelCreator.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/axisModelCreator.js

Statements: 52.94% (9 / 17)      Branches: 0% (0 / 4)      Functions: 66.67% (2 / 3)      Lines: 52.94% (9 / 17)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59    1 1 1 1     1                 1   6   24                                                             6            
 
 
    var axisDefault = require('./axisDefault');
    var zrUtil = require('zrender/lib/core/util');
    var ComponentModel = require('../model/Component');
    var layout = require('../util/layout');
 
    // FIXME axisType is fixed ?
    var AXIS_TYPES = ['value', 'category', 'time', 'log'];
 
    /**
     * Generate sub axis model class
     * @param {string} axisName 'x' 'y' 'radius' 'angle' 'parallel'
     * @param {module:echarts/model/Component} BaseAxisModelClass
     * @param {Function} axisTypeDefaulter
     * @param {Object} [extraDefaultOption]
     */
    module.exports = function (axisName, BaseAxisModelClass, axisTypeDefaulter, extraDefaultOption) {
 
        zrUtil.each(AXIS_TYPES, function (axisType) {
 
            BaseAxisModelClass.extend({
 
                type: axisName + 'Axis.' + axisType,
 
                mergeDefaultAndTheme: function (option, ecModel) {
                    var layoutMode = this.layoutMode;
                    var inputPositionParams = layoutMode
                        ? layout.getLayoutParams(option) : {};
 
                    var themeModel = ecModel.getTheme();
                    zrUtil.merge(option, themeModel.get(axisType + 'Axis'));
                    zrUtil.merge(option, this.getDefaultOption());
 
                    option.type = axisTypeDefaulter(axisName, option);
 
                    if (layoutMode) {
                        layout.mergeLayoutParam(option, inputPositionParams, layoutMode);
                    }
                },
 
                defaultOption: zrUtil.mergeAll(
                    [
                        {},
                        axisDefault[axisType + 'Axis'],
                        extraDefaultOption
                    ],
                    true
                )
            });
        });
 
        ComponentModel.registerSubTypeDefaulter(
            axisName + 'Axis',
            zrUtil.curry(axisTypeDefaulter, axisName)
        );
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/axisModelZoomMixin.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/axisModelZoomMixin.js

Statements: 6.25% (1 / 16)      Branches: 0% (0 / 12)      Functions: 0% (0 / 5)      Lines: 6.25% (1 / 16)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65    1                                                                                                                            
 
 
    module.exports = {
 
        /**
         * @public
         * @return {Array.<number|string|Date>}
         */
        getMin: function () {
            var option = this.option;
            var min = option.rangeStart != null ? option.rangeStart : option.min;
            // In case of axis.type === 'time', Date should be converted to timestamp.
            // In other cases, min/max should be a number or null/undefined or 'dataMin/Max'.
            if (min instanceof Date) {
                min = +min;
            }
            return min;
        },
 
        /**
         * @public
         * @return {Array.<number|string|Date>}
         */
        getMax: function () {
            var option = this.option;
            var max = option.rangeEnd != null ? option.rangeEnd : option.max;
            // In case of axis.type === 'time', Date should be converted to timestamp.
            // In other cases, min/max should be a number or null/undefined or 'dataMin/Max'.
            if (max instanceof Date) {
                max = +max;
            }
            return max;
        },
 
        /**
         * @public
         * @return {boolean}
         */
        getNeedCrossZero: function () {
            var option = this.option;
            return (option.rangeStart != null || option.rangeEnd != null)
                ? false : !option.scale;
        },
 
        /**
         * @public
         * @param {number} rangeStart
         * @param {number} rangeEnd
         */
        setRange: function (rangeStart, rangeEnd) {
            this.option.rangeStart = rangeStart;
            this.option.rangeEnd = rangeEnd;
        },
 
        /**
         * @public
         */
        resetRange: function () {
            // rangeStart and rangeEnd is readonly.
            this.option.rangeStart = this.option.rangeEnd = null;
        }
    };
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/calendar/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/calendar/

Statements: 13.67% (19 / 139)      Branches: 0% (0 / 69)      Functions: 0% (0 / 30)      Lines: 13.67% (19 / 139)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/coord/calendar/
File Statements Branches Functions Lines
Calendar.js 11.02% (13 / 118) 0% (0 / 61) 0% (0 / 26) 11.02% (13 / 118)
CalendarModel.js 28.57% (6 / 21) 0% (0 / 8) 0% (0 / 4) 28.57% (6 / 21)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/calendar/Calendar.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/calendar/Calendar.js

Statements: 11.02% (13 / 118)      Branches: 0% (0 / 61)      Functions: 0% (0 / 26)      Lines: 11.02% (13 / 118)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423      1 1 1     1                     1       1                                                                                                                                                                                                                                                           1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 1   1   1                                   1                         1   1      
'use strict';
 
 
    var layout = require('../../util/layout');
    var numberUtil = require('../../util/number');
    var zrUtil = require('zrender/lib/core/util');
 
    // (24*60*60*1000)
    var ONE_DAY = 86400000;
 
    /**
     * Calendar
     *
     * @constructor
     *
     * @param {Object} calendarModel calendarModel
     * @param {Object} ecModel       ecModel
     * @param {Object} api           api
     */
    function Calendar(calendarModel, ecModel, api) {
        this._model = calendarModel;
    }
 
    Calendar.prototype = {
 
        constructor: Calendar,
 
        type: 'calendar',
 
        dimensions: ['time', 'value'],
 
        // Required in createListFromData
        getDimensionsInfo: function () {
            return [{name: 'time', type: 'time'}];
        },
 
        getHandledRangeInfo: function () {
            return this._rangeInfo;
        },
 
        getModel: function () {
            return this._model;
        },
 
        getRect: function () {
            return this._rect;
        },
 
        getCellWidth: function () {
            return this._sw;
        },
 
        getCellHeight: function () {
            return this._sh;
        },
 
        getOrient: function () {
            return this._orient;
        },
 
        /**
         * getFirstDayOfWeek
         *
         * @example
         *     0 : start at Sunday
         *     1 : start at Monday
         *
         * @return {number}
         */
        getFirstDayOfWeek: function () {
            return this._firstDayOfWeek;
        },
 
        /**
         * get date info
         *
         * @param  {string|number} date date
         * @return {Object}      info
         */
        getDateInfo: function (date) {
 
            date = numberUtil.parseDate(date);
 
            var y = date.getFullYear();
 
            var m = date.getMonth() + 1;
            m = m < 10 ? '0' + m : m;
 
            var d = date.getDate();
            d = d < 10 ? '0' + d : d;
 
            var day = date.getDay();
 
            day = Math.abs((day + 7 - this.getFirstDayOfWeek()) % 7);
 
            return {
                y: y,
                m: m,
                d: d,
                day: day,
                time: date.getTime(),
                formatedDate: y + '-' + m + '-' + d,
                date: date
            };
        },
 
        getNextNDay: function (date, n) {
            n = n || 0;
            if (n === 0) {
                return this.getDateInfo(date);
            }
 
            var time = this.getDateInfo(date).time;
 
            return this.getDateInfo(time + ONE_DAY * n);
        },
 
        update: function (ecModel, api) {
 
            this._firstDayOfWeek = this._model.getModel('dayLabel').get('firstDay');
            this._orient = this._model.get('orient');
            this._lineWidth = this._model.getModel('itemStyle.normal').getItemStyle().lineWidth || 0;
 
 
            this._rangeInfo = this._getRangeInfo(this._initRangeOption());
            var weeks = this._rangeInfo.weeks || 1;
            var whNames = ['width', 'height'];
            var cellSize = this._model.get('cellSize').slice();
            var layoutParams = this._model.getBoxLayoutParams();
            var cellNumbers = this._orient === 'horizontal' ? [weeks, 7] : [7, weeks];
 
            zrUtil.each([0, 1], function (idx) {
                if (cellSizeSpecified(cellSize, idx)) {
                    layoutParams[whNames[idx]] = cellSize[idx] * cellNumbers[idx];
                }
            });
 
            var whGlobal = {
                width: api.getWidth(),
                height: api.getHeight()
            };
            var calendarRect = this._rect = layout.getLayoutRect(layoutParams, whGlobal);
 
            zrUtil.each([0, 1], function (idx) {
                if (!cellSizeSpecified(cellSize, idx)) {
                    cellSize[idx] = calendarRect[whNames[idx]] / cellNumbers[idx];
                }
            });
 
            function cellSizeSpecified(cellSize, idx) {
                return cellSize[idx] != null && cellSize[idx] !== 'auto';
            }
 
            this._sw = cellSize[0];
            this._sh = cellSize[1];
        },
 
 
        /**
         * Convert a time data(time, value) item to (x, y) point.
         *
         * @override
         * @param  {Array} data  data
         * @param  {boolean} noClip  out of range
         * @return {Array}       point
         */
        dataToPoint: function (data, noClip) {
 
            var dayInfo = this.getDateInfo(data[0]);
            var range = this._rangeInfo;
            var date = dayInfo.formatedDate;
 
            // if not in range return [NaN, NaN]
            if (!noClip && !(dayInfo.time >= range.start.time && dayInfo.time <= range.end.time)) {
                return [NaN, NaN];
            }
 
            var week = dayInfo.day;
            var nthWeek = this._getRangeInfo([range.start.time, date]).weeks;
 
            if (this._orient === 'vertical') {
                return [
                    this._rect.x + week * this._sw + this._sw / 2,
                    this._rect.y + (nthWeek - 1) * this._sh + this._sh / 2
                ];
 
            }
 
            return [
                this._rect.x + (nthWeek - 1) * this._sw + this._sw / 2,
                this._rect.y + week * this._sh + this._sh / 2
            ];
 
        },
 
        /**
         * Convert a (x, y) point to time data
         *
         * @override
         * @param  {string} point point
         * @return {string}       data
         */
        pointToData: function (point) {
 
            var date = this.pointToDate(point);
 
            return date && date.time;
        },
 
        /**
         * Convert a time date item to (x, y) four point.
         *
         * @param  {Array} data  date[0] is date
         * @param  {boolean} noClip  out of range
         * @return {Object}       point
         */
        dataToRect: function (data, noClip) {
 
            var point = this.dataToPoint(data, noClip);
 
            return {
                contentShape: {
                    x: point[0] - (this._sw - this._lineWidth) / 2,
                    y: point[1] - (this._sh - this._lineWidth) / 2,
                    width: this._sw - this._lineWidth,
                    height: this._sh - this._lineWidth
                },
 
                center: point,
 
                tl: [
                    point[0] - this._sw / 2,
                    point[1] - this._sh / 2
                ],
 
                tr: [
                    point[0] + this._sw / 2,
                    point[1] - this._sh / 2
                ],
 
                br: [
                    point[0] + this._sw / 2,
                    point[1] + this._sh / 2
                ],
 
                bl: [
                    point[0] - this._sw / 2,
                    point[1] + this._sh / 2
                ]
 
            };
        },
 
        /**
         * Convert a (x, y) point to time date
         *
         * @param  {string} point point
         * @return {Object}       date
         */
        pointToDate: function (point) {
            var nthX = Math.floor((point[0] - this._rect.x) / this._sw) + 1;
            var nthY = Math.floor((point[1] - this._rect.y) / this._sh) + 1;
            var range = this._rangeInfo.range;
 
            if (this._orient === 'vertical') {
                return this._getDateByWeeksAndDay(nthY, nthX - 1, range);
            }
 
            return this._getDateByWeeksAndDay(nthX, nthY - 1, range);
        },
 
        /**
         * @override
         * @implements
         * see {module:echarts/CoodinateSystem}
         */
        convertToPixel: zrUtil.curry(doConvert, 'dataToPoint'),
 
        /**
         * @override
         * @implements
         * see {module:echarts/CoodinateSystem}
         */
        convertFromPixel: zrUtil.curry(doConvert, 'pointToData'),
 
        /**
         * initRange
         *
         * @private
         * @return {Array} [start, end]
         */
        _initRangeOption: function () {
            var range = this._model.get('range');
 
            var rg = range;
 
            if (zrUtil.isArray(rg) && rg.length === 1) {
                rg = rg[0];
            }
 
            if (/^\d{4}$/.test(rg)) {
                range = [rg + '-01-01', rg + '-12-31'];
            }
 
            if (/^\d{4}[\/|-]\d{1,2}$/.test(rg)) {
 
                var start = this.getDateInfo(rg);
                var firstDay = start.date;
                firstDay.setMonth(firstDay.getMonth() + 1);
 
                var end = this.getNextNDay(firstDay, -1);
                range = [start.formatedDate, end.formatedDate];
            }
 
            if (/^\d{4}[\/|-]\d{1,2}[\/|-]\d{1,2}$/.test(rg)) {
                range = [rg, rg];
            }
 
            var tmp = this._getRangeInfo(range);
 
            if (tmp.start.time > tmp.end.time) {
                range.reverse();
            }
 
            return range;
        },
 
        /**
         * range info
         *
         * @private
         * @param  {Array} range range ['2017-01-01', '2017-07-08']
         * @return {Object}       obj
         */
        _getRangeInfo: function (range) {
 
            var start = this.getDateInfo(range[0]);
            var end = this.getDateInfo(range[1]);
 
            var allDay = Math.floor(end.time / ONE_DAY) - Math.floor(start.time / ONE_DAY) + 1;
 
            var weeks = Math.floor((allDay + start.day + 6) / 7);
 
            return {
                range: [start.formatedDate, end.formatedDate],
                start: start,
                end: end,
                allDay: allDay,
                weeks: weeks,
                fweek: start.day,
                lweek: end.day
            };
        },
 
        /**
         * get date by nthWeeks and week day in range
         *
         * @private
         * @param  {number} nthWeek the week
         * @param  {number} day   the week day
         * @param  {Array} range [d1, d2]
         * @return {Object}
         */
        _getDateByWeeksAndDay: function (nthWeek, day, range) {
            var rangeInfo = this._getRangeInfo(range);
 
            if (nthWeek > rangeInfo.weeks
                || (nthWeek === 0 && day < rangeInfo.fweek)
                || (nthWeek === rangeInfo.weeks && day > rangeInfo.lweek)
            ) {
                return false;
            }
 
            var nthDay = (nthWeek - 1) * 7 - rangeInfo.fweek + day;
 
            var time = rangeInfo.start.time + nthDay * ONE_DAY;
 
            return this.getDateInfo(time);
 
        }
    };
 
    Calendar.dimensions =  Calendar.prototype.dimensions;
 
    Calendar.getDimensionsInfo =  Calendar.prototype.getDimensionsInfo;
 
    Calendar.create = function (ecModel, api) {
        var calendarList = [];
 
        ecModel.eachComponent('calendar', function (calendarModel) {
            var calendar = new Calendar(calendarModel, ecModel, api);
            calendarList.push(calendar);
            calendarModel.coordinateSystem = calendar;
        });
 
        ecModel.eachSeries(function (calendarSeries) {
            if (calendarSeries.get('coordinateSystem') === 'calendar') {
                // Inject coordinate system
                calendarSeries.coordinateSystem = calendarList[calendarSeries.get('calendarIndex') || 0];
            }
        });
        return calendarList;
    };
 
    function doConvert(methodName, ecModel, finder, value) {
        var calendarModel = finder.calendarModel;
        var seriesModel = finder.seriesModel;
 
        var coordSys = calendarModel
            ? calendarModel.coordinateSystem
            : seriesModel
            ? seriesModel.coordinateSystem
            : null;
 
        return coordSys === this ? coordSys[methodName](value) : null;
    }
 
    require('../../CoordinateSystem').register('calendar', Calendar);
 
    module.exports = Calendar;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/calendar/CalendarModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/calendar/CalendarModel.js

Statements: 28.57% (6 / 21)      Branches: 0% (0 / 8)      Functions: 0% (0 / 4)      Lines: 28.57% (6 / 21)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150      1 1 1   1                                                                                                                                                                                                                               1                                                   1        
'use strict';
 
 
    var ComponentModel = require('../../model/Component');
    var zrUtil = require('zrender/lib/core/util');
    var layout = require('../../util/layout');
 
    var CalendarModel = ComponentModel.extend({
 
        type: 'calendar',
 
        /**
         * @type {module:echarts/coord/calendar/Calendar}
         */
        coordinateSystem: null,
 
        defaultOption: {
            zlevel: 0,
            z: 2,
            left: 80,
            top: 60,
 
            cellSize: 20,
 
            // horizontal vertical
            orient: 'horizontal',
 
            // month separate line style
            splitLine: {
                show: true,
                lineStyle: {
                    color: '#000',
                    width: 1,
                    type: 'solid'
                }
            },
 
            // rect style  temporarily unused emphasis
            itemStyle: {
                normal: {
                    color: '#fff',
                    borderWidth: 1,
                    borderColor: '#ccc'
                }
            },
 
            // week text style
            dayLabel: {
                show: true,
 
                // a week first day
                firstDay: 0,
 
                // start end
                position: 'start',
                margin: '50%', // 50% of cellSize
                nameMap: 'en',
                textStyle: {
                    color: '#000'
                }
            },
 
            // month text style
            monthLabel: {
                show: true,
 
                // start end
                position: 'start',
                margin: 5,
 
                // center or left
                align: 'center',
 
                // cn en []
                nameMap: 'en',
                formatter: null,
                textStyle: {
                    color: '#000'
                }
            },
 
            // year text style
            yearLabel: {
                show: true,
 
                // top bottom left right
                position: null,
                margin: 30,
                formatter: null,
                textStyle: {
                    color: '#ccc',
                    fontFamily: 'sans-serif',
                    fontWeight: 'bolder',
                    fontSize: 20
                }
            }
        },
 
        /**
         * @override
         */
        init: function (option, parentModel, ecModel, extraOpt) {
            var inputPositionParams = layout.getLayoutParams(option);
 
            CalendarModel.superApply(this, 'init', arguments);
 
            mergeAndNormalizeLayoutParams(option, inputPositionParams);
        },
 
        /**
         * @override
         */
        mergeOption: function (option, extraOpt) {
            CalendarModel.superApply(this, 'mergeOption', arguments);
 
            mergeAndNormalizeLayoutParams(this.option, option);
        }
    });
 
    function mergeAndNormalizeLayoutParams(target, raw) {
        // Normalize cellSize
        var cellSize = target.cellSize;
 
        if (!zrUtil.isArray(cellSize)) {
            cellSize = target.cellSize = [cellSize, cellSize];
        }
        else if (cellSize.length === 1) {
            cellSize[1] = cellSize[0];
        }
 
        var ignoreSize = zrUtil.map([0, 1], function (hvIdx) {
            // If user have set `width` or both `left` and `right`, cellSize
            // will be automatically set to 'auto', otherwise the default
            // setting of cellSize will make `width` setting not work.
            if (layout.sizeCalculable(raw, hvIdx)) {
                cellSize[hvIdx] = 'auto';
            }
            return cellSize[hvIdx] != null && cellSize[hvIdx] !== 'auto';
        });
 
        layout.mergeLayoutParam(target, raw, {
            type: 'box', ignoreSize: ignoreSize
        });
    }
 
    module.exports = CalendarModel;
 
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/cartesian/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/cartesian/

Statements: 20.88% (76 / 364)      Branches: 0% (0 / 182)      Functions: 0% (0 / 77)      Lines: 20.88% (76 / 364)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/coord/cartesian/
File Statements Branches Functions Lines
Axis2D.js 26.92% (7 / 26) 0% (0 / 18) 0% (0 / 7) 26.92% (7 / 26)
AxisModel.js 55.56% (10 / 18) 0% (0 / 4) 0% (0 / 5) 55.56% (10 / 18)
Cartesian.js 19.23% (5 / 26) 0% (0 / 4) 0% (0 / 10) 19.23% (5 / 26)
Cartesian2D.js 28.57% (6 / 21) 0% (0 / 9) 0% (0 / 9) 28.57% (6 / 21)
Grid.js 16.09% (42 / 261) 0% (0 / 141) 0% (0 / 45) 16.09% (42 / 261)
GridModel.js 100% (3 / 3) 100% (0 / 0) 100% (0 / 0) 100% (3 / 3)
axisLabelInterval.js 33.33% (3 / 9) 0% (0 / 6) 0% (0 / 1) 33.33% (3 / 9)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/cartesian/Axis2D.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/cartesian/Axis2D.js

Statements: 26.92% (7 / 26)      Branches: 0% (0 / 18)      Functions: 0% (0 / 7)      Lines: 26.92% (7 / 26)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138    1 1 1                       1                                           1                                                                                                                                                                                             1   1    
 
 
    var zrUtil = require('zrender/lib/core/util');
    var Axis = require('../Axis');
    var axisLabelInterval = require('./axisLabelInterval');
 
    /**
     * Extend axis 2d
     * @constructor module:echarts/coord/cartesian/Axis2D
     * @extends {module:echarts/coord/cartesian/Axis}
     * @param {string} dim
     * @param {*} scale
     * @param {Array.<number>} coordExtent
     * @param {string} axisType
     * @param {string} position
     */
    var Axis2D = function (dim, scale, coordExtent, axisType, position) {
        Axis.call(this, dim, scale, coordExtent);
        /**
         * Axis type
         *  - 'category'
         *  - 'value'
         *  - 'time'
         *  - 'log'
         * @type {string}
         */
        this.type = axisType || 'value';
 
        /**
         * Axis position
         *  - 'top'
         *  - 'bottom'
         *  - 'left'
         *  - 'right'
         */
        this.position = position || 'bottom';
    };
 
    Axis2D.prototype = {
 
        constructor: Axis2D,
 
        /**
         * Index of axis, can be used as key
         */
        index: 0,
        /**
         * If axis is on the zero position of the other axis
         * @type {boolean}
         */
        onZero: false,
 
        /**
         * Axis model
         * @param {module:echarts/coord/cartesian/AxisModel}
         */
        model: null,
 
        isHorizontal: function () {
            var position = this.position;
            return position === 'top' || position === 'bottom';
        },
 
        /**
         * Each item cooresponds to this.getExtent(), which
         * means globalExtent[0] may greater than globalExtent[1],
         * unless `asc` is input.
         *
         * @param {boolean} [asc]
         * @return {Array.<number>}
         */
        getGlobalExtent: function (asc) {
            var ret = this.getExtent();
            ret[0] = this.toGlobalCoord(ret[0]);
            ret[1] = this.toGlobalCoord(ret[1]);
            asc && ret[0] > ret[1] && ret.reverse();
            return ret;
        },
 
        getOtherAxis: function () {
            this.grid.getOtherAxis();
        },
 
        /**
         * @return {number}
         */
        getLabelInterval: function () {
            var labelInterval = this._labelInterval;
            if (!labelInterval) {
                labelInterval = this._labelInterval = axisLabelInterval(this);
            }
            return labelInterval;
        },
 
        /**
         * If label is ignored.
         * Automatically used when axis is category and label can not be all shown
         * @param  {number}  idx
         * @return {boolean}
         */
        isLabelIgnored: function (idx) {
            if (this.type === 'category') {
                var labelInterval = this.getLabelInterval();
                return ((typeof labelInterval === 'function')
                    && !labelInterval(idx, this.scale.getLabel(idx)))
                    || idx % (labelInterval + 1);
            }
        },
 
        /**
         * @override
         */
        pointToData: function (point, clamp) {
            return this.coordToData(this.toLocalCoord(point[this.dim === 'x' ? 0 : 1]), clamp);
        },
 
        /**
         * Transform global coord to local coord,
         * i.e. var localCoord = axis.toLocalCoord(80);
         * designate by module:echarts/coord/cartesian/Grid.
         * @type {Function}
         */
        toLocalCoord: null,
 
        /**
         * Transform global coord to local coord,
         * i.e. var globalCoord = axis.toLocalCoord(40);
         * designate by module:echarts/coord/cartesian/Grid.
         * @type {Function}
         */
        toGlobalCoord: null
 
    };
    zrUtil.inherits(Axis2D, Axis);
 
    module.exports = Axis2D;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/cartesian/AxisModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/cartesian/AxisModel.js

Statements: 55.56% (10 / 18)      Branches: 0% (0 / 4)      Functions: 0% (0 / 5)      Lines: 55.56% (10 / 18)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75      1 1 1   1                                                                                             1         1   1               1 1   1    
'use strict';
 
 
    var ComponentModel = require('../../model/Component');
    var zrUtil = require('zrender/lib/core/util');
    var axisModelCreator = require('../axisModelCreator');
 
    var AxisModel = ComponentModel.extend({
 
        type: 'cartesian2dAxis',
 
        /**
         * @type {module:echarts/coord/cartesian/Axis2D}
         */
        axis: null,
 
        /**
         * @override
         */
        init: function () {
            AxisModel.superApply(this, 'init', arguments);
            this.resetRange();
        },
 
        /**
         * @override
         */
        mergeOption: function () {
            AxisModel.superApply(this, 'mergeOption', arguments);
            this.resetRange();
        },
 
        /**
         * @override
         */
        restoreData: function () {
            AxisModel.superApply(this, 'restoreData', arguments);
            this.resetRange();
        },
 
        /**
         * @override
         * @return {module:echarts/model/Component}
         */
        getCoordSysModel: function () {
            return this.ecModel.queryComponents({
                mainType: 'grid',
                index: this.option.gridIndex,
                id: this.option.gridId
            })[0];
        }
 
    });
 
    function getAxisType(axisDim, option) {
        // Default axis with data is category axis
        return option.type || (option.data ? 'category' : 'value');
    }
 
    zrUtil.merge(AxisModel.prototype, require('../axisModelCommonMixin'));
 
    var extraOption = {
        // gridIndex: 0,
        // gridId: '',
 
        // Offset is for multiple axis on the same position
        offset: 0
    };
 
    axisModelCreator('x', AxisModel, getAxisType, extraOption);
    axisModelCreator('y', AxisModel, getAxisType, extraOption);
 
    module.exports = AxisModel;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/cartesian/Cartesian.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/cartesian/Cartesian.js

Statements: 19.23% (5 / 26)      Branches: 0% (0 / 4)      Functions: 0% (0 / 10)      Lines: 19.23% (5 / 26)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114                1   1               1                     1                                                                                                                                                                   1    
'use strict';
/**
 * Cartesian coordinate system
 * @module  echarts/coord/Cartesian
 *
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    function dimAxisMapper(dim) {
        return this._axes[dim];
    }
 
    /**
     * @alias module:echarts/coord/Cartesian
     * @constructor
     */
    var Cartesian = function (name) {
        this._axes = {};
 
        this._dimList = [];
 
        /**
         * @type {string}
         */
        this.name = name || '';
    };
 
    Cartesian.prototype = {
 
        constructor: Cartesian,
 
        type: 'cartesian',
 
        /**
         * Get axis
         * @param  {number|string} dim
         * @return {module:echarts/coord/Cartesian~Axis}
         */
        getAxis: function (dim) {
            return this._axes[dim];
        },
 
        /**
         * Get axes list
         * @return {Array.<module:echarts/coord/Cartesian~Axis>}
         */
        getAxes: function () {
            return zrUtil.map(this._dimList, dimAxisMapper, this);
        },
 
        /**
         * Get axes list by given scale type
         */
        getAxesByScale: function (scaleType) {
            scaleType = scaleType.toLowerCase();
            return zrUtil.filter(
                this.getAxes(),
                function (axis) {
                    return axis.scale.type === scaleType;
                }
            );
        },
 
        /**
         * Add axis
         * @param {module:echarts/coord/Cartesian.Axis}
         */
        addAxis: function (axis) {
            var dim = axis.dim;
 
            this._axes[dim] = axis;
 
            this._dimList.push(dim);
        },
 
        /**
         * Convert data to coord in nd space
         * @param {Array.<number>|Object.<string, number>} val
         * @return {Array.<number>|Object.<string, number>}
         */
        dataToCoord: function (val) {
            return this._dataCoordConvert(val, 'dataToCoord');
        },
 
        /**
         * Convert coord in nd space to data
         * @param  {Array.<number>|Object.<string, number>} val
         * @return {Array.<number>|Object.<string, number>}
         */
        coordToData: function (val) {
            return this._dataCoordConvert(val, 'coordToData');
        },
 
        _dataCoordConvert: function (input, method) {
            var dimList = this._dimList;
 
            var output = input instanceof Array ? [] : {};
 
            for (var i = 0; i < dimList.length; i++) {
                var dim = dimList[i];
                var axis = this._axes[dim];
 
                output[dim] = axis[method](input[dim]);
            }
 
            return output;
        }
    };
 
    module.exports = Cartesian;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/cartesian/Cartesian2D.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/cartesian/Cartesian2D.js

Statements: 28.57% (6 / 21)      Branches: 0% (0 / 9)      Functions: 0% (0 / 9)      Lines: 28.57% (6 / 21)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112      1 1   1         1                                                                                                                                                                                               1   1    
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
    var Cartesian = require('./Cartesian');
 
    function Cartesian2D(name) {
 
        Cartesian.call(this, name);
    }
 
    Cartesian2D.prototype = {
 
        constructor: Cartesian2D,
 
        type: 'cartesian2d',
 
        /**
         * @type {Array.<string>}
         * @readOnly
         */
        dimensions: ['x', 'y'],
 
        /**
         * Base axis will be used on stacking.
         *
         * @return {module:echarts/coord/cartesian/Axis2D}
         */
        getBaseAxis: function () {
            return this.getAxesByScale('ordinal')[0]
                || this.getAxesByScale('time')[0]
                || this.getAxis('x');
        },
 
        /**
         * If contain point
         * @param {Array.<number>} point
         * @return {boolean}
         */
        containPoint: function (point) {
            var axisX = this.getAxis('x');
            var axisY = this.getAxis('y');
            return axisX.contain(axisX.toLocalCoord(point[0]))
                && axisY.contain(axisY.toLocalCoord(point[1]));
        },
 
        /**
         * If contain data
         * @param {Array.<number>} data
         * @return {boolean}
         */
        containData: function (data) {
            return this.getAxis('x').containData(data[0])
                && this.getAxis('y').containData(data[1]);
        },
 
        /**
         * Convert series data to an array of points
         * @param {module:echarts/data/List} data
         * @param {boolean} stack
         * @return {Array}
         *  Return array of points. For example:
         *  `[[10, 10], [20, 20], [30, 30]]`
         */
        dataToPoints: function (data, stack) {
            return data.mapArray(['x', 'y'], function (x, y) {
                return this.dataToPoint([x, y]);
            }, stack, this);
        },
 
        /**
         * @param {Array.<number>} data
         * @param {boolean} [clamp=false]
         * @return {Array.<number>}
         */
        dataToPoint: function (data, clamp) {
            var xAxis = this.getAxis('x');
            var yAxis = this.getAxis('y');
            return [
                xAxis.toGlobalCoord(xAxis.dataToCoord(data[0], clamp)),
                yAxis.toGlobalCoord(yAxis.dataToCoord(data[1], clamp))
            ];
        },
 
        /**
         * @param {Array.<number>} point
         * @param {boolean} [clamp=false]
         * @return {Array.<number>}
         */
        pointToData: function (point, clamp) {
            var xAxis = this.getAxis('x');
            var yAxis = this.getAxis('y');
            return [
                xAxis.coordToData(xAxis.toLocalCoord(point[0]), clamp),
                yAxis.coordToData(yAxis.toLocalCoord(point[1]), clamp)
            ];
        },
 
        /**
         * Get other axis
         * @param {module:echarts/coord/cartesian/Axis2D} axis
         */
        getOtherAxis: function (axis) {
            return this.getAxis(axis.dim === 'x' ? 'y' : 'x');
        }
    };
 
    zrUtil.inherits(Cartesian2D, Cartesian);
 
    module.exports = Cartesian2D;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/cartesian/Grid.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/cartesian/Grid.js

Statements: 16.09% (42 / 261)      Branches: 0% (0 / 141)      Functions: 0% (0 / 45)      Lines: 16.09% (42 / 261)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609          1   1 1   1 1 1   1   1 1     1           1       1                                         1                                                           1   1   1   1       1           1                                                                                       1                                                                       1                             1                                   1                           1                                       1               1                           1                         1                                                                             1                     1                                                                                             1                                                                                                                                     1                                                             1                     1                                   1                                         1       1                                       1       1                                                                                                   1   1   1    
/**
 * Grid is a region which contains at most 4 cartesian systems
 *
 * TODO Default cartesian
 */
var factory = exports;
 
    var layout = require('../../util/layout');
    var axisHelper = require('../../coord/axisHelper');
 
    var zrUtil = require('zrender/lib/core/util');
    var Cartesian2D = require('./Cartesian2D');
    var Axis2D = require('./Axis2D');
 
    var each = zrUtil.each;
 
    var ifAxisCrossZero = axisHelper.ifAxisCrossZero;
    var niceScaleExtent = axisHelper.niceScaleExtent;
 
    // 依赖 GridModel, AxisModel 做预处理
    require('./GridModel');
 
    /**
     * Check if the axis is used in the specified grid
     * @inner
     */
    function isAxisUsedInTheGrid(axisModel, gridModel, ecModel) {
        return axisModel.getCoordSysModel() === gridModel;
    }
 
    function getLabelUnionRect(axis) {
        var axisModel = axis.model;
        var labels = axisModel.getFormattedLabels();
        var textStyleModel = axisModel.getModel('axisLabel.textStyle');
        var rect;
        var step = 1;
        var labelCount = labels.length;
        if (labelCount > 40) {
            // Simple optimization for large amount of labels
            step = Math.ceil(labelCount / 40);
        }
        for (var i = 0; i < labelCount; i += step) {
            if (!axis.isLabelIgnored(i)) {
                var singleRect = textStyleModel.getTextRect(labels[i]);
                // FIXME consider label rotate
                rect ? rect.union(singleRect) : (rect = singleRect);
            }
        }
        return rect;
    }
 
    function Grid(gridModel, ecModel, api) {
        /**
         * @type {Object.<string, module:echarts/coord/cartesian/Cartesian2D>}
         * @private
         */
        this._coordsMap = {};
 
        /**
         * @type {Array.<module:echarts/coord/cartesian/Cartesian>}
         * @private
         */
        this._coordsList = [];
 
        /**
         * @type {Object.<string, module:echarts/coord/cartesian/Axis2D>}
         * @private
         */
        this._axesMap = {};
 
        /**
         * @type {Array.<module:echarts/coord/cartesian/Axis2D>}
         * @private
         */
        this._axesList = [];
 
        this._initCartesian(gridModel, ecModel, api);
 
        this.model = gridModel;
    }
 
    var gridProto = Grid.prototype;
 
    gridProto.type = 'grid';
 
    gridProto.axisPointerEnabled = true;
 
    gridProto.getRect = function () {
        return this._rect;
    };
 
    gridProto.update = function (ecModel, api) {
 
        var axesMap = this._axesMap;
 
        this._updateScale(ecModel, this.model);
 
        function ifAxisCanNotOnZero(otherAxisDim) {
            var axes = axesMap[otherAxisDim];
            for (var idx in axes) {
                if (axes.hasOwnProperty(idx)) {
                    var axis = axes[idx];
                    if (axis && (axis.type === 'category' || !ifAxisCrossZero(axis))) {
                        return true;
                    }
                }
            }
            return false;
        }
 
        each(axesMap.x, function (xAxis) {
            niceScaleExtent(xAxis.scale, xAxis.model);
        });
        each(axesMap.y, function (yAxis) {
            niceScaleExtent(yAxis.scale, yAxis.model);
        });
        // Fix configuration
        each(axesMap.x, function (xAxis) {
            // onZero can not be enabled in these two situations
            // 1. When any other axis is a category axis
            // 2. When any other axis not across 0 point
            if (ifAxisCanNotOnZero('y')) {
                xAxis.onZero = false;
            }
        });
        each(axesMap.y, function (yAxis) {
            if (ifAxisCanNotOnZero('x')) {
                yAxis.onZero = false;
            }
        });
 
        // Resize again if containLabel is enabled
        // FIXME It may cause getting wrong grid size in data processing stage
        this.resize(this.model, api);
    };
 
    /**
     * Resize the grid
     * @param {module:echarts/coord/cartesian/GridModel} gridModel
     * @param {module:echarts/ExtensionAPI} api
     */
    gridProto.resize = function (gridModel, api) {
 
        var gridRect = layout.getLayoutRect(
            gridModel.getBoxLayoutParams(), {
                width: api.getWidth(),
                height: api.getHeight()
            });
 
        this._rect = gridRect;
 
        var axesList = this._axesList;
 
        adjustAxes();
 
        // Minus label size
        if (gridModel.get('containLabel')) {
            each(axesList, function (axis) {
                if (!axis.model.get('axisLabel.inside')) {
                    var labelUnionRect = getLabelUnionRect(axis);
                    if (labelUnionRect) {
                        var dim = axis.isHorizontal() ? 'height' : 'width';
                        var margin = axis.model.get('axisLabel.margin');
                        gridRect[dim] -= labelUnionRect[dim] + margin;
                        if (axis.position === 'top') {
                            gridRect.y += labelUnionRect.height + margin;
                        }
                        else if (axis.position === 'left')  {
                            gridRect.x += labelUnionRect.width + margin;
                        }
                    }
                }
            });
 
            adjustAxes();
        }
 
        function adjustAxes() {
            each(axesList, function (axis) {
                var isHorizontal = axis.isHorizontal();
                var extent = isHorizontal ? [0, gridRect.width] : [0, gridRect.height];
                var idx = axis.inverse ? 1 : 0;
                axis.setExtent(extent[idx], extent[1 - idx]);
                updateAxisTransfrom(axis, isHorizontal ? gridRect.x : gridRect.y);
            });
        }
    };
 
    /**
     * @param {string} axisType
     * @param {ndumber} [axisIndex]
     */
    gridProto.getAxis = function (axisType, axisIndex) {
        var axesMapOnDim = this._axesMap[axisType];
        if (axesMapOnDim != null) {
            if (axisIndex == null) {
                // Find first axis
                for (var name in axesMapOnDim) {
                    if (axesMapOnDim.hasOwnProperty(name)) {
                        return axesMapOnDim[name];
                    }
                }
            }
            return axesMapOnDim[axisIndex];
        }
    };
 
    /**
     * @return {Array.<module:echarts/coord/Axis>}
     */
    gridProto.getAxes = function () {
        return this._axesList.slice();
    };
 
    /**
     * Usage:
     *      grid.getCartesian(xAxisIndex, yAxisIndex);
     *      grid.getCartesian(xAxisIndex);
     *      grid.getCartesian(null, yAxisIndex);
     *      grid.getCartesian({xAxisIndex: ..., yAxisIndex: ...});
     *
     * @param {number|Object} [xAxisIndex]
     * @param {number} [yAxisIndex]
     */
    gridProto.getCartesian = function (xAxisIndex, yAxisIndex) {
        if (xAxisIndex != null && yAxisIndex != null) {
            var key = 'x' + xAxisIndex + 'y' + yAxisIndex;
            return this._coordsMap[key];
        }
 
        if (zrUtil.isObject(xAxisIndex)) {
            yAxisIndex = xAxisIndex.yAxisIndex;
            xAxisIndex = xAxisIndex.xAxisIndex;
        }
        // When only xAxisIndex or yAxisIndex given, find its first cartesian.
        for (var i = 0, coordList = this._coordsList; i < coordList.length; i++) {
            if (coordList[i].getAxis('x').index === xAxisIndex
                || coordList[i].getAxis('y').index === yAxisIndex
            ) {
                return coordList[i];
            }
        }
    };
 
    gridProto.getCartesians = function () {
        return this._coordsList.slice();
    };
 
    /**
     * @implements
     * see {module:echarts/CoodinateSystem}
     */
    gridProto.convertToPixel = function (ecModel, finder, value) {
        var target = this._findConvertTarget(ecModel, finder);
 
        return target.cartesian
            ? target.cartesian.dataToPoint(value)
            : target.axis
            ? target.axis.toGlobalCoord(target.axis.dataToCoord(value))
            : null;
    };
 
    /**
     * @implements
     * see {module:echarts/CoodinateSystem}
     */
    gridProto.convertFromPixel = function (ecModel, finder, value) {
        var target = this._findConvertTarget(ecModel, finder);
 
        return target.cartesian
            ? target.cartesian.pointToData(value)
            : target.axis
            ? target.axis.coordToData(target.axis.toLocalCoord(value))
            : null;
    };
 
    /**
     * @inner
     */
    gridProto._findConvertTarget = function (ecModel, finder) {
        var seriesModel = finder.seriesModel;
        var xAxisModel = finder.xAxisModel
            || (seriesModel && seriesModel.getReferringComponents('xAxis')[0]);
        var yAxisModel = finder.yAxisModel
            || (seriesModel && seriesModel.getReferringComponents('yAxis')[0]);
        var gridModel = finder.gridModel;
        var coordsList = this._coordsList;
        var cartesian;
        var axis;
 
        if (seriesModel) {
            cartesian = seriesModel.coordinateSystem;
            zrUtil.indexOf(coordsList, cartesian) < 0 && (cartesian = null);
        }
        else if (xAxisModel && yAxisModel) {
            cartesian = this.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex);
        }
        else if (xAxisModel) {
            axis = this.getAxis('x', xAxisModel.componentIndex);
        }
        else if (yAxisModel) {
            axis = this.getAxis('y', yAxisModel.componentIndex);
        }
        // Lowest priority.
        else if (gridModel) {
            var grid = gridModel.coordinateSystem;
            if (grid === this) {
                cartesian = this._coordsList[0];
            }
        }
 
        return {cartesian: cartesian, axis: axis};
    };
 
    /**
     * @implements
     * see {module:echarts/CoodinateSystem}
     */
    gridProto.containPoint = function (point) {
        var coord = this._coordsList[0];
        if (coord) {
            return coord.containPoint(point);
        }
    };
 
    /**
     * Initialize cartesian coordinate systems
     * @private
     */
    gridProto._initCartesian = function (gridModel, ecModel, api) {
        var axisPositionUsed = {
            left: false,
            right: false,
            top: false,
            bottom: false
        };
 
        var axesMap = {
            x: {},
            y: {}
        };
        var axesCount = {
            x: 0,
            y: 0
        };
 
        /// Create axis
        ecModel.eachComponent('xAxis', createAxisCreator('x'), this);
        ecModel.eachComponent('yAxis', createAxisCreator('y'), this);
 
        if (!axesCount.x || !axesCount.y) {
            // Roll back when there no either x or y axis
            this._axesMap = {};
            this._axesList = [];
            return;
        }
 
        this._axesMap = axesMap;
 
        /// Create cartesian2d
        each(axesMap.x, function (xAxis, xAxisIndex) {
            each(axesMap.y, function (yAxis, yAxisIndex) {
                var key = 'x' + xAxisIndex + 'y' + yAxisIndex;
                var cartesian = new Cartesian2D(key);
 
                cartesian.grid = this;
                cartesian.model = gridModel;
 
                this._coordsMap[key] = cartesian;
                this._coordsList.push(cartesian);
 
                cartesian.addAxis(xAxis);
                cartesian.addAxis(yAxis);
            }, this);
        }, this);
 
        function createAxisCreator(axisType) {
            return function (axisModel, idx) {
                if (!isAxisUsedInTheGrid(axisModel, gridModel, ecModel)) {
                    return;
                }
 
                var axisPosition = axisModel.get('position');
                if (axisType === 'x') {
                    // Fix position
                    if (axisPosition !== 'top' && axisPosition !== 'bottom') {
                        // Default bottom of X
                        axisPosition = 'bottom';
                        if (axisPositionUsed[axisPosition]) {
                            axisPosition = axisPosition === 'top' ? 'bottom' : 'top';
                        }
                    }
                }
                else {
                    // Fix position
                    if (axisPosition !== 'left' && axisPosition !== 'right') {
                        // Default left of Y
                        axisPosition = 'left';
                        if (axisPositionUsed[axisPosition]) {
                            axisPosition = axisPosition === 'left' ? 'right' : 'left';
                        }
                    }
                }
                axisPositionUsed[axisPosition] = true;
 
                var axis = new Axis2D(
                    axisType, axisHelper.createScaleByModel(axisModel),
                    [0, 0],
                    axisModel.get('type'),
                    axisPosition
                );
 
                var isCategory = axis.type === 'category';
                axis.onBand = isCategory && axisModel.get('boundaryGap');
                axis.inverse = axisModel.get('inverse');
 
                axis.onZero = axisModel.get('axisLine.onZero');
 
                // Inject axis into axisModel
                axisModel.axis = axis;
 
                // Inject axisModel into axis
                axis.model = axisModel;
 
                // Inject grid info axis
                axis.grid = this;
 
                // Index of axis, can be used as key
                axis.index = idx;
 
                this._axesList.push(axis);
 
                axesMap[axisType][idx] = axis;
                axesCount[axisType]++;
            };
        }
    };
 
    /**
     * Update cartesian properties from series
     * @param  {module:echarts/model/Option} option
     * @private
     */
    gridProto._updateScale = function (ecModel, gridModel) {
        // Reset scale
        zrUtil.each(this._axesList, function (axis) {
            axis.scale.setExtent(Infinity, -Infinity);
        });
        ecModel.eachSeries(function (seriesModel) {
            if (isCartesian2D(seriesModel)) {
                var axesModels = findAxesModels(seriesModel, ecModel);
                var xAxisModel = axesModels[0];
                var yAxisModel = axesModels[1];
 
                if (!isAxisUsedInTheGrid(xAxisModel, gridModel, ecModel)
                    || !isAxisUsedInTheGrid(yAxisModel, gridModel, ecModel)
                 ) {
                    return;
                }
 
                var cartesian = this.getCartesian(
                    xAxisModel.componentIndex, yAxisModel.componentIndex
                );
                var data = seriesModel.getData();
                var xAxis = cartesian.getAxis('x');
                var yAxis = cartesian.getAxis('y');
 
                if (data.type === 'list') {
                    unionExtent(data, xAxis, seriesModel);
                    unionExtent(data, yAxis, seriesModel);
                }
            }
        }, this);
 
        function unionExtent(data, axis, seriesModel) {
            each(seriesModel.coordDimToDataDim(axis.dim), function (dim) {
                axis.scale.unionExtentFromData(data, dim);
            });
        }
    };
 
    /**
     * @param {string} [dim] 'x' or 'y' or 'auto' or null/undefined
     * @return {Object} {baseAxes: [], otherAxes: []}
     */
    gridProto.getTooltipAxes = function (dim) {
        var baseAxes = [];
        var otherAxes = [];
 
        each(this.getCartesians(), function (cartesian) {
            var baseAxis = (dim != null && dim !== 'auto')
                ? cartesian.getAxis(dim) : cartesian.getBaseAxis();
            var otherAxis = cartesian.getOtherAxis(baseAxis);
            zrUtil.indexOf(baseAxes, baseAxis) < 0 && baseAxes.push(baseAxis);
            zrUtil.indexOf(otherAxes, otherAxis) < 0 && otherAxes.push(otherAxis);
        });
 
        return {baseAxes: baseAxes, otherAxes: otherAxes};
    };
 
    /**
     * @inner
     */
    function updateAxisTransfrom(axis, coordBase) {
        var axisExtent = axis.getExtent();
        var axisExtentSum = axisExtent[0] + axisExtent[1];
 
        // Fast transform
        axis.toGlobalCoord = axis.dim === 'x'
            ? function (coord) {
                return coord + coordBase;
            }
            : function (coord) {
                return axisExtentSum - coord + coordBase;
            };
        axis.toLocalCoord = axis.dim === 'x'
            ? function (coord) {
                return coord - coordBase;
            }
            : function (coord) {
                return axisExtentSum - coord + coordBase;
            };
    }
 
    var axesTypes = ['xAxis', 'yAxis'];
    /**
     * @inner
     */
    function findAxesModels(seriesModel, ecModel) {
        return zrUtil.map(axesTypes, function (axisType) {
            var axisModel = seriesModel.getReferringComponents(axisType)[0];
 
            if (__DEV__) {
                if (!axisModel) {
                    throw new Error(axisType + ' "' + zrUtil.retrieve(
                        seriesModel.get(axisType + 'Index'),
                        seriesModel.get(axisType + 'Id'),
                        0
                    ) + '" not found');
                }
            }
            return axisModel;
        });
    }
 
    /**
     * @inner
     */
    function isCartesian2D(seriesModel) {
        return seriesModel.get('coordinateSystem') === 'cartesian2d';
    }
 
    Grid.create = function (ecModel, api) {
        var grids = [];
        ecModel.eachComponent('grid', function (gridModel, idx) {
            var grid = new Grid(gridModel, ecModel, api);
            grid.name = 'grid_' + idx;
            grid.resize(gridModel, api);
 
            gridModel.coordinateSystem = grid;
 
            grids.push(grid);
        });
 
        // Inject the coordinateSystems into seriesModel
        ecModel.eachSeries(function (seriesModel) {
            if (!isCartesian2D(seriesModel)) {
                return;
            }
 
            var axesModels = findAxesModels(seriesModel, ecModel);
            var xAxisModel = axesModels[0];
            var yAxisModel = axesModels[1];
 
            var gridModel = xAxisModel.getCoordSysModel();
 
            if (__DEV__) {
                if (!gridModel) {
                    throw new Error(
                        'Grid "' + zrUtil.retrieve(
                            xAxisModel.get('gridIndex'),
                            xAxisModel.get('gridId'),
                            0
                        ) + '" not found'
                    );
                }
                if (xAxisModel.getCoordSysModel() !== yAxisModel.getCoordSysModel()) {
                    throw new Error('xAxis and yAxis must use the same grid');
                }
            }
 
            var grid = gridModel.coordinateSystem;
 
            seriesModel.coordinateSystem = grid.getCartesian(
                xAxisModel.componentIndex, yAxisModel.componentIndex
            );
        });
 
        return grids;
    };
 
    // For deciding which dimensions to use when creating list data
    Grid.dimensions = Grid.prototype.dimensions = Cartesian2D.prototype.dimensions;
 
    require('../../CoordinateSystem').register('cartesian2d', Grid);
 
    module.exports = Grid;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/cartesian/GridModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/cartesian/GridModel.js

Statements: 100% (3 / 3)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (3 / 3)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41          1   1   1                                                              
'use strict';
// Grid 是在有直角坐标系的时候必须要存在的
// 所以这里也要被 Cartesian2D 依赖
 
 
    require('./AxisModel');
 
    var ComponentModel = require('../../model/Component');
 
    module.exports = ComponentModel.extend({
 
        type: 'grid',
 
        dependencies: ['xAxis', 'yAxis'],
 
        layoutMode: 'box',
 
        /**
         * @type {module:echarts/coord/cartesian/Grid}
         */
        coordinateSystem: null,
 
        defaultOption: {
            show: false,
            zlevel: 0,
            z: 0,
            left: '10%',
            top: 60,
            right: '10%',
            bottom: 60,
            // If grid size contain label
            containLabel: false,
            // width: {totalWidth} - left - right,
            // height: {totalHeight} - top - bottom,
            backgroundColor: 'rgba(0,0,0,0)',
            borderWidth: 1,
            borderColor: '#ccc'
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/cartesian/axisLabelInterval.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/cartesian/axisLabelInterval.js

Statements: 33.33% (3 / 9)      Branches: 0% (0 / 6)      Functions: 0% (0 / 1)      Lines: 33.33% (3 / 9)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27              1 1   1                                
'use strict';
/**
 * Helper function for axisLabelInterval calculation
 */
 
 
 
    var zrUtil = require('zrender/lib/core/util');
    var axisHelper = require('../axisHelper');
 
    module.exports = function (axis) {
        var axisModel = axis.model;
        var labelModel = axisModel.getModel('axisLabel');
        var labelInterval = labelModel.get('interval');
        if (!(axis.type === 'category' && labelInterval === 'auto')) {
            return labelInterval === 'auto' ? 0 : labelInterval;
        }
 
        return axisHelper.getAxisLabelInterval(
            zrUtil.map(axis.scale.getTicks(), axis.dataToCoord, axis),
            axisModel.getFormattedLabels(),
            labelModel.getModel('textStyle').getFont(),
            axis.isHorizontal()
        );
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/geo/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/geo/

Statements: 14.09% (51 / 362)      Branches: 2.47% (4 / 162)      Functions: 2.13% (1 / 47)      Lines: 14.13% (51 / 361)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/coord/geo/
File Statements Branches Functions Lines
Geo.js 12.82% (10 / 78) 0% (0 / 34) 0% (0 / 14) 12.82% (10 / 78)
GeoModel.js 29.03% (9 / 31) 0% (0 / 12) 0% (0 / 7) 29.03% (9 / 31)
Region.js 9.86% (7 / 71) 0% (0 / 26) 0% (0 / 4) 10% (7 / 70)
geoCreator.js 15.87% (20 / 126) 5.48% (4 / 73) 6.25% (1 / 16) 15.87% (20 / 126)
parseGeoJson.js 8.93% (5 / 56) 0% (0 / 17) 0% (0 / 6) 8.93% (5 / 56)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/geo/Geo.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/geo/Geo.js

Statements: 12.82% (10 / 78)      Branches: 0% (0 / 34)      Functions: 0% (0 / 14)      Lines: 12.82% (10 / 78)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262    1   1   1   1       1                               1                             1                                                                                                                                                                                                                                                                                                                                                                                                           1   1                               1    
 
 
    var parseGeoJson = require('./parseGeoJson');
 
    var zrUtil = require('zrender/lib/core/util');
 
    var BoundingRect = require('zrender/lib/core/BoundingRect');
 
    var View = require('../View');
 
 
    // Geo fix functions
    var geoFixFuncs = [
        require('./fix/nanhai'),
        require('./fix/textCoord'),
        require('./fix/geoCoord')
    ];
 
    /**
     * [Geo description]
     * @param {string} name Geo name
     * @param {string} map Map type
     * @param {Object} geoJson
     * @param {Object} [specialAreas]
     *        Specify the positioned areas by left, top, width, height
     * @param {Object.<string, string>} [nameMap]
     *        Specify name alias
     */
    function Geo(name, map, geoJson, specialAreas, nameMap) {
 
        View.call(this, name);
 
        /**
         * Map type
         * @type {string}
         */
        this.map = map;
 
        this._nameCoordMap = {};
 
        this.loadGeoJson(geoJson, specialAreas, nameMap);
    }
 
    Geo.prototype = {
 
        constructor: Geo,
 
        type: 'geo',
 
        /**
         * @param {Array.<string>}
         * @readOnly
         */
        dimensions: ['lng', 'lat'],
 
        /**
         * If contain given lng,lat coord
         * @param {Array.<number>}
         * @readOnly
         */
        containCoord: function (coord) {
            var regions = this.regions;
            for (var i = 0; i < regions.length; i++) {
                if (regions[i].contain(coord)) {
                    return true;
                }
            }
            return false;
        },
        /**
         * @param {Object} geoJson
         * @param {Object} [specialAreas]
         *        Specify the positioned areas by left, top, width, height
         * @param {Object.<string, string>} [nameMap]
         *        Specify name alias
         */
        loadGeoJson: function (geoJson, specialAreas, nameMap) {
            // https://jsperf.com/try-catch-performance-overhead
            try {
                this.regions = geoJson ? parseGeoJson(geoJson) : [];
            }
            catch (e) {
                throw 'Invalid geoJson format\n' + e.message;
            }
            specialAreas = specialAreas || {};
            nameMap = nameMap || {};
            var regions = this.regions;
            var regionsMap = {};
            for (var i = 0; i < regions.length; i++) {
                var regionName = regions[i].name;
                // Try use the alias in nameMap
                regionName = nameMap[regionName] || regionName;
                regions[i].name = regionName;
 
                regionsMap[regionName] = regions[i];
                // Add geoJson
                this.addGeoCoord(regionName, regions[i].center);
 
                // Some area like Alaska in USA map needs to be tansformed
                // to look better
                var specialArea = specialAreas[regionName];
                if (specialArea) {
                    regions[i].transformTo(
                        specialArea.left, specialArea.top, specialArea.width, specialArea.height
                    );
                }
            }
 
            this._regionsMap = regionsMap;
 
            this._rect = null;
 
            zrUtil.each(geoFixFuncs, function (fixFunc) {
                fixFunc(this);
            }, this);
        },
 
        // Overwrite
        transformTo: function (x, y, width, height) {
            var rect = this.getBoundingRect();
 
            rect = rect.clone();
            // Longitute is inverted
            rect.y = -rect.y - rect.height;
 
            var viewTransform = this._viewTransform;
 
            viewTransform.transform = rect.calculateTransform(
                new BoundingRect(x, y, width, height)
            );
 
            viewTransform.decomposeTransform();
 
            var scale = viewTransform.scale;
            scale[1] = -scale[1];
 
            viewTransform.updateTransform();
 
            this._updateTransform();
        },
 
        /**
         * @param {string} name
         * @return {module:echarts/coord/geo/Region}
         */
        getRegion: function (name) {
            return this._regionsMap[name];
        },
 
        getRegionByCoord: function (coord) {
            var regions = this.regions;
            for (var i = 0; i < regions.length; i++) {
                if (regions[i].contain(coord)) {
                    return regions[i];
                }
            }
        },
 
        /**
         * Add geoCoord for indexing by name
         * @param {string} name
         * @param {Array.<number>} geoCoord
         */
        addGeoCoord: function (name, geoCoord) {
            this._nameCoordMap[name] = geoCoord;
        },
 
        /**
         * Get geoCoord by name
         * @param {string} name
         * @return {Array.<number>}
         */
        getGeoCoord: function (name) {
            return this._nameCoordMap[name];
        },
 
        // Overwrite
        getBoundingRect: function () {
            if (this._rect) {
                return this._rect;
            }
            var rect;
 
            var regions = this.regions;
            for (var i = 0; i < regions.length; i++) {
                var regionRect = regions[i].getBoundingRect();
                rect = rect || regionRect.clone();
                rect.union(regionRect);
            }
            // FIXME Always return new ?
            return (this._rect = rect || new BoundingRect(0, 0, 0, 0));
        },
 
        /**
         * Convert series data to a list of points
         * @param {module:echarts/data/List} data
         * @param {boolean} stack
         * @return {Array}
         *  Return list of points. For example:
         *  `[[10, 10], [20, 20], [30, 30]]`
         */
        dataToPoints: function (data) {
            var item = [];
            return data.mapArray(['lng', 'lat'], function (lon, lat) {
                item[0] = lon;
                item[1] = lat;
                return this.dataToPoint(item);
            }, this);
        },
 
        // Overwrite
        /**
         * @param {string|Array.<number>} data
         * @return {Array.<number>}
         */
        dataToPoint: function (data) {
            if (typeof data === 'string') {
                // Map area name to geoCoord
                data = this.getGeoCoord(data);
            }
            if (data) {
                return View.prototype.dataToPoint.call(this, data);
            }
        },
 
        /**
         * @override
         * @implements
         * see {module:echarts/CoodinateSystem}
         */
        convertToPixel: zrUtil.curry(doConvert, 'dataToPoint'),
 
        /**
         * @override
         * @implements
         * see {module:echarts/CoodinateSystem}
         */
        convertFromPixel: zrUtil.curry(doConvert, 'pointToData')
 
    };
 
    zrUtil.mixin(Geo, View);
 
    function doConvert(methodName, ecModel, finder, value) {
        var geoModel = finder.geoModel;
        var seriesModel = finder.seriesModel;
 
        var coordSys = geoModel
            ? geoModel.coordinateSystem
            : seriesModel
            ? (
                seriesModel.coordinateSystem // For map.
                || (seriesModel.getReferringComponents('geo')[0] || {}).coordinateSystem
            )
            : null;
 
        return coordSys === this ? coordSys[methodName](value) : null;
    }
 
    module.exports = Geo;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/geo/GeoModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/geo/GeoModel.js

Statements: 29.03% (9 / 31)      Branches: 0% (0 / 12)      Functions: 0% (0 / 7)      Lines: 29.03% (9 / 31)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169    1 1 1 1   1   1   1                                                                                                                                                                                                                                                                                                                 1   1    
'use strict';
 
    var modelUtil = require('../../util/model');
    var ComponentModel = require('../../model/Component');
    var Model = require('../../model/Model');
    var zrUtil = require('zrender/lib/core/util');
 
    var selectableMixin = require('../../component/helper/selectableMixin');
 
    var geoCreator = require('./geoCreator');
 
    var GeoModel = ComponentModel.extend({
 
        type: 'geo',
 
        /**
         * @type {module:echarts/coord/geo/Geo}
         */
        coordinateSystem: null,
 
        layoutMode: 'box',
 
        init: function (option) {
            ComponentModel.prototype.init.apply(this, arguments);
 
            // Default label emphasis `position` and `show`
            modelUtil.defaultEmphasis(
                option.label, ['position', 'show', 'textStyle', 'distance', 'formatter']
            );
        },
 
        optionUpdated: function () {
            var option = this.option;
            var self = this;
 
            option.regions = geoCreator.getFilledRegions(option.regions, option.map);
 
            this._optionModelMap = zrUtil.reduce(option.regions || [], function (obj, regionOpt) {
                if (regionOpt.name) {
                    obj[regionOpt.name] = new Model(regionOpt, self);
                }
                return obj;
            }, {});
 
            this.updateSelectedMap(option.regions);
        },
 
        defaultOption: {
 
            zlevel: 0,
 
            z: 0,
 
            show: true,
 
            left: 'center',
 
            top: 'center',
 
 
            // width:,
            // height:,
            // right
            // bottom
 
            // Aspect is width / height. Inited to be geoJson bbox aspect
            // This parameter is used for scale this aspect
            aspectScale: 0.75,
 
            ///// Layout with center and size
            // If you wan't to put map in a fixed size box with right aspect ratio
            // This two properties may more conveninet
            // layoutCenter: [50%, 50%]
            // layoutSize: 100
 
 
            silent: false,
 
            // Map type
            map: '',
 
            // Define left-top, right-bottom coords to control view
            // For example, [ [180, 90], [-180, -90] ]
            boundingCoords: null,
 
            // Default on center of map
            center: null,
 
            zoom: 1,
 
            scaleLimit: null,
 
            // selectedMode: false
 
            label: {
                normal: {
                    show: false,
                    textStyle: {
                        color: '#000'
                    }
                },
                emphasis: {
                    show: true,
                    textStyle: {
                        color: 'rgb(100,0,0)'
                    }
                }
            },
 
            itemStyle: {
                normal: {
                    // color: 各异,
                    borderWidth: 0.5,
                    borderColor: '#444',
                    color: '#eee'
                },
                emphasis: {                 // 也是选中样式
                    color: 'rgba(255,215,0,0.8)'
                }
            },
 
            regions: []
        },
 
        /**
         * Get model of region
         * @param  {string} name
         * @return {module:echarts/model/Model}
         */
        getRegionModel: function (name) {
            return this._optionModelMap[name] || new Model(null, this, this.ecModel);
        },
 
        /**
         * Format label
         * @param {string} name Region name
         * @param {string} [status='normal'] 'normal' or 'emphasis'
         * @return {string}
         */
        getFormattedLabel: function (name, status) {
            var regionModel = this.getRegionModel(name);
            var formatter = regionModel.get('label.' + status + '.formatter');
            var params = {
                name: name
            };
            if (typeof formatter === 'function') {
                params.status = status;
                return formatter(params);
            }
            else if (typeof formatter === 'string') {
                var serName = params.seriesName;
                return formatter.replace('{a}', serName != null ? serName : '');
            }
        },
 
        setZoom: function (zoom) {
            this.option.zoom = zoom;
        },
 
        setCenter: function (center) {
            this.option.center = center;
        }
    });
 
    zrUtil.mixin(GeoModel, selectableMixin);
 
    module.exports = GeoModel;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/geo/Region.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/geo/Region.js

Statements: 9.86% (7 / 71)      Branches: 0% (0 / 26)      Functions: 0% (0 / 4)      Lines: 10% (7 / 70)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160          1   1   1 1             1                                                           1                                                                                                                                                                                                                           1    
/**
 * @module echarts/coord/geo/Region
 */
 
 
    var polygonContain = require('zrender/lib/contain/polygon');
 
    var BoundingRect = require('zrender/lib/core/BoundingRect');
 
    var bbox = require('zrender/lib/core/bbox');
    var vec2 = require('zrender/lib/core/vector');
 
    /**
     * @param {string} name
     * @param {Array} geometries
     * @param {Array.<number>} cp
     */
    function Region(name, geometries, cp) {
 
        /**
         * @type {string}
         * @readOnly
         */
        this.name = name;
 
        /**
         * @type {Array.<Array>}
         * @readOnly
         */
        this.geometries = geometries;
 
        if (!cp) {
            var rect = this.getBoundingRect();
            cp = [
                rect.x + rect.width / 2,
                rect.y + rect.height / 2
            ];
        }
        else {
            cp = [cp[0], cp[1]];
        }
        /**
         * @type {Array.<number>}
         */
        this.center = cp;
    }
 
    Region.prototype = {
 
        constructor: Region,
 
        properties: null,
 
        /**
         * @return {module:zrender/core/BoundingRect}
         */
        getBoundingRect: function () {
            var rect = this._rect;
            if (rect) {
                return rect;
            }
 
            var MAX_NUMBER = Number.MAX_VALUE;
            var min = [MAX_NUMBER, MAX_NUMBER];
            var max = [-MAX_NUMBER, -MAX_NUMBER];
            var min2 = [];
            var max2 = [];
            var geometries = this.geometries;
            for (var i = 0; i < geometries.length; i++) {
                // Only support polygon
                if (geometries[i].type !== 'polygon') {
                    continue;
                }
                // Doesn't consider hole
                var exterior = geometries[i].exterior;
                bbox.fromPoints(exterior, min2, max2);
                vec2.min(min, min, min2);
                vec2.max(max, max, max2);
            }
            // No data
            if (i === 0) {
                min[0] = min[1] = max[0] = max[1] = 0;
            }
 
            return (this._rect = new BoundingRect(
                min[0], min[1], max[0] - min[0], max[1] - min[1]
            ));
        },
 
        /**
         * @param {<Array.<number>} coord
         * @return {boolean}
         */
        contain: function (coord) {
            var rect = this.getBoundingRect();
            var geometries = this.geometries;
            if (!rect.contain(coord[0], coord[1])) {
                return false;
            }
            loopGeo: for (var i = 0, len = geometries.length; i < len; i++) {
                // Only support polygon.
                if (geometries[i].type !== 'polygon') {
                    continue;
                }
                var exterior = geometries[i].exterior;
                var interiors = geometries[i].interiors;
                if (polygonContain.contain(exterior, coord[0], coord[1])) {
                    // Not in the region if point is in the hole.
                    for (var k = 0; k < (interiors ? interiors.length : 0); k++) {
                        if (polygonContain.contain(interiors[k])) {
                            continue loopGeo;
                        }
                    }
                    return true;
                }
            }
            return false;
        },
 
        transformTo: function (x, y, width, height) {
            var rect = this.getBoundingRect();
            var aspect = rect.width / rect.height;
            if (!width) {
                width = aspect * height;
            }
            else if (!height) {
                height = width / aspect ;
            }
            var target = new BoundingRect(x, y, width, height);
            var transform = rect.calculateTransform(target);
            var geometries = this.geometries;
            for (var i = 0; i < geometries.length; i++) {
                // Only support polygon.
                if (geometries[i].type !== 'polygon') {
                    continue;
                }
                var exterior = geometries[i].exterior;
                var interiors = geometries[i].interiors;
                for (var p = 0; p < exterior.length; p++) {
                    vec2.applyTransform(exterior[p], exterior[p], transform);
                }
                for (var h = 0; h < (interiors ? interiors.length : 0); h++) {
                    for (var p = 0; p < interiors[h].length; p++) {
                        vec2.applyTransform(interiors[h][p], interiors[h][p], transform);
                    }
                }
            }
            rect = this._rect;
            rect.copy(target);
            // Update center
            this.center = [
                rect.x + rect.width / 2,
                rect.y + rect.height / 2
            ];
        }
    };
 
    module.exports = Region;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/geo/geoCreator.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/geo/geoCreator.js

Statements: 15.87% (20 / 126)      Branches: 5.48% (4 / 73)      Functions: 6.25% (1 / 16)      Lines: 15.87% (20 / 126)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297    1   1 1 1   1             1                                                                                                                                                                             1           1 1         1                                                                                                                                                                                                                     3       3       3                                                                                                       1   1   1   1     1   1   1    
 
 
    var Geo = require('./Geo');
 
    var layout = require('../../util/layout');
    var zrUtil = require('zrender/lib/core/util');
    var numberUtil = require('../../util/number');
 
    var mapDataStores = {};
 
    /**
     * Resize method bound to the geo
     * @param {module:echarts/coord/geo/GeoModel|module:echarts/chart/map/MapModel} geoModel
     * @param {module:echarts/ExtensionAPI} api
     */
    function resizeGeo (geoModel, api) {
 
        var boundingCoords = geoModel.get('boundingCoords');
        if (boundingCoords != null) {
            var leftTop = boundingCoords[0];
            var rightBottom = boundingCoords[1];
            if (isNaN(leftTop[0]) || isNaN(leftTop[1]) || isNaN(rightBottom[0]) || isNaN(rightBottom[1])) {
                if (__DEV__) {
                    console.error('Invalid boundingCoords');
                }
            }
            else {
                this.setBoundingRect(leftTop[0], leftTop[1], rightBottom[0] - leftTop[0], rightBottom[1] - leftTop[1]);
            }
        }
 
        var rect = this.getBoundingRect();
 
        var boxLayoutOption;
 
        var center = geoModel.get('layoutCenter');
        var size = geoModel.get('layoutSize');
 
        var viewWidth = api.getWidth();
        var viewHeight = api.getHeight();
 
        var aspectScale = geoModel.get('aspectScale') || 0.75;
        var aspect = rect.width / rect.height * aspectScale;
 
        var useCenterAndSize = false;
 
        if (center && size) {
            center = [
                numberUtil.parsePercent(center[0], viewWidth),
                numberUtil.parsePercent(center[1], viewHeight)
            ];
            size = numberUtil.parsePercent(size, Math.min(viewWidth, viewHeight));
 
            if (!isNaN(center[0]) && !isNaN(center[1]) && !isNaN(size)) {
                useCenterAndSize = true;
            }
            else {
                if (__DEV__) {
                    console.warn('Given layoutCenter or layoutSize data are invalid. Use left/top/width/height instead.');
                }
            }
        }
 
        var viewRect;
        if (useCenterAndSize) {
            var viewRect = {};
            if (aspect > 1) {
                // Width is same with size
                viewRect.width = size;
                viewRect.height = size / aspect;
            }
            else {
                viewRect.height = size;
                viewRect.width = size * aspect;
            }
            viewRect.y = center[1] - viewRect.height / 2;
            viewRect.x = center[0] - viewRect.width / 2;
        }
        else {
            // Use left/top/width/height
            boxLayoutOption = geoModel.getBoxLayoutParams();
 
            // 0.75 rate
            boxLayoutOption.aspect = aspect;
 
            viewRect = layout.getLayoutRect(boxLayoutOption, {
                width: viewWidth,
                height: viewHeight
            });
        }
 
        this.setViewRect(viewRect.x, viewRect.y, viewRect.width, viewRect.height);
 
        this.setCenter(geoModel.get('center'));
        this.setZoom(geoModel.get('zoom'));
    }
 
    /**
     * @param {module:echarts/coord/Geo} geo
     * @param {module:echarts/model/Model} model
     * @inner
     */
    function setGeoCoords(geo, model) {
        zrUtil.each(model.get('geoCoord'), function (geoCoord, name) {
            geo.addGeoCoord(name, geoCoord);
        });
    }
 
    Eif (__DEV__) {
        var mapNotExistsError = function (name) {
            console.error('Map ' + name + ' not exists. You can download map file on http://echarts.baidu.com/download-map.html');
        };
    }
 
    var geoCreator = {
 
        // For deciding which dimensions to use when creating list data
        dimensions: Geo.prototype.dimensions,
 
        create: function (ecModel, api) {
            var geoList = [];
 
            // FIXME Create each time may be slow
            ecModel.eachComponent('geo', function (geoModel, idx) {
                var name = geoModel.get('map');
                var mapData = mapDataStores[name];
                if (__DEV__) {
                    if (!mapData) {
                        mapNotExistsError(name);
                    }
                }
                var geo = new Geo(
                    name + idx, name,
                    mapData && mapData.geoJson, mapData && mapData.specialAreas,
                    geoModel.get('nameMap')
                );
                geo.zoomLimit = geoModel.get('scaleLimit');
                geoList.push(geo);
 
                setGeoCoords(geo, geoModel);
 
                geoModel.coordinateSystem = geo;
                geo.model = geoModel;
 
                // Inject resize method
                geo.resize = resizeGeo;
 
                geo.resize(geoModel, api);
            });
 
            ecModel.eachSeries(function (seriesModel) {
                var coordSys = seriesModel.get('coordinateSystem');
                if (coordSys === 'geo') {
                    var geoIndex = seriesModel.get('geoIndex') || 0;
                    seriesModel.coordinateSystem = geoList[geoIndex];
                }
            });
 
            // If has map series
            var mapModelGroupBySeries = {};
 
            ecModel.eachSeriesByType('map', function (seriesModel) {
                if (!seriesModel.getHostGeoModel()) {
                    var mapType = seriesModel.getMapType();
                    mapModelGroupBySeries[mapType] = mapModelGroupBySeries[mapType] || [];
                    mapModelGroupBySeries[mapType].push(seriesModel);
                }
            });
 
            zrUtil.each(mapModelGroupBySeries, function (mapSeries, mapType) {
                var mapData = mapDataStores[mapType];
                if (__DEV__) {
                    if (!mapData) {
                        mapNotExistsError(mapSeries[0].get('map'));
                    }
                }
 
                var nameMapList = zrUtil.map(mapSeries, function (singleMapSeries) {
                    return singleMapSeries.get('nameMap');
                });
                var geo = new Geo(
                    mapType, mapType,
                    mapData && mapData.geoJson, mapData && mapData.specialAreas,
                    zrUtil.mergeAll(nameMapList)
                );
                geo.zoomLimit = zrUtil.retrieve.apply(null, zrUtil.map(mapSeries, function (singleMapSeries) {
                    return singleMapSeries.get('scaleLimit');
                }));
                geoList.push(geo);
 
                // Inject resize method
                geo.resize = resizeGeo;
 
                geo.resize(mapSeries[0], api);
 
                zrUtil.each(mapSeries, function (singleMapSeries) {
                    singleMapSeries.coordinateSystem = geo;
 
                    setGeoCoords(geo, singleMapSeries);
                });
            });
 
            return geoList;
        },
 
        /**
         * @param {string} mapName
         * @param {Object|string} geoJson
         * @param {Object} [specialAreas]
         *
         * @example
         *     $.get('USA.json', function (geoJson) {
         *         echarts.registerMap('USA', geoJson);
         *         // Or
         *         echarts.registerMap('USA', {
         *             geoJson: geoJson,
         *             specialAreas: {}
         *         })
         *     });
         */
        registerMap: function (mapName, geoJson, specialAreas) {
            Iif (geoJson.geoJson && !geoJson.features) {
                specialAreas = geoJson.specialAreas;
                geoJson = geoJson.geoJson;
            }
            Iif (typeof geoJson === 'string') {
                geoJson = (typeof JSON !== 'undefined' && JSON.parse)
                    ? JSON.parse(geoJson) : (new Function('return (' + geoJson + ');'))();
            }
            mapDataStores[mapName] = {
                geoJson: geoJson,
                specialAreas: specialAreas
            };
        },
 
        /**
         * @param {string} mapName
         * @return {Object}
         */
        getMap: function (mapName) {
            return mapDataStores[mapName];
        },
 
        /**
         * Fill given regions array
         * @param  {Array.<Object>} originRegionArr
         * @param  {string} mapName
         * @return {Array}
         */
        getFilledRegions: function (originRegionArr, mapName) {
            // Not use the original
            var regionsArr = (originRegionArr || []).slice();
 
            var map = geoCreator.getMap(mapName);
            var geoJson = map && map.geoJson;
            if (!geoJson) {
                if (__DEV__) {
                    mapNotExistsError(mapName);
                }
                return originRegionArr;
            }
 
            var dataNameMap = {};
            var features = geoJson.features;
            for (var i = 0; i < regionsArr.length; i++) {
                dataNameMap[regionsArr[i].name] = regionsArr[i];
            }
 
            for (var i = 0; i < features.length; i++) {
                var name = features[i].properties.name;
                if (!dataNameMap[name]) {
                    regionsArr.push({
                        name: name
                    });
                }
            }
            return regionsArr;
        }
    };
 
    // Inject methods into echarts
    var echarts = require('../../echarts');
 
    echarts.registerMap = geoCreator.registerMap;
 
    echarts.getMap = geoCreator.getMap;
 
    echarts.parseGeoJSON = require('./parseGeoJson');
 
    // TODO
    echarts.loadMap = function () {};
 
    echarts.registerCoordinateSystem('geo', geoCreator);
 
    module.exports = geoCreator;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/geo/parseGeoJson.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/geo/parseGeoJson.js

Statements: 8.93% (5 / 56)      Branches: 0% (0 / 17)      Functions: 0% (0 / 6)      Lines: 8.93% (5 / 56)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131            1   1   1                                                                                       1                                                         1                                                                                              
/**
 * Parse and decode geo json
 * @module echarts/coord/geo/parseGeoJson
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    var Region = require('./Region');
 
    function decode(json) {
        if (!json.UTF8Encoding) {
            return json;
        }
        var encodeScale = json.UTF8Scale;
        if (encodeScale == null) {
            encodeScale = 1024;
        }
 
        var features = json.features;
 
        for (var f = 0; f < features.length; f++) {
            var feature = features[f];
            var geometry = feature.geometry;
            var coordinates = geometry.coordinates;
            var encodeOffsets = geometry.encodeOffsets;
 
            for (var c = 0; c < coordinates.length; c++) {
                var coordinate = coordinates[c];
 
                if (geometry.type === 'Polygon') {
                    coordinates[c] = decodePolygon(
                        coordinate,
                        encodeOffsets[c],
                        encodeScale
                    );
                }
                else if (geometry.type === 'MultiPolygon') {
                    for (var c2 = 0; c2 < coordinate.length; c2++) {
                        var polygon = coordinate[c2];
                        coordinate[c2] = decodePolygon(
                            polygon,
                            encodeOffsets[c][c2],
                            encodeScale
                        );
                    }
                }
            }
        }
        // Has been decoded
        json.UTF8Encoding = false;
        return json;
    }
 
    function decodePolygon(coordinate, encodeOffsets, encodeScale) {
        var result = [];
        var prevX = encodeOffsets[0];
        var prevY = encodeOffsets[1];
 
        for (var i = 0; i < coordinate.length; i += 2) {
            var x = coordinate.charCodeAt(i) - 64;
            var y = coordinate.charCodeAt(i + 1) - 64;
            // ZigZag decoding
            x = (x >> 1) ^ (-(x & 1));
            y = (y >> 1) ^ (-(y & 1));
            // Delta deocding
            x += prevX;
            y += prevY;
 
            prevX = x;
            prevY = y;
            // Dequantize
            result.push([x / encodeScale, y / encodeScale]);
        }
 
        return result;
    }
 
    /**
     * @alias module:echarts/coord/geo/parseGeoJson
     * @param {Object} geoJson
     * @return {module:zrender/container/Group}
     */
    module.exports = function (geoJson) {
 
        decode(geoJson);
 
        return zrUtil.map(zrUtil.filter(geoJson.features, function (featureObj) {
            // Output of mapshaper may have geometry null
            return featureObj.geometry
                && featureObj.properties
                && featureObj.geometry.coordinates.length > 0;
        }), function (featureObj) {
            var properties = featureObj.properties;
            var geo = featureObj.geometry;
 
            var coordinates = geo.coordinates;
 
            var geometries = [];
            if (geo.type === 'Polygon') {
                geometries.push({
                    type: 'polygon',
                    // According to the GeoJSON specification.
                    // First must be exterior, and the rest are all interior(holes).
                    exterior: coordinates[0],
                    interiors: coordinates.slice(1)
                });
            }
            if (geo.type === 'MultiPolygon') {
                zrUtil.each(coordinates, function (item) {
                    if (item[0]) {
                        geometries.push({
                            type: 'polygon',
                            exterior: item[0],
                            interiors: item.slice(1)
                        });
                    }
                });
            }
 
            var region = new Region(
                properties.name,
                geometries,
                properties.cp
            );
            region.properties = properties;
            return region;
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/geo/fix/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/geo/fix/

Statements: 53.13% (17 / 32)      Branches: 0% (0 / 6)      Functions: 0% (0 / 6)      Lines: 53.13% (17 / 32)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/coord/geo/fix/
File Statements Branches Functions Lines
geoCoord.js 33.33% (3 / 9) 0% (0 / 2) 0% (0 / 2) 33.33% (3 / 9)
nanhai.js 78.57% (11 / 14) 0% (0 / 2) 0% (0 / 2) 78.57% (11 / 14)
textCoord.js 33.33% (3 / 9) 0% (0 / 2) 0% (0 / 2) 33.33% (3 / 9)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/geo/fix/geoCoord.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/geo/fix/geoCoord.js

Statements: 33.33% (3 / 9)      Branches: 0% (0 / 2)      Functions: 0% (0 / 2)      Lines: 33.33% (3 / 9)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22    1   1           1                      
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    var geoCoordMap = {
        'Russia': [100, 60],
        'United States': [-99, 38],
        'United States of America': [-99, 38]
    };
 
    module.exports = function (geo) {
        zrUtil.each(geo.regions, function (region) {
            var geoCoord = geoCoordMap[region.name];
            if (geoCoord) {
                var cp = region.center;
                cp[0] = geoCoord[0];
                cp[1] = geoCoord[1];
            }
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/geo/fix/nanhai.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/geo/fix/nanhai.js

Statements: 78.57% (11 / 14)      Branches: 0% (0 / 2)      Functions: 0% (0 / 2)      Lines: 78.57% (11 / 14)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48      1 1   1   1                               1 12 71 71   71 71     1                            
// Fix for 南海诸岛
 
 
    var Region = require('../Region');
    var zrUtil = require('zrender/lib/core/util');
 
    var geoCoord = [126, 25];
 
    var points = [
        [[0,3.5],[7,11.2],[15,11.9],[30,7],[42,0.7],[52,0.7],
         [56,7.7],[59,0.7],[64,0.7],[64,0],[5,0],[0,3.5]],
        [[13,16.1],[19,14.7],[16,21.7],[11,23.1],[13,16.1]],
        [[12,32.2],[14,38.5],[15,38.5],[13,32.2],[12,32.2]],
        [[16,47.6],[12,53.2],[13,53.2],[18,47.6],[16,47.6]],
        [[6,64.4],[8,70],[9,70],[8,64.4],[6,64.4]],
        [[23,82.6],[29,79.8],[30,79.8],[25,82.6],[23,82.6]],
        [[37,70.7],[43,62.3],[44,62.3],[39,70.7],[37,70.7]],
        [[48,51.1],[51,45.5],[53,45.5],[50,51.1],[48,51.1]],
        [[51,35],[51,28.7],[53,28.7],[53,35],[51,35]],
        [[52,22.4],[55,17.5],[56,17.5],[53,22.4],[52,22.4]],
        [[58,12.6],[62,7],[63,7],[60,12.6],[58,12.6]],
        [[0,3.5],[0,93.1],[64,93.1],[64,0],[63,0],[63,92.4],
         [1,92.4],[1,3.5],[0,3.5]]
    ];
    for (var i = 0; i < points.length; i++) {
        for (var k = 0; k < points[i].length; k++) {
            points[i][k][0] /= 10.5;
            points[i][k][1] /= -10.5 / 0.75;
 
            points[i][k][0] += geoCoord[0];
            points[i][k][1] += geoCoord[1];
        }
    }
    module.exports = function (geo) {
        if (geo.map === 'china') {
            geo.regions.push(new Region(
                '南海诸岛',
                zrUtil.map(points, function (exterior) {
                    return {
                        type: 'polygon',
                        exterior: exterior
                    };
                }), geoCoord
            ));
        }
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/geo/fix/textCoord.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/geo/fix/textCoord.js

Statements: 33.33% (3 / 9)      Branches: 0% (0 / 2)      Functions: 0% (0 / 2)      Lines: 33.33% (3 / 9)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26    1   1                   1                      
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    var coordsOffsetMap = {
        '南海诸岛' : [32, 80],
        // 全国
        '广东': [0, -10],
        '香港': [10, 5],
        '澳门': [-10, 10],
        //'北京': [-10, 0],
        '天津': [5, 5]
    };
 
    module.exports = function (geo) {
        zrUtil.each(geo.regions, function (region) {
            var coordFix = coordsOffsetMap[region.name];
            if (coordFix) {
                var cp = region.center;
                cp[0] += coordFix[0] / 10.5;
                cp[1] += -coordFix[1] / (10.5 / 0.75);
            }
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/parallel/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/parallel/

Statements: 18.05% (50 / 277)      Branches: 0% (0 / 97)      Functions: 0% (0 / 45)      Lines: 18.05% (50 / 277)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/coord/parallel/
File Statements Branches Functions Lines
AxisModel.js 42.31% (11 / 26) 0% (0 / 14) 0% (0 / 4) 42.31% (11 / 26)
Parallel.js 11.54% (21 / 182) 0% (0 / 57) 0% (0 / 24) 11.54% (21 / 182)
ParallelAxis.js 66.67% (6 / 9) 0% (0 / 2) 0% (0 / 1) 66.67% (6 / 9)
ParallelModel.js 19.05% (4 / 21) 0% (0 / 6) 0% (0 / 8) 19.05% (4 / 21)
parallelCreator.js 18.75% (3 / 16) 0% (0 / 2) 0% (0 / 3) 18.75% (3 / 16)
parallelPreprocessor.js 21.74% (5 / 23) 0% (0 / 16) 0% (0 / 5) 21.74% (5 / 23)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/parallel/AxisModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/parallel/AxisModel.js

Statements: 42.31% (11 / 26)      Branches: 0% (0 / 14)      Functions: 0% (0 / 4)      Lines: 42.31% (11 / 26)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123    1 1 1 1 1   1                                                                                                                                                               1                                               1   1       1   1    
 
 
    var ComponentModel = require('../../model/Component');
    var zrUtil = require('zrender/lib/core/util');
    var makeStyleMapper = require('../../model/mixin/makeStyleMapper');
    var axisModelCreator = require('../axisModelCreator');
    var numberUtil = require('../../util/number');
 
    var AxisModel = ComponentModel.extend({
 
        type: 'baseParallelAxis',
 
        /**
         * @type {module:echarts/coord/parallel/Axis}
         */
        axis: null,
 
        /**
         * @type {Array.<Array.<number>}
         * @readOnly
         */
        activeIntervals: [],
 
        /**
         * @return {Object}
         */
        getAreaSelectStyle: function () {
            return makeStyleMapper(
                [
                    ['fill', 'color'],
                    ['lineWidth', 'borderWidth'],
                    ['stroke', 'borderColor'],
                    ['width', 'width'],
                    ['opacity', 'opacity']
                ]
            ).call(this.getModel('areaSelectStyle'));
        },
 
        /**
         * The code of this feature is put on AxisModel but not ParallelAxis,
         * because axisModel can be alive after echarts updating but instance of
         * ParallelAxis having been disposed. this._activeInterval should be kept
         * when action dispatched (i.e. legend click).
         *
         * @param {Array.<Array<number>>} intervals interval.length === 0
         *                                          means set all active.
         * @public
         */
        setActiveIntervals: function (intervals) {
            var activeIntervals = this.activeIntervals = zrUtil.clone(intervals);
 
            // Normalize
            if (activeIntervals) {
                for (var i = activeIntervals.length - 1; i >= 0; i--) {
                    numberUtil.asc(activeIntervals[i]);
                }
            }
        },
 
        /**
         * @param {number|string} [value] When attempting to detect 'no activeIntervals set',
         *                         value can not be input.
         * @return {string} 'normal': no activeIntervals set,
         *                  'active',
         *                  'inactive'.
         * @public
         */
        getActiveState: function (value) {
            var activeIntervals = this.activeIntervals;
 
            if (!activeIntervals.length) {
                return 'normal';
            }
 
            if (value == null) {
                return 'inactive';
            }
 
            for (var i = 0, len = activeIntervals.length; i < len; i++) {
                if (activeIntervals[i][0] <= value && value <= activeIntervals[i][1]) {
                    return 'active';
                }
            }
            return 'inactive';
        }
 
    });
 
    var defaultOption = {
 
        type: 'value',
 
        /**
         * @type {Array.<number>}
         */
        dim: null, // 0, 1, 2, ...
 
        // parallelIndex: null,
 
        areaSelectStyle: {
            width: 20,
            borderWidth: 1,
            borderColor: 'rgba(160,197,232)',
            color: 'rgba(160,197,232)',
            opacity: 0.3
        },
 
        realtime: true, // Whether realtime update view when select.
 
        z: 10
    };
 
    zrUtil.merge(AxisModel.prototype, require('../axisModelCommonMixin'));
 
    function getAxisType(axisName, option) {
        return option.type || (option.data ? 'category' : 'value');
    }
 
    axisModelCreator('parallel', AxisModel, getAxisType, defaultOption);
 
    module.exports = AxisModel;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/parallel/Parallel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/parallel/Parallel.js

Statements: 11.54% (21 / 182)      Branches: 0% (0 / 57)      Functions: 0% (0 / 24)      Lines: 11.54% (21 / 182)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516            1 1 1 1 1 1 1 1   1 1 1 1 1 1   1   1                                                                         1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       1       1                 1                                                                     1    
/**
 * Parallel Coordinates
 * <https://en.wikipedia.org/wiki/Parallel_coordinates>
 */
 
 
    var layoutUtil = require('../../util/layout');
    var axisHelper = require('../../coord/axisHelper');
    var zrUtil = require('zrender/lib/core/util');
    var ParallelAxis = require('./ParallelAxis');
    var graphic = require('../../util/graphic');
    var matrix = require('zrender/lib/core/matrix');
    var numberUtil = require('../../util/number');
    var sliderMove = require('../../component/helper/sliderMove');
 
    var each = zrUtil.each;
    var mathMin = Math.min;
    var mathMax = Math.max;
    var mathFloor = Math.floor;
    var mathCeil = Math.ceil;
    var round = numberUtil.round;
 
    var PI = Math.PI;
 
    function Parallel(parallelModel, ecModel, api) {
 
        /**
         * key: dimension
         * @type {Object.<string, module:echarts/coord/parallel/Axis>}
         * @private
         */
        this._axesMap = {};
 
        /**
         * key: dimension
         * value: {position: [], rotation, }
         * @type {Object.<string, Object>}
         * @private
         */
        this._axesLayout = {};
 
        /**
         * Always follow axis order.
         * @type {Array.<string>}
         * @readOnly
         */
        this.dimensions = parallelModel.dimensions;
 
        /**
         * @type {module:zrender/core/BoundingRect}
         */
        this._rect;
 
        /**
         * @type {module:echarts/coord/parallel/ParallelModel}
         */
        this._model = parallelModel;
 
        this._init(parallelModel, ecModel, api);
    }
 
    Parallel.prototype = {
 
        type: 'parallel',
 
        constructor: Parallel,
 
        /**
         * Initialize cartesian coordinate systems
         * @private
         */
        _init: function (parallelModel, ecModel, api) {
 
            var dimensions = parallelModel.dimensions;
            var parallelAxisIndex = parallelModel.parallelAxisIndex;
 
            each(dimensions, function (dim, idx) {
 
                var axisIndex = parallelAxisIndex[idx];
                var axisModel = ecModel.getComponent('parallelAxis', axisIndex);
 
                var axis = this._axesMap[dim] = new ParallelAxis(
                    dim,
                    axisHelper.createScaleByModel(axisModel),
                    [0, 0],
                    axisModel.get('type'),
                    axisIndex
                );
 
                var isCategory = axis.type === 'category';
                axis.onBand = isCategory && axisModel.get('boundaryGap');
                axis.inverse = axisModel.get('inverse');
 
                // Injection
                axisModel.axis = axis;
                axis.model = axisModel;
                axis.coordinateSystem = axisModel.coordinateSystem = this;
 
            }, this);
        },
 
        /**
         * Update axis scale after data processed
         * @param  {module:echarts/model/Global} ecModel
         * @param  {module:echarts/ExtensionAPI} api
         */
        update: function (ecModel, api) {
            this._updateAxesFromSeries(this._model, ecModel);
        },
 
        /**
         * @override
         */
        containPoint: function (point) {
            var layoutInfo = this._makeLayoutInfo();
            var axisBase = layoutInfo.axisBase;
            var layoutBase = layoutInfo.layoutBase;
            var pixelDimIndex = layoutInfo.pixelDimIndex;
            var pAxis = point[1 - pixelDimIndex];
            var pLayout = point[pixelDimIndex];
 
            return pAxis >= axisBase
                && pAxis <= axisBase + layoutInfo.axisLength
                && pLayout >= layoutBase
                && pLayout <= layoutBase + layoutInfo.layoutLength;
        },
 
        /**
         * Update properties from series
         * @private
         */
        _updateAxesFromSeries: function (parallelModel, ecModel) {
            ecModel.eachSeries(function (seriesModel) {
 
                if (!parallelModel.contains(seriesModel, ecModel)) {
                    return;
                }
 
                var data = seriesModel.getData();
 
                each(this.dimensions, function (dim) {
                    var axis = this._axesMap[dim];
                    axis.scale.unionExtentFromData(data, dim);
                    axisHelper.niceScaleExtent(axis.scale, axis.model);
                }, this);
            }, this);
        },
 
        /**
         * Resize the parallel coordinate system.
         * @param {module:echarts/coord/parallel/ParallelModel} parallelModel
         * @param {module:echarts/ExtensionAPI} api
         */
        resize: function (parallelModel, api) {
            this._rect = layoutUtil.getLayoutRect(
                parallelModel.getBoxLayoutParams(),
                {
                    width: api.getWidth(),
                    height: api.getHeight()
                }
            );
 
            this._layoutAxes();
        },
 
        /**
         * @return {module:zrender/core/BoundingRect}
         */
        getRect: function () {
            return this._rect;
        },
 
        /**
         * @private
         */
        _makeLayoutInfo: function () {
            var parallelModel = this._model;
            var rect = this._rect;
            var xy = ['x', 'y'];
            var wh = ['width', 'height'];
            var layout = parallelModel.get('layout');
            var pixelDimIndex = layout === 'horizontal' ? 0 : 1;
            var layoutLength = rect[wh[pixelDimIndex]];
            var layoutExtent = [0, layoutLength];
            var axisCount = this.dimensions.length;
 
            var axisExpandWidth = restrict(parallelModel.get('axisExpandWidth'), layoutExtent);
            var axisExpandCount = restrict(parallelModel.get('axisExpandCount') || 0, [0, axisCount]);
            var axisExpandable = parallelModel.get('axisExpandable')
                && axisCount > 3
                && axisCount > axisExpandCount
                && axisExpandCount > 1
                && axisExpandWidth > 0
                && layoutLength > 0;
 
            // `axisExpandWindow` is According to the coordinates of [0, axisExpandLength],
            // for sake of consider the case that axisCollapseWidth is 0 (when screen is narrow),
            // where collapsed axes should be overlapped.
            var axisExpandWindow = parallelModel.get('axisExpandWindow');
            var winSize;
            if (!axisExpandWindow) {
                winSize = restrict(axisExpandWidth * (axisExpandCount - 1), layoutExtent);
                var axisExpandCenter = parallelModel.get('axisExpandCenter') || mathFloor(axisCount / 2);
                axisExpandWindow = [axisExpandWidth * axisExpandCenter - winSize / 2];
                axisExpandWindow[1] = axisExpandWindow[0] + winSize;
            }
            else {
                 winSize = restrict(axisExpandWindow[1] - axisExpandWindow[0], layoutExtent);
                 axisExpandWindow[1] = axisExpandWindow[0] + winSize;
            }
 
            var axisCollapseWidth = (layoutLength - winSize) / (axisCount - axisExpandCount);
            // Avoid axisCollapseWidth is too small.
            axisCollapseWidth < 3 && (axisCollapseWidth = 0);
 
            // Find the first and last indices > ewin[0] and < ewin[1].
            var winInnerIndices = [
                mathFloor(round(axisExpandWindow[0] / axisExpandWidth, 1)) + 1,
                mathCeil(round(axisExpandWindow[1] / axisExpandWidth, 1)) - 1
            ];
 
            // Pos in ec coordinates.
            var axisExpandWindow0Pos = axisCollapseWidth / axisExpandWidth * axisExpandWindow[0];
 
            return {
                layout: layout,
                pixelDimIndex: pixelDimIndex,
                layoutBase: rect[xy[pixelDimIndex]],
                layoutLength: layoutLength,
                axisBase: rect[xy[1 - pixelDimIndex]],
                axisLength: rect[wh[1 - pixelDimIndex]],
                axisExpandable: axisExpandable,
                axisExpandWidth: axisExpandWidth,
                axisCollapseWidth: axisCollapseWidth,
                axisExpandWindow: axisExpandWindow,
                axisCount: axisCount,
                winInnerIndices: winInnerIndices,
                axisExpandWindow0Pos: axisExpandWindow0Pos
            };
        },
 
        /**
         * @private
         */
        _layoutAxes: function () {
            var rect = this._rect;
            var axes = this._axesMap;
            var dimensions = this.dimensions;
            var layoutInfo = this._makeLayoutInfo();
            var layout = layoutInfo.layout;
 
            each(axes, function (axis) {
                var axisExtent = [0, layoutInfo.axisLength];
                var idx = axis.inverse ? 1 : 0;
                axis.setExtent(axisExtent[idx], axisExtent[1 - idx]);
            });
 
            each(dimensions, function (dim, idx) {
                var posInfo = (layoutInfo.axisExpandable
                    ? layoutAxisWithExpand : layoutAxisWithoutExpand
                )(idx, layoutInfo);
 
                var positionTable = {
                    horizontal: {
                        x: posInfo.position,
                        y: layoutInfo.axisLength
                    },
                    vertical: {
                        x: 0,
                        y: posInfo.position
                    }
                };
                var rotationTable = {
                    horizontal: PI / 2,
                    vertical: 0
                };
 
                var position = [
                    positionTable[layout].x + rect.x,
                    positionTable[layout].y + rect.y
                ];
 
                var rotation = rotationTable[layout];
                var transform = matrix.create();
                matrix.rotate(transform, transform, rotation);
                matrix.translate(transform, transform, position);
 
                // TODO
                // tick等排布信息。
 
                // TODO
                // 根据axis order 更新 dimensions顺序。
 
                this._axesLayout[dim] = {
                    position: position,
                    rotation: rotation,
                    transform: transform,
                    axisNameAvailableWidth: posInfo.axisNameAvailableWidth,
                    axisLabelShow: posInfo.axisLabelShow,
                    nameTruncateMaxWidth: posInfo.nameTruncateMaxWidth,
                    tickDirection: 1,
                    labelDirection: 1
                };
            }, this);
        },
 
        /**
         * Get axis by dim.
         * @param {string} dim
         * @return {module:echarts/coord/parallel/ParallelAxis} [description]
         */
        getAxis: function (dim) {
            return this._axesMap[dim];
        },
 
        /**
         * Convert a dim value of a single item of series data to Point.
         * @param {*} value
         * @param {string} dim
         * @return {Array}
         */
        dataToPoint: function (value, dim) {
            return this.axisCoordToPoint(
                this._axesMap[dim].dataToCoord(value),
                dim
            );
        },
 
        /**
         * Travel data for one time, get activeState of each data item.
         * @param {module:echarts/data/List} data
         * @param {Functio} cb param: {string} activeState 'active' or 'inactive' or 'normal'
         *                            {number} dataIndex
         * @param {Object} context
         */
        eachActiveState: function (data, callback, context) {
            var dimensions = this.dimensions;
            var axesMap = this._axesMap;
            var hasActiveSet = this.hasAxisBrushed();
 
            for (var i = 0, len = data.count(); i < len; i++) {
                var values = data.getValues(dimensions, i);
                var activeState;
 
                if (!hasActiveSet) {
                    activeState = 'normal';
                }
                else {
                    activeState = 'active';
                    for (var j = 0, lenj = dimensions.length; j < lenj; j++) {
                        var dimName = dimensions[j];
                        var state = axesMap[dimName].model.getActiveState(values[j], j);
 
                        if (state === 'inactive') {
                            activeState = 'inactive';
                            break;
                        }
                    }
                }
 
                callback.call(context, activeState, i);
            }
        },
 
        /**
         * Whether has any activeSet.
         * @return {boolean}
         */
        hasAxisBrushed: function () {
            var dimensions = this.dimensions;
            var axesMap = this._axesMap;
            var hasActiveSet = false;
 
            for (var j = 0, lenj = dimensions.length; j < lenj; j++) {
                if (axesMap[dimensions[j]].model.getActiveState() !== 'normal') {
                    hasActiveSet = true;
                }
            }
 
            return hasActiveSet;
        },
 
        /**
         * Convert coords of each axis to Point.
         *  Return point. For example: [10, 20]
         * @param {Array.<number>} coords
         * @param {string} dim
         * @return {Array.<number>}
         */
        axisCoordToPoint: function (coord, dim) {
            var axisLayout = this._axesLayout[dim];
            return graphic.applyTransform([coord, 0], axisLayout.transform);
        },
 
        /**
         * Get axis layout.
         */
        getAxisLayout: function (dim) {
            return zrUtil.clone(this._axesLayout[dim]);
        },
 
        /**
         * @param {Array.<number>} point
         * @return {Object} {axisExpandWindow, delta, behavior: 'jump' | 'slide' | 'none'}.
         */
        getSlidedAxisExpandWindow: function (point) {
            var layoutInfo = this._makeLayoutInfo();
            var pixelDimIndex = layoutInfo.pixelDimIndex;
            var axisExpandWindow = layoutInfo.axisExpandWindow.slice();
            var winSize = axisExpandWindow[1] - axisExpandWindow[0];
            var extent = [0, layoutInfo.axisExpandWidth * (layoutInfo.axisCount - 1)];
 
            // Out of the area of coordinate system.
            if (!this.containPoint(point)) {
                return {behavior: 'none', axisExpandWindow: axisExpandWindow};
            }
 
            // Conver the point from global to expand coordinates.
            var pointCoord = point[pixelDimIndex] - layoutInfo.layoutBase - layoutInfo.axisExpandWindow0Pos;
 
            // For dragging operation convenience, the window should not be
            // slided when mouse is the center area of the window.
            var delta;
            var behavior = 'slide';
            var axisCollapseWidth = layoutInfo.axisCollapseWidth;
            var triggerArea = this._model.get('axisExpandSlideTriggerArea');
            // But consider touch device, jump is necessary.
            var useJump = triggerArea[0] != null;
 
            if (axisCollapseWidth) {
                if (useJump && axisCollapseWidth && pointCoord < winSize * triggerArea[0]) {
                    behavior = 'jump';
                    delta = pointCoord - winSize * triggerArea[2];
                }
                else if (useJump && axisCollapseWidth && pointCoord > winSize * (1 - triggerArea[0])) {
                    behavior = 'jump';
                    delta = pointCoord - winSize * (1 - triggerArea[2]);
                }
                else {
                    (delta = pointCoord - winSize * triggerArea[1]) >= 0
                        && (delta = pointCoord - winSize * (1 - triggerArea[1])) <= 0
                        && (delta = 0);
                }
                delta *= layoutInfo.axisExpandWidth / axisCollapseWidth;
                delta
                    ? sliderMove(delta, axisExpandWindow, extent, 'rigid')
                    // Avoid nonsense triger on mousemove.
                    : (behavior = 'none');
            }
            // When screen is too narrow, make it visible and slidable, although it is hard to interact.
            else {
                var winSize = axisExpandWindow[1] - axisExpandWindow[0];
                var pos = extent[1] * pointCoord / winSize;
                axisExpandWindow = [mathMax(0, pos - winSize / 2)];
                axisExpandWindow[1] = mathMin(extent[1], axisExpandWindow[0] + winSize);
                axisExpandWindow[0] = axisExpandWindow[1] - winSize;
            }
 
            return {
                axisExpandWindow: axisExpandWindow,
                behavior: behavior
            };
        }
    };
 
    function restrict(len, extent) {
        return mathMin(mathMax(len, extent[0]), extent[1]);
    }
 
    function layoutAxisWithoutExpand(axisIndex, layoutInfo) {
        var step = layoutInfo.layoutLength / (layoutInfo.axisCount - 1);
        return {
            position: step * axisIndex,
            axisNameAvailableWidth: step,
            axisLabelShow: true
        };
    }
 
    function layoutAxisWithExpand(axisIndex, layoutInfo) {
        var layoutLength = layoutInfo.layoutLength;
        var axisExpandWidth = layoutInfo.axisExpandWidth;
        var axisCount = layoutInfo.axisCount;
        var axisCollapseWidth = layoutInfo.axisCollapseWidth;
        var winInnerIndices = layoutInfo.winInnerIndices;
 
        var position;
        var axisNameAvailableWidth = axisCollapseWidth;
        var axisLabelShow = false;
        var nameTruncateMaxWidth;
 
        if (axisIndex < winInnerIndices[0]) {
            position = axisIndex * axisCollapseWidth;
            nameTruncateMaxWidth = axisCollapseWidth;
        }
        else if (axisIndex <= winInnerIndices[1]) {
            position = layoutInfo.axisExpandWindow0Pos
                + axisIndex * axisExpandWidth - layoutInfo.axisExpandWindow[0];
            axisNameAvailableWidth = axisExpandWidth;
            axisLabelShow = true;
        }
        else {
            position = layoutLength - (axisCount - 1 - axisIndex) * axisCollapseWidth;
            nameTruncateMaxWidth = axisCollapseWidth;
        }
 
        return {
            position: position,
            axisNameAvailableWidth: axisNameAvailableWidth,
            axisLabelShow: axisLabelShow,
            nameTruncateMaxWidth: nameTruncateMaxWidth
        };
    }
 
    module.exports = Parallel;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/parallel/ParallelAxis.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/parallel/ParallelAxis.js

Statements: 66.67% (6 / 9)      Branches: 0% (0 / 2)      Functions: 0% (0 / 1)      Lines: 66.67% (6 / 9)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51    1 1                   1                                         1                       1   1    
 
 
    var zrUtil = require('zrender/lib/core/util');
    var Axis = require('../Axis');
 
    /**
     * @constructor module:echarts/coord/parallel/ParallelAxis
     * @extends {module:echarts/coord/Axis}
     * @param {string} dim
     * @param {*} scale
     * @param {Array.<number>} coordExtent
     * @param {string} axisType
     */
    var ParallelAxis = function (dim, scale, coordExtent, axisType, axisIndex) {
 
        Axis.call(this, dim, scale, coordExtent);
 
        /**
         * Axis type
         *  - 'category'
         *  - 'value'
         *  - 'time'
         *  - 'log'
         * @type {string}
         */
        this.type = axisType || 'value';
 
        /**
         * @type {number}
         * @readOnly
         */
        this.axisIndex = axisIndex;
    };
 
    ParallelAxis.prototype = {
 
        constructor: ParallelAxis,
 
        /**
         * Axis model
         * @param {module:echarts/coord/parallel/AxisModel}
         */
        model: null
 
    };
 
    zrUtil.inherits(ParallelAxis, Axis);
 
    module.exports = ParallelAxis;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/parallel/ParallelModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/parallel/ParallelModel.js

Statements: 19.05% (4 / 21)      Branches: 0% (0 / 6)      Functions: 0% (0 / 8)      Lines: 19.05% (4 / 21)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128    1 1   1   1                                                                                                                                                                                                                                                
 
 
    var zrUtil = require('zrender/lib/core/util');
    var Component = require('../../model/Component');
 
    require('./AxisModel');
 
    Component.extend({
 
        type: 'parallel',
 
        dependencies: ['parallelAxis'],
 
        /**
         * @type {module:echarts/coord/parallel/Parallel}
         */
        coordinateSystem: null,
 
        /**
         * Each item like: 'dim0', 'dim1', 'dim2', ...
         * @type {Array.<string>}
         * @readOnly
         */
        dimensions: null,
 
        /**
         * Coresponding to dimensions.
         * @type {Array.<number>}
         * @readOnly
         */
        parallelAxisIndex: null,
 
        layoutMode: 'box',
 
        defaultOption: {
            zlevel: 0,
            z: 0,
            left: 80,
            top: 60,
            right: 80,
            bottom: 60,
            // width: {totalWidth} - left - right,
            // height: {totalHeight} - top - bottom,
 
            layout: 'horizontal',      // 'horizontal' or 'vertical'
 
            // FIXME
            // naming?
            axisExpandable: false,
            axisExpandCenter: null,
            axisExpandCount: 0,
            axisExpandWidth: 50,      // FIXME '10%' ?
            axisExpandRate: 17,
            axisExpandDebounce: 50,
            // [out, in, jumpTarget]. In percentage. If use [null, 0.05], null means full.
            // Do not doc to user until necessary.
            axisExpandSlideTriggerArea: [-0.15, 0.05, 0.4],
            axisExpandTriggerOn: 'click', // 'mousemove' or 'click'
 
            parallelAxisDefault: null
        },
 
        /**
         * @override
         */
        init: function () {
            Component.prototype.init.apply(this, arguments);
 
            this.mergeOption({});
        },
 
        /**
         * @override
         */
        mergeOption: function (newOption) {
            var thisOption = this.option;
 
            newOption && zrUtil.merge(thisOption, newOption, true);
 
            this._initDimensions();
        },
 
        /**
         * Whether series or axis is in this coordinate system.
         * @param {module:echarts/model/Series|module:echarts/coord/parallel/AxisModel} model
         * @param {module:echarts/model/Global} ecModel
         */
        contains: function (model, ecModel) {
            var parallelIndex = model.get('parallelIndex');
            return parallelIndex != null
                && ecModel.getComponent('parallel', parallelIndex) === this;
        },
 
        setAxisExpand: function (opt) {
            zrUtil.each(
                ['axisExpandable', 'axisExpandCenter', 'axisExpandCount', 'axisExpandWidth', 'axisExpandWindow'],
                function (name) {
                    if (opt.hasOwnProperty(name)) {
                        this.option[name] = opt[name];
                    }
                },
                this
            );
        },
 
        /**
         * @private
         */
        _initDimensions: function () {
            var dimensions = this.dimensions = [];
            var parallelAxisIndex = this.parallelAxisIndex = [];
 
            var axisModels = zrUtil.filter(this.dependentModels.parallelAxis, function (axisModel) {
                // Can not use this.contains here, because
                // initialization has not been completed yet.
                return axisModel.get('parallelIndex') === this.componentIndex;
            });
 
            zrUtil.each(axisModels, function (axisModel) {
                dimensions.push('dim' + axisModel.get('dim'));
                parallelAxisIndex.push(axisModel.componentIndex);
            });
        }
 
    });
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/parallel/parallelCreator.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/parallel/parallelCreator.js

Statements: 18.75% (3 / 16)      Branches: 0% (0 / 2)      Functions: 0% (0 / 3)      Lines: 18.75% (3 / 16)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41          1   1                                                           1      
/**
 * Parallel coordinate system creater.
 */
 
 
    var Parallel = require('./Parallel');
 
    function create(ecModel, api) {
        var coordSysList = [];
 
        ecModel.eachComponent('parallel', function (parallelModel, idx) {
            var coordSys = new Parallel(parallelModel, ecModel, api);
 
            coordSys.name = 'parallel_' + idx;
            coordSys.resize(parallelModel, api);
 
            parallelModel.coordinateSystem = coordSys;
            coordSys.model = parallelModel;
 
            coordSysList.push(coordSys);
        });
 
        // Inject the coordinateSystems into seriesModel
        ecModel.eachSeries(function (seriesModel) {
            if (seriesModel.get('coordinateSystem') === 'parallel') {
                var parallelModel = ecModel.queryComponents({
                    mainType: 'parallel',
                    index: seriesModel.get('parallelIndex'),
                    id: seriesModel.get('parallelId')
                })[0];
                seriesModel.coordinateSystem = parallelModel.coordinateSystem;
            }
        });
 
        return coordSysList;
    }
 
    require('../../CoordinateSystem').register('parallel', {create: create});
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/parallel/parallelPreprocessor.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/parallel/parallelPreprocessor.js

Statements: 21.74% (5 / 23)      Branches: 0% (0 / 16)      Functions: 0% (0 / 5)      Lines: 21.74% (5 / 23)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55    1 1   1                 1                                           1                                    
 
 
    var zrUtil = require('zrender/lib/core/util');
    var modelUtil = require('../../util/model');
 
    module.exports = function (option) {
        createParallelIfNeeded(option);
        mergeAxisOptionFromParallel(option);
    };
 
    /**
     * Create a parallel coordinate if not exists.
     * @inner
     */
    function createParallelIfNeeded(option) {
        if (option.parallel) {
            return;
        }
 
        var hasParallelSeries = false;
 
        zrUtil.each(option.series, function (seriesOpt) {
            if (seriesOpt && seriesOpt.type === 'parallel') {
                hasParallelSeries = true;
            }
        });
 
        if (hasParallelSeries) {
            option.parallel = [{}];
        }
    }
 
    /**
     * Merge aixs definition from parallel option (if exists) to axis option.
     * @inner
     */
    function mergeAxisOptionFromParallel(option) {
        var axes = modelUtil.normalizeToArray(option.parallelAxis);
 
        zrUtil.each(axes, function (axisOption) {
            if (!zrUtil.isObject(axisOption)) {
                return;
            }
 
            var parallelIndex = axisOption.parallelIndex || 0;
            var parallelOption = modelUtil.normalizeToArray(option.parallel)[parallelIndex];
 
            if (parallelOption && parallelOption.parallelAxisDefault) {
                zrUtil.merge(axisOption, parallelOption.parallelAxisDefault, false);
            }
        });
    }
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/polar/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/polar/

Statements: 24.07% (39 / 162)      Branches: 0% (0 / 57)      Functions: 0% (0 / 32)      Lines: 24.07% (39 / 162)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/coord/polar/
File Statements Branches Functions Lines
AngleAxis.js 60% (6 / 10) 0% (0 / 4) 0% (0 / 2) 60% (6 / 10)
AxisModel.js 81.82% (9 / 11) 0% (0 / 4) 0% (0 / 2) 81.82% (9 / 11)
Polar.js 9.26% (5 / 54) 0% (0 / 25) 0% (0 / 17) 9.26% (5 / 54)
PolarModel.js 25% (2 / 8) 0% (0 / 2) 0% (0 / 2) 25% (2 / 8)
RadiusAxis.js 66.67% (6 / 9) 0% (0 / 2) 0% (0 / 2) 66.67% (6 / 9)
polarCreator.js 15.71% (11 / 70) 0% (0 / 20) 0% (0 / 7) 15.71% (11 / 70)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/polar/AngleAxis.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/polar/AngleAxis.js

Statements: 60% (6 / 10)      Branches: 0% (0 / 4)      Functions: 0% (0 / 2)      Lines: 60% (6 / 10)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44      1 1   1                                 1                               1   1    
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
    var Axis = require('../Axis');
 
    function AngleAxis(scale, angleExtent) {
 
        angleExtent = angleExtent || [0, 360];
 
        Axis.call(this, 'angle', scale, angleExtent);
 
        /**
         * Axis type
         *  - 'category'
         *  - 'value'
         *  - 'time'
         *  - 'log'
         * @type {string}
         */
        this.type = 'category';
    }
 
    AngleAxis.prototype = {
 
        constructor: AngleAxis,
 
        /**
         * @override
         */
        pointToData: function (point, clamp) {
            return this.polar.pointToData(point, clamp)[this.dim === 'radius' ? 0 : 1];
        },
 
        dataToAngle: Axis.prototype.dataToCoord,
 
        angleToData: Axis.prototype.coordToData
    };
 
    zrUtil.inherits(AngleAxis, Axis);
 
    module.exports = AngleAxis;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/polar/AxisModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/polar/AxisModel.js

Statements: 81.82% (9 / 11)      Branches: 0% (0 / 4)      Functions: 0% (0 / 2)      Lines: 81.82% (9 / 11)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64      1 1 1   1                                           1   1                                             1         1 1      
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
    var ComponentModel = require('../../model/Component');
    var axisModelCreator = require('../axisModelCreator');
 
    var PolarAxisModel = ComponentModel.extend({
 
        type: 'polarAxis',
 
        /**
         * @type {module:echarts/coord/polar/AngleAxis|module:echarts/coord/polar/RadiusAxis}
         */
        axis: null,
 
        /**
         * @override
         */
        getCoordSysModel: function () {
            return this.ecModel.queryComponents({
                mainType: 'polar',
                index: this.option.polarIndex,
                id: this.option.polarId
            })[0];
        }
 
    });
 
    zrUtil.merge(PolarAxisModel.prototype, require('../axisModelCommonMixin'));
 
    var polarAxisDefaultExtendedOption = {
        angle: {
            // polarIndex: 0,
            // polarId: '',
 
            startAngle: 90,
 
            clockwise: true,
 
            splitNumber: 12,
 
            axisLabel: {
                rotate: false
            }
        },
        radius: {
            // polarIndex: 0,
            // polarId: '',
 
            splitNumber: 5
        }
    };
 
    function getAxisType(axisDim, option) {
        // Default axis with data is category axis
        return option.type || (option.data ? 'category' : 'value');
    }
 
    axisModelCreator('angle', PolarAxisModel, getAxisType, polarAxisDefaultExtendedOption.angle);
    axisModelCreator('radius', PolarAxisModel, getAxisType, polarAxisDefaultExtendedOption.radius);
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/polar/Polar.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/polar/Polar.js

Statements: 9.26% (5 / 54)      Branches: 0% (0 / 25)      Functions: 0% (0 / 17)      Lines: 9.26% (5 / 54)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258            1 1             1                                                                   1                                                                                                                                                                                                                                                                                                                                                                                                                             1    
'use strict';
/**
 * @module echarts/coord/polar/Polar
 */
 
 
    var RadiusAxis = require('./RadiusAxis');
    var AngleAxis = require('./AngleAxis');
 
    /**
     * @alias {module:echarts/coord/polar/Polar}
     * @constructor
     * @param {string} name
     */
    var Polar = function (name) {
 
        /**
         * @type {string}
         */
        this.name = name || '';
 
        /**
         * x of polar center
         * @type {number}
         */
        this.cx = 0;
 
        /**
         * y of polar center
         * @type {number}
         */
        this.cy = 0;
 
        /**
         * @type {module:echarts/coord/polar/RadiusAxis}
         * @private
         */
        this._radiusAxis = new RadiusAxis();
 
        /**
         * @type {module:echarts/coord/polar/AngleAxis}
         * @private
         */
        this._angleAxis = new AngleAxis();
 
        this._radiusAxis.polar = this._angleAxis.polar = this;
    };
 
    Polar.prototype = {
 
        type: 'polar',
 
        axisPointerEnabled: true,
 
        constructor: Polar,
 
        /**
         * @param {Array.<string>}
         * @readOnly
         */
        dimensions: ['radius', 'angle'],
 
        /**
         * @type {module:echarts/coord/PolarModel}
         */
        model: null,
 
        /**
         * If contain coord
         * @param {Array.<number>} point
         * @return {boolean}
         */
        containPoint: function (point) {
            var coord = this.pointToCoord(point);
            return this._radiusAxis.contain(coord[0])
                && this._angleAxis.contain(coord[1]);
        },
 
        /**
         * If contain data
         * @param {Array.<number>} data
         * @return {boolean}
         */
        containData: function (data) {
            return this._radiusAxis.containData(data[0])
                && this._angleAxis.containData(data[1]);
        },
 
        /**
         * @param {string} dim
         * @return {module:echarts/coord/polar/AngleAxis|module:echarts/coord/polar/RadiusAxis}
         */
        getAxis: function (dim) {
            return this['_' + dim + 'Axis'];
        },
 
        /**
         * @return {Array.<module:echarts/coord/Axis>}
         */
        getAxes: function () {
            return [this._radiusAxis, this._angleAxis];
        },
 
        /**
         * Get axes by type of scale
         * @param {string} scaleType
         * @return {module:echarts/coord/polar/AngleAxis|module:echarts/coord/polar/RadiusAxis}
         */
        getAxesByScale: function (scaleType) {
            var axes = [];
            var angleAxis = this._angleAxis;
            var radiusAxis = this._radiusAxis;
            angleAxis.scale.type === scaleType && axes.push(angleAxis);
            radiusAxis.scale.type === scaleType && axes.push(radiusAxis);
 
            return axes;
        },
 
        /**
         * @return {module:echarts/coord/polar/AngleAxis}
         */
        getAngleAxis: function () {
            return this._angleAxis;
        },
 
        /**
         * @return {module:echarts/coord/polar/RadiusAxis}
         */
        getRadiusAxis: function () {
            return this._radiusAxis;
        },
 
        /**
         * @param {module:echarts/coord/polar/Axis}
         * @return {module:echarts/coord/polar/Axis}
         */
        getOtherAxis: function (axis) {
            var angleAxis = this._angleAxis;
            return axis === angleAxis ? this._radiusAxis : angleAxis;
        },
 
        /**
         * Base axis will be used on stacking.
         *
         * @return {module:echarts/coord/polar/Axis}
         */
        getBaseAxis: function () {
            return this.getAxesByScale('ordinal')[0]
                || this.getAxesByScale('time')[0]
                || this.getAngleAxis();
        },
 
        /**
         * @param {string} [dim] 'radius' or 'angle' or 'auto' or null/undefined
         * @return {Object} {baseAxes: [], otherAxes: []}
         */
        getTooltipAxes: function (dim) {
            var baseAxis = (dim != null && dim !== 'auto')
                ? this.getAxis(dim) : this.getBaseAxis();
            return {
                baseAxes: [baseAxis],
                otherAxes: [this.getOtherAxis(baseAxis)]
            };
        },
 
        /**
         * Convert series data to a list of (x, y) points
         * @param {module:echarts/data/List} data
         * @return {Array}
         *  Return list of coordinates. For example:
         *  `[[10, 10], [20, 20], [30, 30]]`
         */
        dataToPoints: function (data) {
            return data.mapArray(this.dimensions, function (radius, angle) {
                return this.dataToPoint([radius, angle]);
            }, this);
        },
 
        /**
         * Convert a single data item to (x, y) point.
         * Parameter data is an array which the first element is radius and the second is angle
         * @param {Array.<number>} data
         * @param {boolean} [clamp=false]
         * @return {Array.<number>}
         */
        dataToPoint: function (data, clamp) {
            return this.coordToPoint([
                this._radiusAxis.dataToRadius(data[0], clamp),
                this._angleAxis.dataToAngle(data[1], clamp)
            ]);
        },
 
        /**
         * Convert a (x, y) point to data
         * @param {Array.<number>} point
         * @param {boolean} [clamp=false]
         * @return {Array.<number>}
         */
        pointToData: function (point, clamp) {
            var coord = this.pointToCoord(point);
            return [
                this._radiusAxis.radiusToData(coord[0], clamp),
                this._angleAxis.angleToData(coord[1], clamp)
            ];
        },
 
        /**
         * Convert a (x, y) point to (radius, angle) coord
         * @param {Array.<number>} point
         * @return {Array.<number>}
         */
        pointToCoord: function (point) {
            var dx = point[0] - this.cx;
            var dy = point[1] - this.cy;
            var angleAxis = this.getAngleAxis();
            var extent = angleAxis.getExtent();
            var minAngle = Math.min(extent[0], extent[1]);
            var maxAngle = Math.max(extent[0], extent[1]);
            // Fix fixed extent in polarCreator
            // FIXME
            angleAxis.inverse
                ? (minAngle = maxAngle - 360)
                : (maxAngle = minAngle + 360);
 
            var radius = Math.sqrt(dx * dx + dy * dy);
            dx /= radius;
            dy /= radius;
 
            var radian = Math.atan2(-dy, dx) / Math.PI * 180;
 
            // move to angleExtent
            var dir = radian < minAngle ? 1 : -1;
            while (radian < minAngle || radian > maxAngle) {
                radian += dir * 360;
            }
 
            return [radius, radian];
        },
 
        /**
         * Convert a (radius, angle) coord to (x, y) point
         * @param {Array.<number>} coord
         * @return {Array.<number>}
         */
        coordToPoint: function (coord) {
            var radius = coord[0];
            var radian = coord[1] / 180 * Math.PI;
            var x = Math.cos(radian) * radius + this.cx;
            // Inverse the y
            var y = -Math.sin(radian) * radius + this.cy;
 
            return [x, y];
        }
    };
 
    module.exports = Polar;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/polar/PolarModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/polar/PolarModel.js

Statements: 25% (2 / 8)      Branches: 0% (0 / 2)      Functions: 0% (0 / 2)      Lines: 25% (2 / 8)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45      1   1                                                                              
'use strict';
 
 
    require('./AxisModel');
 
    require('../../echarts').extendComponentModel({
 
        type: 'polar',
 
        dependencies: ['polarAxis', 'angleAxis'],
 
        /**
         * @type {module:echarts/coord/polar/Polar}
         */
        coordinateSystem: null,
 
        /**
         * @param {string} axisType
         * @return {module:echarts/coord/polar/AxisModel}
         */
        findAxisModel: function (axisType) {
            var foundAxisModel;
            var ecModel = this.ecModel;
 
            ecModel.eachComponent(axisType, function (axisModel) {
                if (axisModel.getCoordSysModel() === this) {
                    foundAxisModel = axisModel;
                }
            }, this);
            return foundAxisModel;
        },
 
        defaultOption: {
 
            zlevel: 0,
 
            z: 0,
 
            center: ['50%', '50%'],
 
            radius: '80%'
        }
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/polar/RadiusAxis.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/polar/RadiusAxis.js

Statements: 66.67% (6 / 9)      Branches: 0% (0 / 2)      Functions: 0% (0 / 2)      Lines: 66.67% (6 / 9)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42      1 1   1                             1                               1   1    
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
    var Axis = require('../Axis');
 
    function RadiusAxis(scale, radiusExtent) {
 
        Axis.call(this, 'radius', scale, radiusExtent);
 
        /**
         * Axis type
         *  - 'category'
         *  - 'value'
         *  - 'time'
         *  - 'log'
         * @type {string}
         */
        this.type = 'category';
    }
 
    RadiusAxis.prototype = {
 
        constructor: RadiusAxis,
 
        /**
         * @override
         */
        pointToData: function (point, clamp) {
            return this.polar.pointToData(point, clamp)[this.dim === 'radius' ? 0 : 1];
        },
 
        dataToRadius: Axis.prototype.dataToCoord,
 
        radiusToData: Axis.prototype.coordToData
    };
 
    zrUtil.inherits(RadiusAxis, Axis);
 
    module.exports = RadiusAxis;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/polar/polarCreator.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/polar/polarCreator.js

Statements: 15.71% (11 / 70)      Branches: 0% (0 / 20)      Functions: 0% (0 / 7)      Lines: 15.71% (11 / 70)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147      1 1 1   1 1     1             1                                     1                                                                   1                                   1                                                                                                             1    
// TODO Axis scale
 
 
    var Polar = require('./Polar');
    var numberUtil = require('../../util/number');
    var zrUtil = require('zrender/lib/core/util');
 
    var axisHelper = require('../../coord/axisHelper');
    var niceScaleExtent = axisHelper.niceScaleExtent;
 
    // 依赖 PolarModel 做预处理
    require('./PolarModel');
 
    /**
     * Resize method bound to the polar
     * @param {module:echarts/coord/polar/PolarModel} polarModel
     * @param {module:echarts/ExtensionAPI} api
     */
    function resizePolar(polarModel, api) {
        var center = polarModel.get('center');
        var radius = polarModel.get('radius');
        var width = api.getWidth();
        var height = api.getHeight();
        var parsePercent = numberUtil.parsePercent;
 
        this.cx = parsePercent(center[0], width);
        this.cy = parsePercent(center[1], height);
 
        var radiusAxis = this.getRadiusAxis();
        var size = Math.min(width, height) / 2;
        // var idx = radiusAxis.inverse ? 1 : 0;
        radiusAxis.setExtent(0, parsePercent(radius, size));
    }
 
    /**
     * Update polar
     */
    function updatePolarScale(ecModel, api) {
        var polar = this;
        var angleAxis = polar.getAngleAxis();
        var radiusAxis = polar.getRadiusAxis();
        // Reset scale
        angleAxis.scale.setExtent(Infinity, -Infinity);
        radiusAxis.scale.setExtent(Infinity, -Infinity);
 
        ecModel.eachSeries(function (seriesModel) {
            if (seriesModel.coordinateSystem === polar) {
                var data = seriesModel.getData();
                radiusAxis.scale.unionExtentFromData(data, 'radius');
                angleAxis.scale.unionExtentFromData(data, 'angle');
            }
        });
 
        niceScaleExtent(angleAxis.scale, angleAxis.model);
        niceScaleExtent(radiusAxis.scale, radiusAxis.model);
 
        // Fix extent of category angle axis
        if (angleAxis.type === 'category' && !angleAxis.onBand) {
            var extent = angleAxis.getExtent();
            var diff = 360 / angleAxis.scale.count();
            angleAxis.inverse ? (extent[1] += diff) : (extent[1] -= diff);
            angleAxis.setExtent(extent[0], extent[1]);
        }
    }
 
    /**
     * Set common axis properties
     * @param {module:echarts/coord/polar/AngleAxis|module:echarts/coord/polar/RadiusAxis}
     * @param {module:echarts/coord/polar/AxisModel}
     * @inner
     */
    function setAxis(axis, axisModel) {
        axis.type = axisModel.get('type');
        axis.scale = axisHelper.createScaleByModel(axisModel);
        axis.onBand = axisModel.get('boundaryGap') && axis.type === 'category';
 
        // FIXME Radius axis not support inverse axis
        if (axisModel.mainType === 'angleAxis') {
            var startAngle = axisModel.get('startAngle');
            axis.inverse = axisModel.get('inverse') ^ axisModel.get('clockwise');
            axis.setExtent(startAngle, startAngle + (axis.inverse ? -360 : 360));
        }
 
        // Inject axis instance
        axisModel.axis = axis;
        axis.model = axisModel;
    }
 
 
    var polarCreator = {
 
        dimensions: Polar.prototype.dimensions,
 
        create: function (ecModel, api) {
            var polarList = [];
            ecModel.eachComponent('polar', function (polarModel, idx) {
                var polar = new Polar(idx);
                // Inject resize and update method
                polar.resize = resizePolar;
                polar.update = updatePolarScale;
 
                var radiusAxis = polar.getRadiusAxis();
                var angleAxis = polar.getAngleAxis();
 
                var radiusAxisModel = polarModel.findAxisModel('radiusAxis');
                var angleAxisModel = polarModel.findAxisModel('angleAxis');
 
                setAxis(radiusAxis, radiusAxisModel);
                setAxis(angleAxis, angleAxisModel);
 
                polar.resize(polarModel, api);
                polarList.push(polar);
 
                polarModel.coordinateSystem = polar;
                polar.model = polarModel;
            });
            // Inject coordinateSystem to series
            ecModel.eachSeries(function (seriesModel) {
                if (seriesModel.get('coordinateSystem') === 'polar') {
                    var polarModel = ecModel.queryComponents({
                        mainType: 'polar',
                        index: seriesModel.get('polarIndex'),
                        id: seriesModel.get('polarId')
                    })[0];
 
                    if (__DEV__) {
                        if (!polarModel) {
                            throw new Error(
                                'Polar "' + zrUtil.retrieve(
                                    seriesModel.get('polarIndex'),
                                    seriesModel.get('polarId'),
                                    0
                                ) + '" not found'
                            );
                        }
                    }
                    seriesModel.coordinateSystem = polarModel.coordinateSystem;
                }
            });
 
            return polarList;
        }
    };
 
    require('../../CoordinateSystem').register('polar', polarCreator);
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/radar/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/radar/

Statements: 17.61% (31 / 176)      Branches: 0% (0 / 50)      Functions: 4.55% (1 / 22)      Lines: 17.61% (31 / 176)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/coord/radar/
File Statements Branches Functions Lines
IndicatorAxis.js 50% (5 / 10) 100% (0 / 0) 0% (0 / 1) 50% (5 / 10)
Radar.js 13.39% (17 / 127) 0% (0 / 30) 0% (0 / 17) 13.39% (17 / 127)
RadarModel.js 23.08% (9 / 39) 0% (0 / 20) 25% (1 / 4) 23.08% (9 / 39)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/radar/IndicatorAxis.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/radar/IndicatorAxis.js

Statements: 50% (5 / 10)      Branches: 100% (0 / 0)      Functions: 0% (0 / 1)      Lines: 50% (5 / 10)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36    1 1   1                                                   1   1    
 
 
    var zrUtil = require('zrender/lib/core/util');
    var Axis = require('../Axis');
 
    function IndicatorAxis(dim, scale, radiusExtent) {
        Axis.call(this, dim, scale, radiusExtent);
 
        /**
         * Axis type
         *  - 'category'
         *  - 'value'
         *  - 'time'
         *  - 'log'
         * @type {string}
         */
        this.type = 'value';
 
        this.angle = 0;
 
        /**
         * Indicator name
         * @type {string}
         */
        this.name = '';
        /**
         * @type {module:echarts/model/Model}
         */
        this.model;
    }
 
    zrUtil.inherits(IndicatorAxis, Axis);
 
    module.exports = IndicatorAxis;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/radar/Radar.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/radar/Radar.js

Statements: 13.39% (17 / 127)      Branches: 0% (0 / 30)      Functions: 0% (0 / 17)      Lines: 13.39% (17 / 127)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235      1 1 1 1 1   1                                                                                       1       1           1               1                                                     1                                         1                                       1                                                                                                                                                   1   1                               1 1    
// TODO clockwise
 
 
    var zrUtil = require('zrender/lib/core/util');
    var IndicatorAxis = require('./IndicatorAxis');
    var IntervalScale = require('../../scale/Interval');
    var numberUtil = require('../../util/number');
    var axisHelper = require('../axisHelper');
 
    function Radar(radarModel, ecModel, api) {
 
        this._model = radarModel;
        /**
         * Radar dimensions
         * @type {Array.<string>}
         */
        this.dimensions = [];
 
        this._indicatorAxes = zrUtil.map(radarModel.getIndicatorModels(), function (indicatorModel, idx) {
            var dim = 'indicator_' + idx;
            var indicatorAxis = new IndicatorAxis(dim, new IntervalScale());
            indicatorAxis.name = indicatorModel.get('name');
            // Inject model and axis
            indicatorAxis.model = indicatorModel;
            indicatorModel.axis = indicatorAxis;
            this.dimensions.push(dim);
            return indicatorAxis;
        }, this);
 
        this.resize(radarModel, api);
 
        /**
         * @type {number}
         * @readOnly
         */
        this.cx;
        /**
         * @type {number}
         * @readOnly
         */
        this.cy;
        /**
         * @type {number}
         * @readOnly
         */
        this.r;
        /**
         * @type {number}
         * @readOnly
         */
        this.startAngle;
    }
 
    Radar.prototype.getIndicatorAxes = function () {
        return this._indicatorAxes;
    };
 
    Radar.prototype.dataToPoint = function (value, indicatorIndex) {
        var indicatorAxis = this._indicatorAxes[indicatorIndex];
 
        return this.coordToPoint(indicatorAxis.dataToCoord(value), indicatorIndex);
    };
 
    Radar.prototype.coordToPoint = function (coord, indicatorIndex) {
        var indicatorAxis = this._indicatorAxes[indicatorIndex];
        var angle = indicatorAxis.angle;
        var x = this.cx + coord * Math.cos(angle);
        var y = this.cy - coord * Math.sin(angle);
        return [x, y];
    };
 
    Radar.prototype.pointToData = function (pt) {
        var dx = pt[0] - this.cx;
        var dy = pt[1] - this.cy;
        var radius = Math.sqrt(dx * dx + dy * dy);
        dx /= radius;
        dy /= radius;
 
        var radian = Math.atan2(-dy, dx);
 
        // Find the closest angle
        // FIXME index can calculated directly
        var minRadianDiff = Infinity;
        var closestAxis;
        var closestAxisIdx = -1;
        for (var i = 0; i < this._indicatorAxes.length; i++) {
            var indicatorAxis = this._indicatorAxes[i];
            var diff = Math.abs(radian - indicatorAxis.angle);
            if (diff < minRadianDiff) {
                closestAxis = indicatorAxis;
                closestAxisIdx = i;
                minRadianDiff = diff;
            }
        }
 
        return [closestAxisIdx, +(closestAxis && closestAxis.coodToData(radius))];
    };
 
    Radar.prototype.resize = function (radarModel, api) {
        var center = radarModel.get('center');
        var viewWidth = api.getWidth();
        var viewHeight = api.getHeight();
        var viewSize = Math.min(viewWidth, viewHeight) / 2;
        this.cx = numberUtil.parsePercent(center[0], viewWidth);
        this.cy = numberUtil.parsePercent(center[1], viewHeight);
 
        this.startAngle = radarModel.get('startAngle') * Math.PI / 180;
 
        this.r = numberUtil.parsePercent(radarModel.get('radius'), viewSize);
 
        zrUtil.each(this._indicatorAxes, function (indicatorAxis, idx) {
            indicatorAxis.setExtent(0, this.r);
            var angle = (this.startAngle + idx * Math.PI * 2 / this._indicatorAxes.length);
            // Normalize to [-PI, PI]
            angle = Math.atan2(Math.sin(angle), Math.cos(angle));
            indicatorAxis.angle = angle;
        }, this);
    };
 
    Radar.prototype.update = function (ecModel, api) {
        var indicatorAxes = this._indicatorAxes;
        var radarModel = this._model;
        zrUtil.each(indicatorAxes, function (indicatorAxis) {
            indicatorAxis.scale.setExtent(Infinity, -Infinity);
        });
        ecModel.eachSeriesByType('radar', function (radarSeries, idx) {
            if (radarSeries.get('coordinateSystem') !== 'radar'
                || ecModel.getComponent('radar', radarSeries.get('radarIndex')) !== radarModel
            ) {
                return;
            }
            var data = radarSeries.getData();
            zrUtil.each(indicatorAxes, function (indicatorAxis) {
                indicatorAxis.scale.unionExtentFromData(data, indicatorAxis.dim);
            });
        }, this);
 
        var splitNumber = radarModel.get('splitNumber');
 
        function increaseInterval(interval) {
            var exp10 = Math.pow(10, Math.floor(Math.log(interval) / Math.LN10));
            // Increase interval
            var f = interval / exp10;
            if (f === 2) {
                f = 5;
            }
            else { // f is 2 or 5
                f *= 2;
            }
            return f * exp10;
        }
        // Force all the axis fixing the maxSplitNumber.
        zrUtil.each(indicatorAxes, function (indicatorAxis, idx) {
            var rawExtent = axisHelper.getScaleExtent(indicatorAxis.scale, indicatorAxis.model);
            axisHelper.niceScaleExtent(indicatorAxis.scale, indicatorAxis.model);
 
            var axisModel = indicatorAxis.model;
            var scale = indicatorAxis.scale;
            var fixedMin = axisModel.getMin();
            var fixedMax = axisModel.getMax();
            var interval = scale.getInterval();
 
            if (fixedMin != null && fixedMax != null) {
                // User set min, max, divide to get new interval
                // FIXME precision
                scale.setInterval(
                    (fixedMax - fixedMin) / splitNumber
                );
            }
            else if (fixedMin != null) {
                var max;
                // User set min, expand extent on the other side
                do {
                    max = fixedMin + interval * splitNumber;
                    scale.setExtent(+fixedMin, max);
                    // Interval must been set after extent
                    // FIXME
                    scale.setInterval(interval);
 
                    interval = increaseInterval(interval);
                } while (max < rawExtent[1] && isFinite(max) && isFinite(rawExtent[1]));
            }
            else if (fixedMax != null) {
                var min;
                // User set min, expand extent on the other side
                do {
                    min = fixedMax - interval * splitNumber;
                    scale.setExtent(min, +fixedMax);
                    scale.setInterval(interval);
                    interval = increaseInterval(interval);
                } while (min > rawExtent[0] && isFinite(min) && isFinite(rawExtent[0]));
            }
            else {
                var nicedSplitNumber = scale.getTicks().length - 1;
                if (nicedSplitNumber > splitNumber) {
                    interval = increaseInterval(interval);
                }
                // PENDING
                var center = Math.round((rawExtent[0] + rawExtent[1]) / 2 / interval) * interval;
                var halfSplitNumber = Math.round(splitNumber / 2);
                scale.setExtent(
                    numberUtil.round(center - halfSplitNumber * interval),
                    numberUtil.round(center + (splitNumber - halfSplitNumber) * interval)
                );
                scale.setInterval(interval);
            }
        });
    };
 
    /**
     * Radar dimensions is based on the data
     * @type {Array}
     */
    Radar.dimensions = [];
 
    Radar.create = function (ecModel, api) {
        var radarList = [];
        ecModel.eachComponent('radar', function (radarModel) {
            var radar = new Radar(radarModel, ecModel, api);
            radarList.push(radar);
            radarModel.coordinateSystem = radar;
        });
        ecModel.eachSeriesByType('radar', function (radarSeries) {
            if (radarSeries.get('coordinateSystem') === 'radar') {
                // Inject coordinate system
                radarSeries.coordinateSystem = radarList[radarSeries.get('radarIndex') || 0];
            }
        });
        return radarList;
    };
 
    require('../../CoordinateSystem').register('radar', Radar);
    module.exports = Radar;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/radar/RadarModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/radar/RadarModel.js

Statements: 23.08% (9 / 39)      Branches: 0% (0 / 20)      Functions: 25% (1 / 4)      Lines: 23.08% (9 / 39)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136      1 1 1 1   1   1 4         1                                                                                                                                                                                                                                         1    
 
 
 
    var axisDefault = require('../axisDefault');
    var valueAxisDefault = axisDefault.valueAxis;
    var Model = require('../../model/Model');
    var zrUtil = require('zrender/lib/core/util');
 
    var axisModelCommonMixin = require('../axisModelCommonMixin');
 
    function defaultsShow(opt, show) {
        return zrUtil.defaults({
            show: show
        }, opt);
    }
 
    var RadarModel = require('../../echarts').extendComponentModel({
 
        type: 'radar',
 
        optionUpdated: function () {
            var boundaryGap = this.get('boundaryGap');
            var splitNumber = this.get('splitNumber');
            var scale = this.get('scale');
            var axisLine = this.get('axisLine');
            var axisTick = this.get('axisTick');
            var axisLabel = this.get('axisLabel');
            var nameTextStyle = this.get('name.textStyle');
            var showName = this.get('name.show');
            var nameFormatter = this.get('name.formatter');
            var nameGap = this.get('nameGap');
            var triggerEvent = this.get('triggerEvent');
 
            var indicatorModels = zrUtil.map(this.get('indicator') || [], function (indicatorOpt) {
                // PENDING
                if (indicatorOpt.max != null && indicatorOpt.max > 0 && !indicatorOpt.min) {
                    indicatorOpt.min = 0;
                }
                else if (indicatorOpt.min != null && indicatorOpt.min < 0 && !indicatorOpt.max) {
                    indicatorOpt.max = 0;
                }
                // Use same configuration
                indicatorOpt = zrUtil.merge(zrUtil.clone(indicatorOpt), {
                    boundaryGap: boundaryGap,
                    splitNumber: splitNumber,
                    scale: scale,
                    axisLine: axisLine,
                    axisTick: axisTick,
                    axisLabel: axisLabel,
                    // Competitable with 2 and use text
                    name: indicatorOpt.text,
                    nameLocation: 'end',
                    nameGap: nameGap,
                    // min: 0,
                    nameTextStyle: nameTextStyle,
                    triggerEvent: triggerEvent
                }, false);
                if (!showName) {
                    indicatorOpt.name = '';
                }
                if (typeof nameFormatter === 'string') {
                    var indName = indicatorOpt.name;
                    indicatorOpt.name = nameFormatter.replace('{value}', indName != null ? indName : '');
                }
                else if (typeof nameFormatter === 'function') {
                    indicatorOpt.name = nameFormatter(
                        indicatorOpt.name, indicatorOpt
                    );
                }
                var model = zrUtil.extend(
                    new Model(indicatorOpt, null, this.ecModel),
                    axisModelCommonMixin
                );
 
                // For triggerEvent.
                model.mainType = 'radar';
                model.componentIndex = this.componentIndex;
 
                return model;
            }, this);
 
            this.getIndicatorModels = function () {
                return indicatorModels;
            };
        },
 
        defaultOption: {
 
            zlevel: 0,
 
            z: 0,
 
            center: ['50%', '50%'],
 
            radius: '75%',
 
            startAngle: 90,
 
            name: {
                show: true
                // formatter: null
                // textStyle: {}
            },
 
            boundaryGap: [0, 0],
 
            splitNumber: 5,
 
            nameGap: 15,
 
            scale: false,
 
            // Polygon or circle
            shape: 'polygon',
 
            axisLine: zrUtil.merge(
                {
                    lineStyle: {
                        color: '#bbb'
                    }
                },
                valueAxisDefault.axisLine
            ),
            axisLabel: defaultsShow(valueAxisDefault.axisLabel, false),
            axisTick: defaultsShow(valueAxisDefault.axisTick, false),
            splitLine: defaultsShow(valueAxisDefault.splitLine, true),
            splitArea: defaultsShow(valueAxisDefault.splitArea, true),
 
            // {text, min, max}
            indicator: []
        }
    });
 
    module.exports = RadarModel;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/single/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/single/

Statements: 21.01% (25 / 119)      Branches: 0% (0 / 52)      Functions: 0% (0 / 28)      Lines: 21.01% (25 / 119)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/coord/single/
File Statements Branches Functions Lines
AxisModel.js 81.82% (9 / 11) 0% (0 / 4) 0% (0 / 2) 81.82% (9 / 11)
Single.js 8.82% (6 / 68) 0% (0 / 30) 0% (0 / 19) 8.82% (6 / 68)
SingleAxis.js 28% (7 / 25) 0% (0 / 14) 0% (0 / 4) 28% (7 / 25)
singleCreator.js 20% (3 / 15) 0% (0 / 4) 0% (0 / 3) 20% (3 / 15)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/single/AxisModel.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/single/AxisModel.js

Statements: 81.82% (9 / 11)      Branches: 0% (0 / 4)      Functions: 0% (0 / 2)      Lines: 81.82% (9 / 11)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92    1 1 1   1                                                 1                                                                                                   1       1   1   1    
 
 
    var ComponentModel = require('../../model/Component');
    var axisModelCreator = require('../axisModelCreator');
    var zrUtil =  require('zrender/lib/core/util');
 
    var AxisModel = ComponentModel.extend({
 
        type: 'singleAxis',
 
        layoutMode: 'box',
 
        /**
         * @type {module:echarts/coord/single/SingleAxis}
         */
        axis: null,
 
        /**
         * @type {module:echarts/coord/single/Single}
         */
        coordinateSystem: null,
 
        /**
         * @override
         */
        getCoordSysModel: function () {
            return this;
        }
 
    });
 
    var defaultOption = {
 
        left: '5%',
        top: '5%',
        right: '5%',
        bottom: '5%',
 
        type: 'value',
 
        position: 'bottom',
 
        orient: 'horizontal',
 
        axisLine: {
            show: true,
            lineStyle: {
                width: 2,
                type: 'solid'
            }
        },
 
        // Single coordinate system and single axis is the,
        // which is used as the parent tooltip model.
        // same model, so we set default tooltip show as true.
        tooltip: {
            show: true
        },
 
        axisTick: {
            show: true,
            length: 6,
            lineStyle: {
                width: 2
            }
        },
 
        axisLabel: {
            show: true,
            interval: 'auto'
        },
 
        splitLine: {
            show: true,
            lineStyle: {
                type: 'dashed',
                opacity: 0.2
            }
        }
    };
 
    function getAxisType(axisName, option) {
        return option.type || (option.data ? 'category' : 'value');
    }
 
    zrUtil.merge(AxisModel.prototype, require('../axisModelCommonMixin'));
 
    axisModelCreator('single', AxisModel, getAxisType, defaultOption);
 
    module.exports = AxisModel;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/single/Single.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/single/Single.js

Statements: 8.82% (6 / 68)      Branches: 0% (0 / 30)      Functions: 0% (0 / 19)      Lines: 8.82% (6 / 68)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275          1 1 1                 1                                                                       1                                                                                                                                                                                                                                                                                                                                                                                                                                                     1      
/**
 * Single coordinates system.
 */
 
 
    var SingleAxis = require('./SingleAxis');
    var axisHelper = require('../axisHelper');
    var layout = require('../../util/layout');
 
    /**
     * Create a single coordinates system.
     *
     * @param {module:echarts/coord/single/AxisModel} axisModel
     * @param {module:echarts/model/Global} ecModel
     * @param {module:echarts/ExtensionAPI} api
     */
    function Single(axisModel, ecModel, api) {
 
        /**
         * @type {string}
         * @readOnly
         */
        this.dimension = 'single';
 
        /**
         * Add it just for draw tooltip.
         *
         * @type {Array.<string>}
         * @readOnly
         */
        this.dimensions = ['single'];
 
        /**
         * @private
         * @type {module:echarts/coord/single/SingleAxis}.
         */
        this._axis = null;
 
        /**
         * @private
         * @type {module:zrender/core/BoundingRect}
         */
        this._rect;
 
        this._init(axisModel, ecModel, api);
 
        /**
         * @type {module:echarts/coord/single/AxisModel}
         */
        this.model = axisModel;
    }
 
    Single.prototype = {
 
        type: 'singleAxis',
 
        axisPointerEnabled: true,
 
        constructor: Single,
 
        /**
         * Initialize single coordinate system.
         *
         * @param  {module:echarts/coord/single/AxisModel} axisModel
         * @param  {module:echarts/model/Global} ecModel
         * @param  {module:echarts/ExtensionAPI} api
         * @private
         */
        _init: function (axisModel, ecModel, api) {
 
            var dim = this.dimension;
 
            var axis = new SingleAxis(
                dim,
                axisHelper.createScaleByModel(axisModel),
                [0, 0],
                axisModel.get('type'),
                axisModel.get('position')
            );
 
            var isCategory = axis.type === 'category';
            axis.onBand = isCategory && axisModel.get('boundaryGap');
            axis.inverse = axisModel.get('inverse');
            axis.orient = axisModel.get('orient');
 
            axisModel.axis = axis;
            axis.model = axisModel;
            axis.coordinateSystem = this;
            this._axis = axis;
        },
 
        /**
         * Update axis scale after data processed
         * @param  {module:echarts/model/Global} ecModel
         * @param  {module:echarts/ExtensionAPI} api
         */
        update: function (ecModel, api) {
            ecModel.eachSeries(function (seriesModel) {
                if (seriesModel.coordinateSystem === this) {
                    var data = seriesModel.getData();
                    var dim = this.dimension;
                    this._axis.scale.unionExtentFromData(
                        data, seriesModel.coordDimToDataDim(dim)
                    );
                    axisHelper.niceScaleExtent(this._axis.scale, this._axis.model);
                }
            }, this);
        },
 
        /**
         * Resize the single coordinate system.
         *
         * @param  {module:echarts/coord/single/AxisModel} axisModel
         * @param  {module:echarts/ExtensionAPI} api
         */
        resize: function (axisModel, api) {
            this._rect = layout.getLayoutRect(
                {
                    left: axisModel.get('left'),
                    top: axisModel.get('top'),
                    right: axisModel.get('right'),
                    bottom: axisModel.get('bottom'),
                    width: axisModel.get('width'),
                    height: axisModel.get('height')
                },
                {
                    width: api.getWidth(),
                    height: api.getHeight()
                }
            );
 
            this._adjustAxis();
        },
 
        /**
         * @return {module:zrender/core/BoundingRect}
         */
        getRect: function () {
            return this._rect;
        },
 
        /**
         * @private
         */
        _adjustAxis: function () {
 
            var rect = this._rect;
            var axis = this._axis;
 
            var isHorizontal = axis.isHorizontal();
            var extent = isHorizontal ? [0, rect.width] : [0, rect.height];
            var idx =  axis.reverse ? 1 : 0;
 
            axis.setExtent(extent[idx], extent[1 - idx]);
 
            this._updateAxisTransform(axis, isHorizontal ? rect.x : rect.y);
 
        },
 
        /**
         * @param  {module:echarts/coord/single/SingleAxis} axis
         * @param  {number} coordBase
         */
        _updateAxisTransform: function (axis, coordBase) {
 
            var axisExtent = axis.getExtent();
            var extentSum = axisExtent[0] + axisExtent[1];
            var isHorizontal = axis.isHorizontal();
 
            axis.toGlobalCoord = isHorizontal ?
                function (coord) {
                    return coord + coordBase;
                } :
                function (coord) {
                    return extentSum - coord + coordBase;
                };
 
            axis.toLocalCoord = isHorizontal ?
                function (coord) {
                    return coord - coordBase;
                } :
                function (coord) {
                    return extentSum - coord + coordBase;
                };
        },
 
        /**
         * Get axis.
         *
         * @return {module:echarts/coord/single/SingleAxis}
         */
        getAxis: function () {
            return this._axis;
        },
 
        /**
         * Get axis, add it just for draw tooltip.
         *
         * @return {[type]} [description]
         */
        getBaseAxis: function () {
            return this._axis;
        },
 
        /**
         * @return {Array.<module:echarts/coord/Axis>}
         */
        getAxes: function () {
            return [this._axis];
        },
 
        /**
         * @return {Object} {baseAxes: [], otherAxes: []}
         */
        getTooltipAxes: function () {
            return {baseAxes: [this.getAxis()]};
        },
 
        /**
         * If contain point.
         *
         * @param  {Array.<number>} point
         * @return {boolean}
         */
        containPoint: function (point) {
            var rect = this.getRect();
            var axis = this.getAxis();
            var orient = axis.orient;
            if (orient === 'horizontal') {
                return axis.contain(axis.toLocalCoord(point[0]))
                && (point[1] >= rect.y && point[1] <= (rect.y + rect.height));
            }
            else {
                return axis.contain(axis.toLocalCoord(point[1]))
                && (point[0] >= rect.y && point[0] <= (rect.y + rect.height));
            }
        },
 
        /**
         * @param {Array.<number>} point
         * @return {Array.<number>}
         */
        pointToData: function (point) {
            var axis = this.getAxis();
            return [axis.coordToData(axis.toLocalCoord(
                point[axis.orient === 'horizontal' ? 0 : 1]
            ))];
        },
 
        /**
         * Convert the series data to concrete point.
         *
         * @param  {number|Array.<number>} val
         * @return {Array.<number>}
         */
        dataToPoint: function (val) {
            var axis = this.getAxis();
            var rect = this.getRect();
            var pt = [];
            var idx = axis.orient === 'horizontal' ? 0 : 1;
 
            if (val instanceof Array) {
                val = val[0];
            }
 
            pt[idx] = axis.toGlobalCoord(axis.dataToCoord(+val));
            pt[1 - idx] = idx === 0 ? (rect.y + rect.height / 2) : (rect.x + rect.width / 2);
            return pt;
        }
    };
 
    module.exports = Single;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/single/SingleAxis.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/single/SingleAxis.js

Statements: 28% (7 / 25)      Branches: 0% (0 / 14)      Functions: 0% (0 / 4)      Lines: 28% (7 / 25)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129    1 1 1                     1                                                                             1                                                                                                                                           1   1    
 
 
    var zrUtil = require('zrender/lib/core/util');
    var Axis = require('../Axis');
    var axisHelper = require('../axisHelper');
 
    /**
     * @constructor  module:echarts/coord/single/SingleAxis
     * @extends {module:echarts/coord/Axis}
     * @param {string} dim
     * @param {*} scale
     * @param {Array.<number>} coordExtent
     * @param {string} axisType
     * @param {string} position
     */
    var SingleAxis = function (dim, scale, coordExtent, axisType, position) {
 
        Axis.call(this, dim, scale, coordExtent);
 
        /**
         * Axis type
         * - 'category'
         * - 'value'
         * - 'time'
         * - 'log'
         * @type {string}
         */
        this.type = axisType || 'value';
 
        /**
         * Axis position
         *  - 'top'
         *  - 'bottom'
         *  - 'left'
         *  - 'right'
         *  @type {string}
         */
        this.position = position || 'bottom';
 
        /**
         * Axis orient
         *  - 'horizontal'
         *  - 'vertical'
         * @type {[type]}
         */
        this.orient = null;
 
        /**
         * @type {number}
         */
        this._labelInterval = null;
 
    };
 
    SingleAxis.prototype = {
 
        constructor: SingleAxis,
 
        /**
         * Axis model
         * @type {module:echarts/coord/single/AxisModel}
         */
        model: null,
 
        /**
         * Judge the orient of the axis.
         * @return {boolean}
         */
        isHorizontal: function () {
            var position = this.position;
            return position === 'top' || position === 'bottom';
 
        },
 
        /**
         * Get interval of the axis label.
         * @return {number}
         */
        getLabelInterval: function () {
            var labelInterval = this._labelInterval;
            if (!labelInterval) {
                var axisModel = this.model;
                var labelModel = axisModel.getModel('axisLabel');
                var interval = labelModel.get('interval');
                if (!(this.type === 'category' && interval === 'auto')) {
 
                    labelInterval = this._labelInterval = interval === 'auto' ? 0 : interval;
                    return labelInterval;
                }
                labelInterval = this._labelInterval =
                    axisHelper.getAxisLabelInterval(
                        zrUtil.map(this.scale.getTicks(), this.dataToCoord, this),
                        axisModel.getFormattedLabels(),
                        labelModel.getModel('textStyle').getFont(),
                        this.isHorizontal()
                    );
            }
            return labelInterval;
        },
 
        /**
         * @override
         */
        pointToData: function (point, clamp) {
            return this.coordinateSystem.pointToData(point, clamp)[0];
        },
 
        /**
         * Convert the local coord(processed by dataToCoord())
         * to global coord(concrete pixel coord).
         * designated by module:echarts/coord/single/Single.
         * @type {Function}
         */
        toGlobalCoord: null,
 
        /**
         * Convert the global coord to local coord.
         * designated by module:echarts/coord/single/Single.
         * @type {Function}
         */
        toLocalCoord: null
 
    };
 
    zrUtil.inherits(SingleAxis, Axis);
 
    module.exports = SingleAxis;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/single/singleCreator.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/coord/single/singleCreator.js

Statements: 20% (3 / 15)      Branches: 0% (0 / 4)      Functions: 0% (0 / 3)      Lines: 20% (3 / 15)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47          1                 1                                                     1          
/**
 * Single coordinate system creator.
 */
 
 
    var Single = require('./Single');
 
    /**
     * Create single coordinate system and inject it into seriesModel.
     *
     * @param {module:echarts/model/Global} ecModel
     * @param {module:echarts/ExtensionAPI} api
     * @return {Array.<module:echarts/coord/single/Single>}
     */
    function create(ecModel, api) {
        var singles = [];
 
        ecModel.eachComponent('singleAxis', function(axisModel, idx) {
 
            var single = new Single(axisModel, ecModel, api);
            single.name = 'single_' + idx;
            single.resize(axisModel, api);
            axisModel.coordinateSystem = single;
            singles.push(single);
 
        });
 
        ecModel.eachSeries(function (seriesModel) {
            if (seriesModel.get('coordinateSystem') === 'singleAxis') {
                var singleAxisModel = ecModel.queryComponents({
                    mainType: 'singleAxis',
                    index: seriesModel.get('singleAxisIndex'),
                    id: seriesModel.get('singleAxisId')
                })[0];
                seriesModel.coordinateSystem = singleAxisModel && singleAxisModel.coordinateSystem;
            }
        });
 
        return singles;
    }
 
    require('../../CoordinateSystem').register('single', {
        create: create,
        dimensions: Single.prototype.dimensions
    });
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/data/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/data/

Statements: 13.38% (106 / 792)      Branches: 0.8% (3 / 375)      Functions: 0.88% (1 / 114)      Lines: 13.38% (106 / 792)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/data/
File Statements Branches Functions Lines
DataDiffer.js 8.77% (5 / 57) 0% (0 / 28) 0% (0 / 7) 8.77% (5 / 57)
Graph.js 16.07% (27 / 168) 0% (0 / 73) 3.45% (1 / 29) 16.07% (27 / 168)
List.js 13.68% (61 / 446) 1.35% (3 / 222) 0% (0 / 52) 13.68% (61 / 446)
Tree.js 10.74% (13 / 121) 0% (0 / 52) 0% (0 / 26) 10.74% (13 / 121)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/data/DataDiffer.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/data/DataDiffer.js

Statements: 8.77% (5 / 57)      Branches: 0% (0 / 28)      Functions: 0% (0 / 7)      Lines: 8.77% (5 / 57)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125      1       1               1                                                                                                                                                                                   1                                 1    
'use strict';
 
 
    function defaultKeyGetter(item) {
        return item;
    }
 
    function DataDiffer(oldArr, newArr, oldKeyGetter, newKeyGetter) {
        this._old = oldArr;
        this._new = newArr;
 
        this._oldKeyGetter = oldKeyGetter || defaultKeyGetter;
        this._newKeyGetter = newKeyGetter || defaultKeyGetter;
    }
 
    DataDiffer.prototype = {
 
        constructor: DataDiffer,
 
        /**
         * Callback function when add a data
         */
        add: function (func) {
            this._add = func;
            return this;
        },
 
        /**
         * Callback function when update a data
         */
        update: function (func) {
            this._update = func;
            return this;
        },
 
        /**
         * Callback function when remove a data
         */
        remove: function (func) {
            this._remove = func;
            return this;
        },
 
        execute: function () {
            var oldArr = this._old;
            var newArr = this._new;
            var oldKeyGetter = this._oldKeyGetter;
            var newKeyGetter = this._newKeyGetter;
 
            var oldDataIndexMap = {};
            var newDataIndexMap = {};
            var oldDataKeyArr = [];
            var newDataKeyArr = [];
            var i;
 
            initIndexMap(oldArr, oldDataIndexMap, oldDataKeyArr, oldKeyGetter);
            initIndexMap(newArr, newDataIndexMap, newDataKeyArr, newKeyGetter);
 
            // Travel by inverted order to make sure order consistency
            // when duplicate keys exists (consider newDataIndex.pop() below).
            // For performance consideration, these code below do not look neat.
            for (i = 0; i < oldArr.length; i++) {
                var key = oldDataKeyArr[i];
                var idx = newDataIndexMap[key];
 
                // idx can never be empty array here. see 'set null' logic below.
                if (idx != null) {
                    // Consider there is duplicate key (for example, use dataItem.name as key).
                    // We should make sure every item in newArr and oldArr can be visited.
                    var len = idx.length;
                    if (len) {
                        len === 1 && (newDataIndexMap[key] = null);
                        idx = idx.unshift();
                    }
                    else {
                        newDataIndexMap[key] = null;
                    }
                    this._update && this._update(idx, i);
                }
                else {
                    this._remove && this._remove(i);
                }
            }
 
            for (var i = 0; i < newDataKeyArr.length; i++) {
                var key = newDataKeyArr[i];
                if (newDataIndexMap.hasOwnProperty(key)) {
                    var idx = newDataIndexMap[key];
                    if (idx == null) {
                        continue;
                    }
                    // idx can never be empty array here. see 'set null' logic above.
                    if (!idx.length) {
                        this._add && this._add(idx);
                    }
                    else {
                        for (var j = 0, len = idx.length; j < len; j++) {
                            this._add && this._add(idx[j]);
                        }
                    }
                }
            }
        }
    };
 
    function initIndexMap(arr, map, keyArr, keyGetter) {
        for (var i = 0; i < arr.length; i++) {
            var key = keyGetter(arr[i], i);
            var existence = map[key];
            if (existence == null) {
                keyArr.push(key);
                map[key] = i;
            }
            else {
                if (!existence.length) {
                    map[key] = existence = [existence];
                }
                existence.push(i);
            }
        }
    }
 
    module.exports = DataDiffer;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/data/Graph.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/data/Graph.js

Statements: 16.07% (27 / 168)      Branches: 0% (0 / 73)      Functions: 3.45% (1 / 29)      Lines: 16.07% (27 / 168)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515                  1             1                                                                                       1       1           1                 1                                             1                 1                     1                                                                                                     1                   1                                             1                             1                                       1                                                                                                   1                                                           1                                   1                                                         1                                                                                             1                                         1                   1 2                                                                                                                     1 1   1 1   1    
'use strict';
/**
 * Graph data structure
 *
 * @module echarts/data/Graph
 * @author Yi Shen(https://www.github.com/pissang)
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    /**
     * @alias module:echarts/data/Graph
     * @constructor
     * @param {boolean} directed
     */
    var Graph = function(directed) {
        /**
         * 是否是有向图
         * @type {boolean}
         * @private
         */
        this._directed = directed || false;
 
        /**
         * @type {Array.<module:echarts/data/Graph.Node>}
         * @readOnly
         */
        this.nodes = [];
 
        /**
         * @type {Array.<module:echarts/data/Graph.Edge>}
         * @readOnly
         */
        this.edges = [];
 
        /**
         * @type {Object.<string, module:echarts/data/Graph.Node>}
         * @private
         */
        this._nodesMap = {};
        /**
         * @type {Object.<string, module:echarts/data/Graph.Edge>}
         * @private
         */
        this._edgesMap = {};
 
        /**
         * @type {module:echarts/data/List}
         * @readOnly
         */
        this.data;
 
        /**
         * @type {module:echarts/data/List}
         * @readOnly
         */
        this.edgeData;
    };
 
    var graphProto = Graph.prototype;
    /**
     * @type {string}
     */
    graphProto.type = 'graph';
 
    /**
     * If is directed graph
     * @return {boolean}
     */
    graphProto.isDirected = function () {
        return this._directed;
    };
 
    /**
     * Add a new node
     * @param {string} id
     * @param {number} [dataIndex]
     */
    graphProto.addNode = function (id, dataIndex) {
        id = id || ('' + dataIndex);
 
        var nodesMap = this._nodesMap;
 
        if (nodesMap[id]) {
            return;
        }
 
        var node = new Node(id, dataIndex);
        node.hostGraph = this;
 
        this.nodes.push(node);
 
        nodesMap[id] = node;
        return node;
    };
 
    /**
     * Get node by data index
     * @param  {number} dataIndex
     * @return {module:echarts/data/Graph~Node}
     */
    graphProto.getNodeByIndex = function (dataIndex) {
        var rawIdx = this.data.getRawIndex(dataIndex);
        return this.nodes[rawIdx];
    };
    /**
     * Get node by id
     * @param  {string} id
     * @return {module:echarts/data/Graph.Node}
     */
    graphProto.getNodeById = function (id) {
        return this._nodesMap[id];
    };
 
    /**
     * Add a new edge
     * @param {number|string|module:echarts/data/Graph.Node} n1
     * @param {number|string|module:echarts/data/Graph.Node} n2
     * @param {number} [dataIndex=-1]
     * @return {module:echarts/data/Graph.Edge}
     */
    graphProto.addEdge = function (n1, n2, dataIndex) {
        var nodesMap = this._nodesMap;
        var edgesMap = this._edgesMap;
 
        // PNEDING
        if (typeof n1 === 'number') {
            n1 = this.nodes[n1];
        }
        if (typeof n2 === 'number') {
            n2 = this.nodes[n2];
        }
 
        if (!(n1 instanceof Node)) {
            n1 = nodesMap[n1];
        }
        if (!(n2 instanceof Node)) {
            n2 = nodesMap[n2];
        }
        if (!n1 || !n2) {
            return;
        }
 
        var key = n1.id + '-' + n2.id;
        // PENDING
        if (edgesMap[key]) {
            return;
        }
 
        var edge = new Edge(n1, n2, dataIndex);
        edge.hostGraph = this;
 
        if (this._directed) {
            n1.outEdges.push(edge);
            n2.inEdges.push(edge);
        }
        n1.edges.push(edge);
        if (n1 !== n2) {
            n2.edges.push(edge);
        }
 
        this.edges.push(edge);
        edgesMap[key] = edge;
 
        return edge;
    };
 
    /**
     * Get edge by data index
     * @param  {number} dataIndex
     * @return {module:echarts/data/Graph~Node}
     */
    graphProto.getEdgeByIndex = function (dataIndex) {
        var rawIdx = this.edgeData.getRawIndex(dataIndex);
        return this.edges[rawIdx];
    };
    /**
     * Get edge by two linked nodes
     * @param  {module:echarts/data/Graph.Node|string} n1
     * @param  {module:echarts/data/Graph.Node|string} n2
     * @return {module:echarts/data/Graph.Edge}
     */
    graphProto.getEdge = function (n1, n2) {
        if (n1 instanceof Node) {
            n1 = n1.id;
        }
        if (n2 instanceof Node) {
            n2 = n2.id;
        }
 
        var edgesMap = this._edgesMap;
 
        if (this._directed) {
            return edgesMap[n1 + '-' + n2];
        } else {
            return edgesMap[n1 + '-' + n2]
                || edgesMap[n2 + '-' + n1];
        }
    };
 
    /**
     * Iterate all nodes
     * @param  {Function} cb
     * @param  {*} [context]
     */
    graphProto.eachNode = function (cb, context) {
        var nodes = this.nodes;
        var len = nodes.length;
        for (var i = 0; i < len; i++) {
            if (nodes[i].dataIndex >= 0) {
                cb.call(context, nodes[i], i);
            }
        }
    };
 
    /**
     * Iterate all edges
     * @param  {Function} cb
     * @param  {*} [context]
     */
    graphProto.eachEdge = function (cb, context) {
        var edges = this.edges;
        var len = edges.length;
        for (var i = 0; i < len; i++) {
            if (edges[i].dataIndex >= 0
                && edges[i].node1.dataIndex >= 0
                && edges[i].node2.dataIndex >= 0
            ) {
                cb.call(context, edges[i], i);
            }
        }
    };
 
    /**
     * Breadth first traverse
     * @param {Function} cb
     * @param {module:echarts/data/Graph.Node} startNode
     * @param {string} [direction='none'] 'none'|'in'|'out'
     * @param {*} [context]
     */
    graphProto.breadthFirstTraverse = function (
        cb, startNode, direction, context
    ) {
        if (!(startNode instanceof Node)) {
            startNode = this._nodesMap[startNode];
        }
        if (!startNode) {
            return;
        }
 
        var edgeType = direction === 'out'
            ? 'outEdges' : (direction === 'in' ? 'inEdges' : 'edges');
 
        for (var i = 0; i < this.nodes.length; i++) {
            this.nodes[i].__visited = false;
        }
 
        if (cb.call(context, startNode, null)) {
            return;
        }
 
        var queue = [startNode];
        while (queue.length) {
            var currentNode = queue.shift();
            var edges = currentNode[edgeType];
 
            for (var i = 0; i < edges.length; i++) {
                var e = edges[i];
                var otherNode = e.node1 === currentNode
                    ? e.node2 : e.node1;
                if (!otherNode.__visited) {
                    if (cb.call(otherNode, otherNode, currentNode)) {
                        // Stop traversing
                        return;
                    }
                    queue.push(otherNode);
                    otherNode.__visited = true;
                }
            }
        }
    };
 
    // TODO
    // graphProto.depthFirstTraverse = function (
    //     cb, startNode, direction, context
    // ) {
 
    // };
 
    // Filter update
    graphProto.update = function () {
        var data = this.data;
        var edgeData = this.edgeData;
        var nodes = this.nodes;
        var edges = this.edges;
 
        for (var i = 0, len = nodes.length; i < len; i++) {
            nodes[i].dataIndex = -1;
        }
        for (var i = 0, len = data.count(); i < len; i++) {
            nodes[data.getRawIndex(i)].dataIndex = i;
        }
 
        edgeData.filterSelf(function (idx) {
            var edge = edges[edgeData.getRawIndex(idx)];
            return edge.node1.dataIndex >= 0 && edge.node2.dataIndex >= 0;
        });
 
        // Update edge
        for (var i = 0, len = edges.length; i < len; i++) {
            edges[i].dataIndex = -1;
        }
        for (var i = 0, len = edgeData.count(); i < len; i++) {
            edges[edgeData.getRawIndex(i)].dataIndex = i;
        }
    };
 
    /**
     * @return {module:echarts/data/Graph}
     */
    graphProto.clone = function () {
        var graph = new Graph(this._directed);
        var nodes = this.nodes;
        var edges = this.edges;
        for (var i = 0; i < nodes.length; i++) {
            graph.addNode(nodes[i].id, nodes[i].dataIndex);
        }
        for (var i = 0; i < edges.length; i++) {
            var e = edges[i];
            graph.addEdge(e.node1.id, e.node2.id, e.dataIndex);
        }
        return graph;
    };
 
 
    /**
     * @alias module:echarts/data/Graph.Node
     */
    function Node(id, dataIndex) {
        /**
        * @type {string}
        */
        this.id = id == null ? '' : id;
 
        /**
        * @type {Array.<module:echarts/data/Graph.Edge>}
        */
        this.inEdges = [];
        /**
        * @type {Array.<module:echarts/data/Graph.Edge>}
        */
        this.outEdges = [];
        /**
        * @type {Array.<module:echarts/data/Graph.Edge>}
        */
        this.edges = [];
        /**
         * @type {module:echarts/data/Graph}
         */
        this.hostGraph;
 
        /**
         * @type {number}
         */
        this.dataIndex = dataIndex == null ? -1 : dataIndex;
    }
 
    Node.prototype = {
 
        constructor: Node,
 
        /**
         * @return {number}
         */
        degree: function () {
            return this.edges.length;
        },
 
        /**
         * @return {number}
         */
        inDegree: function () {
            return this.inEdges.length;
        },
 
        /**
        * @return {number}
        */
        outDegree: function () {
            return this.outEdges.length;
        },
 
        /**
         * @param {string} [path]
         * @return {module:echarts/model/Model}
         */
        getModel: function (path) {
            if (this.dataIndex < 0) {
                return;
            }
            var graph = this.hostGraph;
            var itemModel = graph.data.getItemModel(this.dataIndex);
 
            return itemModel.getModel(path);
        }
    };
 
    /**
     * 图边
     * @alias module:echarts/data/Graph.Edge
     * @param {module:echarts/data/Graph.Node} n1
     * @param {module:echarts/data/Graph.Node} n2
     * @param {number} [dataIndex=-1]
     */
    function Edge(n1, n2, dataIndex) {
 
        /**
         * 节点1,如果是有向图则为源节点
         * @type {module:echarts/data/Graph.Node}
         */
        this.node1 = n1;
 
        /**
         * 节点2,如果是有向图则为目标节点
         * @type {module:echarts/data/Graph.Node}
         */
        this.node2 = n2;
 
        this.dataIndex = dataIndex == null ? -1 : dataIndex;
    }
 
    /**
     * @param {string} [path]
     * @return {module:echarts/model/Model}
     */
     Edge.prototype.getModel = function (path) {
        if (this.dataIndex < 0) {
            return;
        }
        var graph = this.hostGraph;
        var itemModel = graph.edgeData.getItemModel(this.dataIndex);
 
        return itemModel.getModel(path);
    };
 
    var createGraphDataProxyMixin = function (hostName, dataName) {
        return {
            /**
             * @param {string=} [dimension='value'] Default 'value'. can be 'a', 'b', 'c', 'd', 'e'.
             * @return {number}
             */
            getValue: function (dimension) {
                var data = this[hostName][dataName];
                return data.get(data.getDimension(dimension || 'value'), this.dataIndex);
            },
 
            /**
             * @param {Object|string} key
             * @param {*} [value]
             */
            setVisual: function (key, value) {
                this.dataIndex >= 0
                    && this[hostName][dataName].setItemVisual(this.dataIndex, key, value);
            },
 
            /**
             * @param {string} key
             * @return {boolean}
             */
            getVisual: function (key, ignoreParent) {
                return this[hostName][dataName].getItemVisual(this.dataIndex, key, ignoreParent);
            },
 
            /**
             * @param {Object} layout
             * @return {boolean} [merge=false]
             */
            setLayout: function (layout, merge) {
                this.dataIndex >= 0
                    && this[hostName][dataName].setItemLayout(this.dataIndex, layout, merge);
            },
 
            /**
             * @return {Object}
             */
            getLayout: function () {
                return this[hostName][dataName].getItemLayout(this.dataIndex);
            },
 
            /**
             * @return {module:zrender/Element}
             */
            getGraphicEl: function () {
                return this[hostName][dataName].getItemGraphicEl(this.dataIndex);
            },
 
            /**
             * @return {number}
             */
            getRawIndex: function () {
                return this[hostName][dataName].getRawIndex(this.dataIndex);
            }
        };
    };
 
    zrUtil.mixin(Node, createGraphDataProxyMixin('hostGraph', 'data'));
    zrUtil.mixin(Edge, createGraphDataProxyMixin('hostGraph', 'edgeData'));
 
    Graph.Node = Node;
    Graph.Edge = Edge;
 
    module.exports = Graph;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/data/List.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/data/List.js

Statements: 13.68% (61 / 446)      Branches: 1.35% (3 / 222)      Functions: 0% (0 / 52)      Lines: 13.68% (61 / 446)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147            1 1 1   1     1                 1 1   1 1 1   1       1                                     1                                                                                                                                                                                                                                                                       1   1         1                 1                       1                   1                                                                                                                                                                                                         1                     1                                                                           1                                           1                                         1                                                                           1                                         1                                           1                                       1                                                                     1                                                                           1                   1                 1                 1         1                                     1                                                                                           1                                                                                                             1                             1                                                                       1                                                                                     1                                                                                         1                     1                                             1                               1                                   1                                 1               1                   1                 1                   1                                             1                                   1         1                   1                                         1               1                       1                                                 1                             1   1   1    
/**
 * List for data storage
 * @module echarts/data/List
 */
 
 
    var UNDEFINED = 'undefined';
    var globalObj = typeof window === 'undefined' ? global : window;
    var Float64Array = typeof globalObj.Float64Array === UNDEFINED
        ? Array : globalObj.Float64Array;
    var Int32Array = typeof globalObj.Int32Array === UNDEFINED
        ? Array : globalObj.Int32Array;
 
    var dataCtors = {
        'float': Float64Array,
        'int': Int32Array,
        // Ordinal data type can be string or int
        'ordinal': Array,
        'number': Array,
        'time': Array
    };
 
    var Model = require('../model/Model');
    var DataDiffer = require('./DataDiffer');
 
    var zrUtil = require('zrender/lib/core/util');
    var modelUtil = require('../util/model');
    var isObject = zrUtil.isObject;
 
    var TRANSFERABLE_PROPERTIES = [
        'stackedOn', 'hasItemOption', '_nameList', '_idList', '_rawData'
    ];
 
    var transferProperties = function (a, b) {
        zrUtil.each(TRANSFERABLE_PROPERTIES.concat(b.__wrappedMethods || []), function (propName) {
            if (b.hasOwnProperty(propName)) {
                a[propName] = b[propName];
            }
        });
 
        a.__wrappedMethods = b.__wrappedMethods;
    };
 
    /**
     * @constructor
     * @alias module:echarts/data/List
     *
     * @param {Array.<string|Object>} dimensions
     *      For example, ['someDimName', {name: 'someDimName', type: 'someDimType'}, ...].
     *      Dimensions should be concrete names like x, y, z, lng, lat, angle, radius
     * @param {module:echarts/model/Model} hostModel
     */
    var List = function (dimensions, hostModel) {
 
        dimensions = dimensions || ['x', 'y'];
 
        var dimensionInfos = {};
        var dimensionNames = [];
        for (var i = 0; i < dimensions.length; i++) {
            var dimensionName;
            var dimensionInfo = {};
            if (typeof dimensions[i] === 'string') {
                dimensionName = dimensions[i];
                dimensionInfo = {
                    name: dimensionName,
                    stackable: false,
                    // Type can be 'float', 'int', 'number'
                    // Default is number, Precision of float may not enough
                    type: 'number'
                };
            }
            else {
                dimensionInfo = dimensions[i];
                dimensionName = dimensionInfo.name;
                dimensionInfo.type = dimensionInfo.type || 'number';
            }
            dimensionNames.push(dimensionName);
            dimensionInfos[dimensionName] = dimensionInfo;
        }
        /**
         * @readOnly
         * @type {Array.<string>}
         */
        this.dimensions = dimensionNames;
 
        /**
         * Infomation of each data dimension, like data type.
         * @type {Object}
         */
        this._dimensionInfos = dimensionInfos;
 
        /**
         * @type {module:echarts/model/Model}
         */
        this.hostModel = hostModel;
 
        /**
         * @type {module:echarts/model/Model}
         */
        this.dataType;
 
        /**
         * Indices stores the indices of data subset after filtered.
         * This data subset will be used in chart.
         * @type {Array.<number>}
         * @readOnly
         */
        this.indices = [];
 
        /**
         * Data storage
         * @type {Object.<key, TypedArray|Array>}
         * @private
         */
        this._storage = {};
 
        /**
         * @type {Array.<string>}
         */
        this._nameList = [];
        /**
         * @type {Array.<string>}
         */
        this._idList = [];
        /**
         * Models of data option is stored sparse for optimizing memory cost
         * @type {Array.<module:echarts/model/Model>}
         * @private
         */
        this._optionModels = [];
 
        /**
         * @param {module:echarts/data/List}
         */
        this.stackedOn = null;
 
        /**
         * Global visual properties after visual coding
         * @type {Object}
         * @private
         */
        this._visual = {};
 
        /**
         * Globel layout properties.
         * @type {Object}
         * @private
         */
        this._layout = {};
 
        /**
         * Item visual properties after visual coding
         * @type {Array.<Object>}
         * @private
         */
        this._itemVisuals = [];
 
        /**
         * Item layout properties after layout
         * @type {Array.<Object>}
         * @private
         */
        this._itemLayouts = [];
 
        /**
         * Graphic elemnents
         * @type {Array.<module:zrender/Element>}
         * @private
         */
        this._graphicEls = [];
 
        /**
         * @type {Array.<Array|Object>}
         * @private
         */
        this._rawData;
 
        /**
         * @type {Object}
         * @private
         */
        this._extent;
    };
 
    var listProto = List.prototype;
 
    listProto.type = 'list';
    /**
     * If each data item has it's own option
     * @type {boolean}
     */
    listProto.hasItemOption = true;
 
    /**
     * Get dimension name
     * @param {string|number} dim
     *        Dimension can be concrete names like x, y, z, lng, lat, angle, radius
     *        Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius'
     * @return {string} Concrete dim name.
     */
    listProto.getDimension = function (dim) {
        if (!isNaN(dim)) {
            dim = this.dimensions[dim] || dim;
        }
        return dim;
    };
    /**
     * Get type and stackable info of particular dimension
     * @param {string|number} dim
     *        Dimension can be concrete names like x, y, z, lng, lat, angle, radius
     *        Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius'
     */
    listProto.getDimensionInfo = function (dim) {
        return zrUtil.clone(this._dimensionInfos[this.getDimension(dim)]);
    };
 
    /**
     * Initialize from data
     * @param {Array.<Object|number|Array>} data
     * @param {Array.<string>} [nameList]
     * @param {Function} [dimValueGetter] (dataItem, dimName, dataIndex, dimIndex) => number
     */
    listProto.initData = function (data, nameList, dimValueGetter) {
        data = data || [];
 
        if (__DEV__) {
            if (!zrUtil.isArray(data)) {
                throw new Error('Invalid data.');
            }
        }
 
        this._rawData = data;
 
        // Clear
        var storage = this._storage = {};
        var indices = this.indices = [];
 
        var dimensions = this.dimensions;
        var size = data.length;
        var dimensionInfoMap = this._dimensionInfos;
 
        var idList = [];
        var nameRepeatCount = {};
 
        nameList = nameList || [];
 
        // Init storage
        for (var i = 0; i < dimensions.length; i++) {
            var dimInfo = dimensionInfoMap[dimensions[i]];
            var DataCtor = dataCtors[dimInfo.type];
            storage[dimensions[i]] = new DataCtor(size);
        }
 
        var self = this;
        if (!dimValueGetter) {
            self.hasItemOption = false;
        }
        // Default dim value getter
        dimValueGetter = dimValueGetter || function (dataItem, dimName, dataIndex, dimIndex) {
            var value = modelUtil.getDataItemValue(dataItem);
            // If any dataItem is like { value: 10 }
            if (modelUtil.isDataItemOption(dataItem)) {
                self.hasItemOption = true;
            }
            return modelUtil.converDataValue(
                (value instanceof Array)
                    ? value[dimIndex]
                    // If value is a single number or something else not array.
                    : value,
                dimensionInfoMap[dimName]
            );
        };
 
        for (var idx = 0; idx < data.length; idx++) {
            var dataItem = data[idx];
            // Each data item is value
            // [1, 2]
            // 2
            // Bar chart, line chart which uses category axis
            // only gives the 'y' value. 'x' value is the indices of cateogry
            // Use a tempValue to normalize the value to be a (x, y) value
 
            // Store the data by dimensions
            for (var k = 0; k < dimensions.length; k++) {
                var dim = dimensions[k];
                var dimStorage = storage[dim];
                // PENDING NULL is empty or zero
                dimStorage[idx] = dimValueGetter(dataItem, dim, idx, k);
            }
 
            indices.push(idx);
        }
 
        // Use the name in option and create id
        for (var i = 0; i < data.length; i++) {
            if (!nameList[i]) {
                if (data[i] && data[i].name != null) {
                    nameList[i] = data[i].name;
                }
            }
            var name = nameList[i] || '';
            // Try using the id in option
            var id = data[i] && data[i].id;
 
            if (!id && name) {
                // Use name as id and add counter to avoid same name
                nameRepeatCount[name] = nameRepeatCount[name] || 0;
                id = name;
                if (nameRepeatCount[name] > 0) {
                    id += '__ec__' + nameRepeatCount[name];
                }
                nameRepeatCount[name]++;
            }
            id && (idList[i] = id);
        }
 
        this._nameList = nameList;
        this._idList = idList;
    };
 
    /**
     * @return {number}
     */
    listProto.count = function () {
        return this.indices.length;
    };
 
    /**
     * Get value. Return NaN if idx is out of range.
     * @param {string} dim Dim must be concrete name.
     * @param {number} idx
     * @param {boolean} stack
     * @return {number}
     */
    listProto.get = function (dim, idx, stack) {
        var storage = this._storage;
        var dataIndex = this.indices[idx];
 
        // If value not exists
        if (dataIndex == null) {
            return NaN;
        }
 
        var value = storage[dim] && storage[dim][dataIndex];
        // FIXME ordinal data type is not stackable
        if (stack) {
            var dimensionInfo = this._dimensionInfos[dim];
            if (dimensionInfo && dimensionInfo.stackable) {
                var stackedOn = this.stackedOn;
                while (stackedOn) {
                    // Get no stacked data of stacked on
                    var stackedValue = stackedOn.get(dim, idx);
                    // Considering positive stack, negative stack and empty data
                    if ((value >= 0 && stackedValue > 0)  // Positive stack
                        || (value <= 0 && stackedValue < 0) // Negative stack
                    ) {
                        value += stackedValue;
                    }
                    stackedOn = stackedOn.stackedOn;
                }
            }
        }
        return value;
    };
 
    /**
     * Get value for multi dimensions.
     * @param {Array.<string>} [dimensions] If ignored, using all dimensions.
     * @param {number} idx
     * @param {boolean} stack
     * @return {number}
     */
    listProto.getValues = function (dimensions, idx, stack) {
        var values = [];
 
        if (!zrUtil.isArray(dimensions)) {
            stack = idx;
            idx = dimensions;
            dimensions = this.dimensions;
        }
 
        for (var i = 0, len = dimensions.length; i < len; i++) {
            values.push(this.get(dimensions[i], idx, stack));
        }
 
        return values;
    };
 
    /**
     * If value is NaN. Inlcuding '-'
     * @param {string} dim
     * @param {number} idx
     * @return {number}
     */
    listProto.hasValue = function (idx) {
        var dimensions = this.dimensions;
        var dimensionInfos = this._dimensionInfos;
        for (var i = 0, len = dimensions.length; i < len; i++) {
            if (
                // Ordinal type can be string or number
                dimensionInfos[dimensions[i]].type !== 'ordinal'
                && isNaN(this.get(dimensions[i], idx))
            ) {
                return false;
            }
        }
        return true;
    };
 
    /**
     * Get extent of data in one dimension
     * @param {string} dim
     * @param {boolean} stack
     * @param {Function} filter
     */
    listProto.getDataExtent = function (dim, stack, filter) {
        dim = this.getDimension(dim);
        var dimData = this._storage[dim];
        var dimInfo = this.getDimensionInfo(dim);
        stack = (dimInfo && dimInfo.stackable) && stack;
        var dimExtent = (this._extent || (this._extent = {}))[dim + (!!stack)];
        var value;
        if (dimExtent) {
            return dimExtent;
        }
        // var dimInfo = this._dimensionInfos[dim];
        if (dimData) {
            var min = Infinity;
            var max = -Infinity;
            // var isOrdinal = dimInfo.type === 'ordinal';
            for (var i = 0, len = this.count(); i < len; i++) {
                value = this.get(dim, i, stack);
                // FIXME
                // if (isOrdinal && typeof value === 'string') {
                //     value = zrUtil.indexOf(dimData, value);
                // }
                if (!filter || filter(value, dim, i)) {
                    value < min && (min = value);
                    value > max && (max = value);
                }
            }
            return (this._extent[dim + !!stack] = [min, max]);
        }
        else {
            return [Infinity, -Infinity];
        }
    };
 
    /**
     * Get sum of data in one dimension
     * @param {string} dim
     * @param {boolean} stack
     */
    listProto.getSum = function (dim, stack) {
        var dimData = this._storage[dim];
        var sum = 0;
        if (dimData) {
            for (var i = 0, len = this.count(); i < len; i++) {
                var value = this.get(dim, i, stack);
                if (!isNaN(value)) {
                    sum += value;
                }
            }
        }
        return sum;
    };
 
    /**
     * Retreive the index with given value
     * @param {number} idx
     * @param {number} value
     * @return {number}
     */
    // FIXME Precision of float value
    listProto.indexOf = function (dim, value) {
        var storage = this._storage;
        var dimData = storage[dim];
        var indices = this.indices;
 
        if (dimData) {
            for (var i = 0, len = indices.length; i < len; i++) {
                var rawIndex = indices[i];
                if (dimData[rawIndex] === value) {
                    return i;
                }
            }
        }
        return -1;
    };
 
    /**
     * Retreive the index with given name
     * @param {number} idx
     * @param {number} name
     * @return {number}
     */
    listProto.indexOfName = function (name) {
        var indices = this.indices;
        var nameList = this._nameList;
 
        for (var i = 0, len = indices.length; i < len; i++) {
            var rawIndex = indices[i];
            if (nameList[rawIndex] === name) {
                return i;
            }
        }
 
        return -1;
    };
 
    /**
     * Retreive the index with given raw data index
     * @param {number} idx
     * @param {number} name
     * @return {number}
     */
    listProto.indexOfRawIndex = function (rawIndex) {
        // Indices are ascending
        var indices = this.indices;
 
        // If rawIndex === dataIndex
        var rawDataIndex = indices[rawIndex];
        if (rawDataIndex != null && rawDataIndex === rawIndex) {
            return rawIndex;
        }
 
        var left = 0;
        var right = indices.length - 1;
        while (left <= right) {
            var mid = (left + right) / 2 | 0;
            if (indices[mid] < rawIndex) {
                left = mid + 1;
            }
            else if (indices[mid] > rawIndex) {
                right = mid - 1;
            }
            else {
                return mid;
            }
        }
        return -1;
    };
 
    /**
     * Retreive the index of nearest value
     * @param {string} dim
     * @param {number} value
     * @param {boolean} stack If given value is after stacked
     * @param {number} [maxDistance=Infinity]
     * @return {Array.<number>} Considere multiple points has the same value.
     */
    listProto.indicesOfNearest = function (dim, value, stack, maxDistance) {
        var storage = this._storage;
        var dimData = storage[dim];
        var nearestIndices = [];
 
        if (!dimData) {
            return nearestIndices;
        }
 
        if (maxDistance == null) {
            maxDistance = Infinity;
        }
 
        var minDist = Number.MAX_VALUE;
        var minDiff = -1;
        for (var i = 0, len = this.count(); i < len; i++) {
            var diff = value - this.get(dim, i, stack);
            var dist = Math.abs(diff);
            if (diff <= maxDistance && dist <= minDist) {
                // For the case of two data are same on xAxis, which has sequence data.
                // Show the nearest index
                // https://github.com/ecomfe/echarts/issues/2869
                if (dist < minDist || (diff >= 0 && minDiff < 0)) {
                    minDist = dist;
                    minDiff = diff;
                    nearestIndices.length = 0;
                }
                nearestIndices.push(i);
            }
        }
        return nearestIndices;
    };
 
    /**
     * Get raw data index
     * @param {number} idx
     * @return {number}
     */
    listProto.getRawIndex = function (idx) {
        var rawIdx = this.indices[idx];
        return rawIdx == null ? -1 : rawIdx;
    };
 
    /**
     * Get raw data item
     * @param {number} idx
     * @return {number}
     */
    listProto.getRawDataItem = function (idx) {
        return this._rawData[this.getRawIndex(idx)];
    };
 
    /**
     * @param {number} idx
     * @param {boolean} [notDefaultIdx=false]
     * @return {string}
     */
    listProto.getName = function (idx) {
        return this._nameList[this.indices[idx]] || '';
    };
 
    /**
     * @param {number} idx
     * @param {boolean} [notDefaultIdx=false]
     * @return {string}
     */
    listProto.getId = function (idx) {
        return this._idList[this.indices[idx]] || (this.getRawIndex(idx) + '');
    };
 
 
    function normalizeDimensions(dimensions) {
        if (!zrUtil.isArray(dimensions)) {
            dimensions = [dimensions];
        }
        return dimensions;
    }
 
    /**
     * Data iteration
     * @param {string|Array.<string>}
     * @param {Function} cb
     * @param {boolean} [stack=false]
     * @param {*} [context=this]
     *
     * @example
     *  list.each('x', function (x, idx) {});
     *  list.each(['x', 'y'], function (x, y, idx) {});
     *  list.each(function (idx) {})
     */
    listProto.each = function (dims, cb, stack, context) {
        if (typeof dims === 'function') {
            context = stack;
            stack = cb;
            cb = dims;
            dims = [];
        }
 
        dims = zrUtil.map(normalizeDimensions(dims), this.getDimension, this);
 
        var value = [];
        var dimSize = dims.length;
        var indices = this.indices;
 
        context = context || this;
 
        for (var i = 0; i < indices.length; i++) {
            // Simple optimization
            switch (dimSize) {
                case 0:
                    cb.call(context, i);
                    break;
                case 1:
                    cb.call(context, this.get(dims[0], i, stack), i);
                    break;
                case 2:
                    cb.call(context, this.get(dims[0], i, stack), this.get(dims[1], i, stack), i);
                    break;
                default:
                    for (var k = 0; k < dimSize; k++) {
                        value[k] = this.get(dims[k], i, stack);
                    }
                    // Index
                    value[k] = i;
                    cb.apply(context, value);
            }
        }
    };
 
    /**
     * Data filter
     * @param {string|Array.<string>}
     * @param {Function} cb
     * @param {boolean} [stack=false]
     * @param {*} [context=this]
     */
    listProto.filterSelf = function (dimensions, cb, stack, context) {
        if (typeof dimensions === 'function') {
            context = stack;
            stack = cb;
            cb = dimensions;
            dimensions = [];
        }
 
        dimensions = zrUtil.map(
            normalizeDimensions(dimensions), this.getDimension, this
        );
 
        var newIndices = [];
        var value = [];
        var dimSize = dimensions.length;
        var indices = this.indices;
 
        context = context || this;
 
        for (var i = 0; i < indices.length; i++) {
            var keep;
            // Simple optimization
            if (dimSize === 1) {
                keep = cb.call(
                    context, this.get(dimensions[0], i, stack), i
                );
            }
            else {
                for (var k = 0; k < dimSize; k++) {
                    value[k] = this.get(dimensions[k], i, stack);
                }
                value[k] = i;
                keep = cb.apply(context, value);
            }
            if (keep) {
                newIndices.push(indices[i]);
            }
        }
 
        this.indices = newIndices;
 
        // Reset data extent
        this._extent = {};
 
        return this;
    };
 
    /**
     * Data mapping to a plain array
     * @param {string|Array.<string>} [dimensions]
     * @param {Function} cb
     * @param {boolean} [stack=false]
     * @param {*} [context=this]
     * @return {Array}
     */
    listProto.mapArray = function (dimensions, cb, stack, context) {
        if (typeof dimensions === 'function') {
            context = stack;
            stack = cb;
            cb = dimensions;
            dimensions = [];
        }
 
        var result = [];
        this.each(dimensions, function () {
            result.push(cb && cb.apply(this, arguments));
        }, stack, context);
        return result;
    };
 
    function cloneListForMapAndSample(original, excludeDimensions) {
        var allDimensions = original.dimensions;
        var list = new List(
            zrUtil.map(allDimensions, original.getDimensionInfo, original),
            original.hostModel
        );
        // FIXME If needs stackedOn, value may already been stacked
        transferProperties(list, original);
 
        var storage = list._storage = {};
        var originalStorage = original._storage;
        // Init storage
        for (var i = 0; i < allDimensions.length; i++) {
            var dim = allDimensions[i];
            var dimStore = originalStorage[dim];
            if (zrUtil.indexOf(excludeDimensions, dim) >= 0) {
                storage[dim] = new dimStore.constructor(
                    originalStorage[dim].length
                );
            }
            else {
                // Direct reference for other dimensions
                storage[dim] = originalStorage[dim];
            }
        }
        return list;
    }
 
    /**
     * Data mapping to a new List with given dimensions
     * @param {string|Array.<string>} dimensions
     * @param {Function} cb
     * @param {boolean} [stack=false]
     * @param {*} [context=this]
     * @return {Array}
     */
    listProto.map = function (dimensions, cb, stack, context) {
        dimensions = zrUtil.map(
            normalizeDimensions(dimensions), this.getDimension, this
        );
 
        var list = cloneListForMapAndSample(this, dimensions);
        // Following properties are all immutable.
        // So we can reference to the same value
        var indices = list.indices = this.indices;
 
        var storage = list._storage;
 
        var tmpRetValue = [];
        this.each(dimensions, function () {
            var idx = arguments[arguments.length - 1];
            var retValue = cb && cb.apply(this, arguments);
            if (retValue != null) {
                // a number
                if (typeof retValue === 'number') {
                    tmpRetValue[0] = retValue;
                    retValue = tmpRetValue;
                }
                for (var i = 0; i < retValue.length; i++) {
                    var dim = dimensions[i];
                    var dimStore = storage[dim];
                    var rawIdx = indices[idx];
                    if (dimStore) {
                        dimStore[rawIdx] = retValue[i];
                    }
                }
            }
        }, stack, context);
 
        return list;
    };
 
    /**
     * Large data down sampling on given dimension
     * @param {string} dimension
     * @param {number} rate
     * @param {Function} sampleValue
     * @param {Function} sampleIndex Sample index for name and id
     */
    listProto.downSample = function (dimension, rate, sampleValue, sampleIndex) {
        var list = cloneListForMapAndSample(this, [dimension]);
        var storage = this._storage;
        var targetStorage = list._storage;
 
        var originalIndices = this.indices;
        var indices = list.indices = [];
 
        var frameValues = [];
        var frameIndices = [];
        var frameSize = Math.floor(1 / rate);
 
        var dimStore = targetStorage[dimension];
        var len = this.count();
        // Copy data from original data
        for (var i = 0; i < storage[dimension].length; i++) {
            targetStorage[dimension][i] = storage[dimension][i];
        }
        for (var i = 0; i < len; i += frameSize) {
            // Last frame
            if (frameSize > len - i) {
                frameSize = len - i;
                frameValues.length = frameSize;
            }
            for (var k = 0; k < frameSize; k++) {
                var idx = originalIndices[i + k];
                frameValues[k] = dimStore[idx];
                frameIndices[k] = idx;
            }
            var value = sampleValue(frameValues);
            var idx = frameIndices[sampleIndex(frameValues, value) || 0];
            // Only write value on the filtered data
            dimStore[idx] = value;
            indices.push(idx);
        }
 
        return list;
    };
 
    /**
     * Get model of one data item.
     *
     * @param {number} idx
     */
    // FIXME Model proxy ?
    listProto.getItemModel = function (idx) {
        var hostModel = this.hostModel;
        idx = this.indices[idx];
        return new Model(this._rawData[idx], hostModel, hostModel && hostModel.ecModel);
    };
 
    /**
     * Create a data differ
     * @param {module:echarts/data/List} otherList
     * @return {module:echarts/data/DataDiffer}
     */
    listProto.diff = function (otherList) {
        var idList = this._idList;
        var otherIdList = otherList && otherList._idList;
        var val;
        // Use prefix to avoid index to be the same as otherIdList[idx],
        // which will cause weird udpate animation.
        var prefix = 'e\0\0';
 
        return new DataDiffer(
            otherList ? otherList.indices : [],
            this.indices,
            function (idx) {
                return (val = otherIdList[idx]) != null ? val : prefix + idx;
            },
            function (idx) {
                return (val = idList[idx]) != null ? val : prefix + idx;
            }
        );
    };
    /**
     * Get visual property.
     * @param {string} key
     */
    listProto.getVisual = function (key) {
        var visual = this._visual;
        return visual && visual[key];
    };
 
    /**
     * Set visual property
     * @param {string|Object} key
     * @param {*} [value]
     *
     * @example
     *  setVisual('color', color);
     *  setVisual({
     *      'color': color
     *  });
     */
    listProto.setVisual = function (key, val) {
        if (isObject(key)) {
            for (var name in key) {
                if (key.hasOwnProperty(name)) {
                    this.setVisual(name, key[name]);
                }
            }
            return;
        }
        this._visual = this._visual || {};
        this._visual[key] = val;
    };
 
    /**
     * Set layout property.
     * @param {string} key
     * @param {*} [val]
     */
    listProto.setLayout = function (key, val) {
        if (isObject(key)) {
            for (var name in key) {
                if (key.hasOwnProperty(name)) {
                    this.setLayout(name, key[name]);
                }
            }
            return;
        }
        this._layout[key] = val;
    };
 
    /**
     * Get layout property.
     * @param  {string} key.
     * @return {*}
     */
    listProto.getLayout = function (key) {
        return this._layout[key];
    };
 
    /**
     * Get layout of single data item
     * @param {number} idx
     */
    listProto.getItemLayout = function (idx) {
        return this._itemLayouts[idx];
    };
 
    /**
     * Set layout of single data item
     * @param {number} idx
     * @param {Object} layout
     * @param {boolean=} [merge=false]
     */
    listProto.setItemLayout = function (idx, layout, merge) {
        this._itemLayouts[idx] = merge
            ? zrUtil.extend(this._itemLayouts[idx] || {}, layout)
            : layout;
    };
 
    /**
     * Clear all layout of single data item
     */
    listProto.clearItemLayouts = function () {
        this._itemLayouts.length = 0;
    };
 
    /**
     * Get visual property of single data item
     * @param {number} idx
     * @param {string} key
     * @param {boolean} ignoreParent
     */
    listProto.getItemVisual = function (idx, key, ignoreParent) {
        var itemVisual = this._itemVisuals[idx];
        var val = itemVisual && itemVisual[key];
        if (val == null && !ignoreParent) {
            // Use global visual property
            return this.getVisual(key);
        }
        return val;
    };
 
    /**
     * Set visual property of single data item
     *
     * @param {number} idx
     * @param {string|Object} key
     * @param {*} [value]
     *
     * @example
     *  setItemVisual(0, 'color', color);
     *  setItemVisual(0, {
     *      'color': color
     *  });
     */
    listProto.setItemVisual = function (idx, key, value) {
        var itemVisual = this._itemVisuals[idx] || {};
        this._itemVisuals[idx] = itemVisual;
 
        if (isObject(key)) {
            for (var name in key) {
                if (key.hasOwnProperty(name)) {
                    itemVisual[name] = key[name];
                }
            }
            return;
        }
        itemVisual[key] = value;
    };
 
    /**
     * Clear itemVisuals and list visual.
     */
    listProto.clearAllVisual = function () {
        this._visual = {};
        this._itemVisuals = [];
    };
 
    var setItemDataAndSeriesIndex = function (child) {
        child.seriesIndex = this.seriesIndex;
        child.dataIndex = this.dataIndex;
        child.dataType = this.dataType;
    };
    /**
     * Set graphic element relative to data. It can be set as null
     * @param {number} idx
     * @param {module:zrender/Element} [el]
     */
    listProto.setItemGraphicEl = function (idx, el) {
        var hostModel = this.hostModel;
 
        if (el) {
            // Add data index and series index for indexing the data by element
            // Useful in tooltip
            el.dataIndex = idx;
            el.dataType = this.dataType;
            el.seriesIndex = hostModel && hostModel.seriesIndex;
            if (el.type === 'group') {
                el.traverse(setItemDataAndSeriesIndex, el);
            }
        }
 
        this._graphicEls[idx] = el;
    };
 
    /**
     * @param {number} idx
     * @return {module:zrender/Element}
     */
    listProto.getItemGraphicEl = function (idx) {
        return this._graphicEls[idx];
    };
 
    /**
     * @param {Function} cb
     * @param {*} context
     */
    listProto.eachItemGraphicEl = function (cb, context) {
        zrUtil.each(this._graphicEls, function (el, idx) {
            if (el) {
                cb && cb.call(context, el, idx);
            }
        });
    };
 
    /**
     * Shallow clone a new list except visual and layout properties, and graph elements.
     * New list only change the indices.
     */
    listProto.cloneShallow = function () {
        var dimensionInfoList = zrUtil.map(this.dimensions, this.getDimensionInfo, this);
        var list = new List(dimensionInfoList, this.hostModel);
 
        // FIXME
        list._storage = this._storage;
 
        transferProperties(list, this);
 
 
        // Clone will not change the data extent and indices
        list.indices = this.indices.slice();
 
        if (this._extent) {
            list._extent = zrUtil.extend({}, this._extent);
        }
 
        return list;
    };
 
    /**
     * Wrap some method to add more feature
     * @param {string} methodName
     * @param {Function} injectFunction
     */
    listProto.wrapMethod = function (methodName, injectFunction) {
        var originalMethod = this[methodName];
        if (typeof originalMethod !== 'function') {
            return;
        }
        this.__wrappedMethods = this.__wrappedMethods || [];
        this.__wrappedMethods.push(methodName);
        this[methodName] = function () {
            var res = originalMethod.apply(this, arguments);
            return injectFunction.apply(this, [res].concat(zrUtil.slice(arguments)));
        };
    };
 
    // Methods that create a new list based on this list should be listed here.
    // Notice that those method should `RETURN` the new list.
    listProto.TRANSFERABLE_METHODS = ['cloneShallow', 'downSample', 'map'];
    // Methods that change indices of this list should be listed here.
    listProto.CHANGABLE_METHODS = ['filterSelf'];
 
    module.exports = List;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/data/Tree.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/data/Tree.js

Statements: 10.74% (13 / 121)      Branches: 0% (0 / 52)      Functions: 0% (0 / 26)      Lines: 10.74% (13 / 121)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477              1 1 1 1 1             1                                                                                                                   1                                                                                                                                                                                                                                                                                                                                                                                                                                 1                                                                         1                                                                                                                                                                                   1               1                                                                                       1                   1    
/**
 * Tree data structure
 *
 * @module echarts/data/Tree
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
    var Model = require('../model/Model');
    var List = require('./List');
    var linkList = require('./helper/linkList');
    var completeDimensions = require('./helper/completeDimensions');
 
    /**
     * @constructor module:echarts/data/Tree~TreeNode
     * @param {string} name
     * @param {module:echarts/data/Tree} hostTree
     */
    var TreeNode = function (name, hostTree) {
        /**
         * @type {string}
         */
        this.name = name || '';
 
        /**
         * Depth of node
         *
         * @type {number}
         * @readOnly
         */
        this.depth = 0;
 
        /**
         * Height of the subtree rooted at this node.
         * @type {number}
         * @readOnly
         */
        this.height = 0;
 
        /**
         * @type {module:echarts/data/Tree~TreeNode}
         * @readOnly
         */
        this.parentNode = null;
 
        /**
         * Reference to list item.
         * Do not persistent dataIndex outside,
         * besause it may be changed by list.
         * If dataIndex -1,
         * this node is logical deleted (filtered) in list.
         *
         * @type {Object}
         * @readOnly
         */
        this.dataIndex = -1;
 
        /**
         * @type {Array.<module:echarts/data/Tree~TreeNode>}
         * @readOnly
         */
        this.children = [];
 
        /**
         * @type {Array.<module:echarts/data/Tree~TreeNode>}
         * @pubilc
         */
        this.viewChildren = [];
 
        /**
         * @type {moduel:echarts/data/Tree}
         * @readOnly
         */
        this.hostTree = hostTree;
    };
 
    TreeNode.prototype = {
 
        constructor: TreeNode,
 
        /**
         * The node is removed.
         * @return {boolean} is removed.
         */
        isRemoved: function () {
            return this.dataIndex < 0;
        },
 
        /**
         * Travel this subtree (include this node).
         * Usage:
         *    node.eachNode(function () { ... }); // preorder
         *    node.eachNode('preorder', function () { ... }); // preorder
         *    node.eachNode('postorder', function () { ... }); // postorder
         *    node.eachNode(
         *        {order: 'postorder', attr: 'viewChildren'},
         *        function () { ... }
         *    ); // postorder
         *
         * @param {(Object|string)} options If string, means order.
         * @param {string=} options.order 'preorder' or 'postorder'
         * @param {string=} options.attr 'children' or 'viewChildren'
         * @param {Function} cb If in preorder and return false,
         *                      its subtree will not be visited.
         * @param {Object} [context]
         */
        eachNode: function (options, cb, context) {
            if (typeof options === 'function') {
                context = cb;
                cb = options;
                options = null;
            }
 
            options = options || {};
            if (zrUtil.isString(options)) {
                options = {order: options};
            }
 
            var order = options.order || 'preorder';
            var children = this[options.attr || 'children'];
 
            var suppressVisitSub;
            order === 'preorder' && (suppressVisitSub = cb.call(context, this));
 
            for (var i = 0; !suppressVisitSub && i < children.length; i++) {
                children[i].eachNode(options, cb, context);
            }
 
            order === 'postorder' && cb.call(context, this);
        },
 
        /**
         * Update depth and height of this subtree.
         *
         * @param  {number} depth
         */
        updateDepthAndHeight: function (depth) {
            var height = 0;
            this.depth = depth;
            for (var i = 0; i < this.children.length; i++) {
                var child = this.children[i];
                child.updateDepthAndHeight(depth + 1);
                if (child.height > height) {
                    height = child.height;
                }
            }
            this.height = height + 1;
        },
 
        /**
         * @param  {string} id
         * @return {module:echarts/data/Tree~TreeNode}
         */
        getNodeById: function (id) {
            if (this.getId() === id) {
                return this;
            }
            for (var i = 0, children = this.children, len = children.length; i < len; i++) {
                var res = children[i].getNodeById(id);
                if (res) {
                    return res;
                }
            }
        },
 
        /**
         * @param {module:echarts/data/Tree~TreeNode} node
         * @return {boolean}
         */
        contains: function (node) {
            if (node === this) {
                return true;
            }
            for (var i = 0, children = this.children, len = children.length; i < len; i++) {
                var res = children[i].contains(node);
                if (res) {
                    return res;
                }
            }
        },
 
        /**
         * @param {boolean} includeSelf Default false.
         * @return {Array.<module:echarts/data/Tree~TreeNode>} order: [root, child, grandchild, ...]
         */
        getAncestors: function (includeSelf) {
            var ancestors = [];
            var node = includeSelf ? this : this.parentNode;
            while (node) {
                ancestors.push(node);
                node = node.parentNode;
            }
            ancestors.reverse();
            return ancestors;
        },
 
        /**
         * @param {string|Array=} [dimension='value'] Default 'value'. can be 0, 1, 2, 3
         * @return {number} Value.
         */
        getValue: function (dimension) {
            var data = this.hostTree.data;
            return data.get(data.getDimension(dimension || 'value'), this.dataIndex);
        },
 
        /**
         * @param {Object} layout
         * @param {boolean=} [merge=false]
         */
        setLayout: function (layout, merge) {
            this.dataIndex >= 0
                && this.hostTree.data.setItemLayout(this.dataIndex, layout, merge);
        },
 
        /**
         * @return {Object} layout
         */
        getLayout: function () {
            return this.hostTree.data.getItemLayout(this.dataIndex);
        },
 
        /**
         * @param {string} path
         * @return {module:echarts/model/Model}
         */
        getModel: function (path) {
            if (this.dataIndex < 0) {
                return;
            }
            var hostTree = this.hostTree;
            var itemModel = hostTree.data.getItemModel(this.dataIndex);
            var levelModel = this.getLevelModel();
 
            return itemModel.getModel(path, (levelModel || hostTree.hostModel).getModel(path));
        },
 
        /**
         * @return {module:echarts/model/Model}
         */
        getLevelModel: function () {
            return (this.hostTree.levelModels || [])[this.depth];
        },
 
        /**
         * @example
         *  setItemVisual('color', color);
         *  setItemVisual({
         *      'color': color
         *  });
         */
        setVisual: function (key, value) {
            this.dataIndex >= 0
                && this.hostTree.data.setItemVisual(this.dataIndex, key, value);
        },
 
        /**
         * Get item visual
         */
        getVisual: function (key, ignoreParent) {
            return this.hostTree.data.getItemVisual(this.dataIndex, key, ignoreParent);
        },
 
        /**
         * @public
         * @return {number}
         */
        getRawIndex: function () {
            return this.hostTree.data.getRawIndex(this.dataIndex);
        },
 
        /**
         * @public
         * @return {string}
         */
        getId: function () {
            return this.hostTree.data.getId(this.dataIndex);
        }
    };
 
    /**
     * @constructor
     * @alias module:echarts/data/Tree
     * @param {module:echarts/model/Model} hostModel
     * @param {Array.<Object>} levelOptions
     */
    function Tree(hostModel, levelOptions) {
        /**
         * @type {module:echarts/data/Tree~TreeNode}
         * @readOnly
         */
        this.root;
 
        /**
         * @type {module:echarts/data/List}
         * @readOnly
         */
        this.data;
 
        /**
         * Index of each item is the same as the raw index of coresponding list item.
         * @private
         * @type {Array.<module:echarts/data/Tree~TreeNode}
         */
        this._nodes = [];
 
        /**
         * @private
         * @readOnly
         * @type {module:echarts/model/Model}
         */
        this.hostModel = hostModel;
 
        /**
         * @private
         * @readOnly
         * @type {Array.<module:echarts/model/Model}
         */
        this.levelModels = zrUtil.map(levelOptions || [], function (levelDefine) {
            return new Model(levelDefine, hostModel, hostModel.ecModel);
        });
    }
 
    Tree.prototype = {
 
        constructor: Tree,
 
        type: 'tree',
 
        /**
         * Travel this subtree (include this node).
         * Usage:
         *    node.eachNode(function () { ... }); // preorder
         *    node.eachNode('preorder', function () { ... }); // preorder
         *    node.eachNode('postorder', function () { ... }); // postorder
         *    node.eachNode(
         *        {order: 'postorder', attr: 'viewChildren'},
         *        function () { ... }
         *    ); // postorder
         *
         * @param {(Object|string)} options If string, means order.
         * @param {string=} options.order 'preorder' or 'postorder'
         * @param {string=} options.attr 'children' or 'viewChildren'
         * @param {Function} cb
         * @param {Object}   [context]
         */
        eachNode: function(options, cb, context) {
            this.root.eachNode(options, cb, context);
        },
 
        /**
         * @param {number} dataIndex
         * @return {module:echarts/data/Tree~TreeNode}
         */
        getNodeByDataIndex: function (dataIndex) {
            var rawIndex = this.data.getRawIndex(dataIndex);
            return this._nodes[rawIndex];
        },
 
        /**
         * @param {string} name
         * @return {module:echarts/data/Tree~TreeNode}
         */
        getNodeByName: function (name) {
            return this.root.getNodeByName(name);
        },
 
        /**
         * Update item available by list,
         * when list has been performed options like 'filterSelf' or 'map'.
         */
        update: function () {
            var data = this.data;
            var nodes = this._nodes;
 
            for (var i = 0, len = nodes.length; i < len; i++) {
                nodes[i].dataIndex = -1;
            }
 
            for (var i = 0, len = data.count(); i < len; i++) {
                nodes[data.getRawIndex(i)].dataIndex = i;
            }
        },
 
        /**
         * Clear all layouts
         */
        clearLayouts: function () {
            this.data.clearItemLayouts();
        }
    };
 
    /**
     * data node format:
     * {
     *     name: ...
     *     value: ...
     *     children: [
     *         {
     *             name: ...
     *             value: ...
     *             children: ...
     *         },
     *         ...
     *     ]
     * }
     *
     * @static
     * @param {Objec} dataRoot Root node.
     * @param {module:echarts/model/Model} hostModel
     * @param {Array.<Object>} levelOptions
     * @return module:echarts/data/Tree
     */
    Tree.createTree = function (dataRoot, hostModel, levelOptions) {
 
        var tree = new Tree(hostModel, levelOptions);
        var listData = [];
        var dimMax = 1;
 
        buildHierarchy(dataRoot);
 
        function buildHierarchy(dataNode, parentNode) {
            var value = dataNode.value;
            dimMax = Math.max(dimMax, zrUtil.isArray(value) ? value.length : 1);
 
            listData.push(dataNode);
 
            var node = new TreeNode(dataNode.name, tree);
            parentNode
                ? addChild(node, parentNode)
                : (tree.root = node);
 
            tree._nodes.push(node);
 
            var children = dataNode.children;
            if (children) {
                for (var i = 0; i < children.length; i++) {
                    buildHierarchy(children[i], node);
                }
            }
        }
 
        tree.root.updateDepthAndHeight(0);
 
        var dimensions = completeDimensions([{name: 'value'}], listData, {dimCount: dimMax});
        var list = new List(dimensions, hostModel);
        list.initData(listData);
 
        linkList({
            mainData: list,
            struct: tree,
            structAttr: 'tree'
        });
 
        tree.update();
 
        return tree;
    };
 
    /**
     * It is needed to consider the mess of 'list', 'hostModel' when creating a TreeNote,
     * so this function is not ready and not necessary to be public.
     *
     * @param {(module:echarts/data/Tree~TreeNode|Object)} child
     */
    function addChild(child, node) {
        var children = node.children;
        if (child.parentNode === node) {
            return;
        }
 
        children.push(child);
        child.parentNode = node;
    }
 
    module.exports = Tree;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/data/helper/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/data/helper/

Statements: 22.22% (18 / 81)      Branches: 0% (0 / 47)      Functions: 0% (0 / 16)      Lines: 22.22% (18 / 81)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/data/helper/
File Statements Branches Functions Lines
completeDimensions.js 16.67% (5 / 30) 0% (0 / 33) 0% (0 / 3) 16.67% (5 / 30)
linkList.js 25.49% (13 / 51) 0% (0 / 14) 0% (0 / 13) 25.49% (13 / 51)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/data/helper/completeDimensions.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/data/helper/completeDimensions.js

Statements: 16.67% (5 / 30)      Branches: 0% (0 / 33)      Functions: 0% (0 / 3)      Lines: 16.67% (5 / 30)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73          1                       1                                                         1                                     1       1      
/**
 * Complete dimensions by data (guess dimension).
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    /**
     * Complete the dimensions array guessed from the data structure.
     * @param  {Array.<string>} dimensions Necessary dimensions, like ['x', 'y']
     * @param  {Array} data Data list. [[1, 2, 3], [2, 3, 4]]
     * @param  {Object} [opt]
     * @param  {Array.<string>} [opt.defaultNames] Default names to fill not necessary dimensions, like ['value']
     * @param  {string} [opt.extraPrefix] Prefix of name when filling the left dimensions.
     * @param  {number} [opt.dimCount] If not specified, guess by the first data item.
     * @return {Array.<string>}
     */
    function completeDimensions(dimensions, data, opt) {
        if (!data) {
            return dimensions;
        }
 
        opt = opt || {};
 
        var dimCount = opt.dimCount;
        if (dimCount == null) {
            var value0 = retrieveValue(data[0]);
            dimCount = zrUtil.isArray(value0) && value0.length || 1;
        }
 
        var defaultNames = opt.defaultNames || [];
        var extraPrefix = opt.extraPrefix || 'extra';
        for (var i = 0; i < dimCount; i++) {
            if (!dimensions[i]) {
                var name = defaultNames[i] || (extraPrefix + (i - defaultNames.length));
                dimensions[i] = guessOrdinal(data, i)
                    ? {type: 'ordinal', name: name}
                    : name;
            }
        }
 
        return dimensions;
    }
 
    // The rule should not be complex, otherwise user might not
    // be able to known where the data is wrong.
    var guessOrdinal = completeDimensions.guessOrdinal = function (data, dimIndex) {
        for (var i = 0, len = data.length; i < len; i++) {
            var value = retrieveValue(data[i]);
 
            if (!zrUtil.isArray(value)) {
                return false;
            }
 
            var value = value[dimIndex];
            if (value != null && isFinite(value)) {
                return false;
            }
            else if (zrUtil.isString(value) && value !== '-') {
                return true;
            }
        }
        return false;
    };
 
    function retrieveValue(o) {
        return zrUtil.isArray(o) ? o : zrUtil.isObject(o) ? o.value: o;
    }
 
    module.exports = completeDimensions;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/data/helper/linkList.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/data/helper/linkList.js

Statements: 25.49% (13 / 51)      Branches: 0% (0 / 14)      Functions: 0% (0 / 13)      Lines: 25.49% (13 / 51)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134          1 1   1 1                                       1                                                                 1                           1         1                                   1             1       1             1                           1    
/**
 * Link lists and struct (graph or tree)
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
    var each = zrUtil.each;
 
    var DATAS = '\0__link_datas';
    var MAIN_DATA = '\0__link_mainData';
 
    // Caution:
    // In most case, either list or its shallow clones (see list.cloneShallow)
    // is active in echarts process. So considering heap memory consumption,
    // we do not clone tree or graph, but share them among list and its shallow clones.
    // But in some rare case, we have to keep old list (like do animation in chart). So
    // please take care that both the old list and the new list share the same tree/graph.
 
    /**
     * @param {Object} opt
     * @param {module:echarts/data/List} opt.mainData
     * @param {Object} [opt.struct] For example, instance of Graph or Tree.
     * @param {string} [opt.structAttr] designation: list[structAttr] = struct;
     * @param {Object} [opt.datas] {dataType: data},
     *                 like: {node: nodeList, edge: edgeList}.
     *                 Should contain mainData.
     * @param {Object} [opt.datasAttr] {dataType: attr},
     *                 designation: struct[datasAttr[dataType]] = list;
     */
    function linkList(opt) {
        var mainData = opt.mainData;
        var datas = opt.datas;
 
        if (!datas) {
            datas = {main: mainData};
            opt.datasAttr = {main: 'data'};
        }
        opt.datas = opt.mainData = null;
 
        linkAll(mainData, datas, opt);
 
        // Porxy data original methods.
        each(datas, function (data) {
            each(mainData.TRANSFERABLE_METHODS, function (methodName) {
                data.wrapMethod(methodName, zrUtil.curry(transferInjection, opt));
            });
 
        });
 
        // Beyond transfer, additional features should be added to `cloneShallow`.
        mainData.wrapMethod('cloneShallow', zrUtil.curry(cloneShallowInjection, opt));
 
        // Only mainData trigger change, because struct.update may trigger
        // another changable methods, which may bring about dead lock.
        each(mainData.CHANGABLE_METHODS, function (methodName) {
            mainData.wrapMethod(methodName, zrUtil.curry(changeInjection, opt));
        });
 
        // Make sure datas contains mainData.
        zrUtil.assert(datas[mainData.dataType] === mainData);
    }
 
    function transferInjection(opt, res) {
        if (isMainData(this)) {
            // Transfer datas to new main data.
            var datas = zrUtil.extend({}, this[DATAS]);
            datas[this.dataType] = res;
            linkAll(res, datas, opt);
        }
        else {
            // Modify the reference in main data to point newData.
            linkSingle(res, this.dataType, this[MAIN_DATA], opt);
        }
        return res;
    }
 
    function changeInjection(opt, res) {
        opt.struct && opt.struct.update(this);
        return res;
    }
 
    function cloneShallowInjection(opt, res) {
        // cloneShallow, which brings about some fragilities, may be inappropriate
        // to be exposed as an API. So for implementation simplicity we can make
        // the restriction that cloneShallow of not-mainData should not be invoked
        // outside, but only be invoked here.
        each(res[DATAS], function (data, dataType) {
            data !== res && linkSingle(data.cloneShallow(), dataType, res, opt);
        });
        return res;
    }
 
    /**
     * Supplement method to List.
     *
     * @public
     * @param {string} [dataType] If not specified, return mainData.
     * @return {module:echarts/data/List}
     */
    function getLinkedData(dataType) {
        var mainData = this[MAIN_DATA];
        return (dataType == null || mainData == null)
            ? mainData
            : mainData[DATAS][dataType];
    }
 
    function isMainData(data) {
        return data[MAIN_DATA] === data;
    }
 
    function linkAll(mainData, datas, opt) {
        mainData[DATAS] = {};
        each(datas, function (data, dataType) {
            linkSingle(data, dataType, mainData, opt);
        });
    }
 
    function linkSingle(data, dataType, mainData, opt) {
        mainData[DATAS][dataType] = data;
        data[MAIN_DATA] = mainData;
        data.dataType = dataType;
 
        if (opt.struct) {
            data[opt.structAttr] = opt.struct;
            opt.struct[opt.datasAttr[dataType]] = data;
        }
 
        // Supplement method.
        data.getLinkedData = getLinkedData;
    }
 
    module.exports = linkList;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/layout/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/layout/

Statements: 6.72% (9 / 134)      Branches: 0% (0 / 71)      Functions: 0% (0 / 16)      Lines: 6.72% (9 / 134)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/layout/
File Statements Branches Functions Lines
barGrid.js 6.56% (8 / 122) 0% (0 / 59) 0% (0 / 12) 6.56% (8 / 122)
points.js 8.33% (1 / 12) 0% (0 / 12) 0% (0 / 4) 8.33% (1 / 12)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/layout/barGrid.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/layout/barGrid.js

Statements: 6.56% (8 / 122)      Branches: 0% (0 / 59)      Functions: 0% (0 / 12)      Lines: 6.56% (8 / 122)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251      1 1 1   1       1       1                                                                                                                                                                                                                                                                 1                                                                                                                                                                                                               1    
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
    var numberUtil = require('../util/number');
    var parsePercent = numberUtil.parsePercent;
 
    function getSeriesStackId(seriesModel) {
        return seriesModel.get('stack') || '__ec_stack_' + seriesModel.seriesIndex;
    }
 
    function getAxisKey(axis) {
        return axis.dim + axis.index;
    }
 
    function calBarWidthAndOffset(barSeries, api) {
        // Columns info on each category axis. Key is cartesian name
        var columnsMap = {};
 
        zrUtil.each(barSeries, function (seriesModel, idx) {
            var data = seriesModel.getData();
            var cartesian = seriesModel.coordinateSystem;
 
            var baseAxis = cartesian.getBaseAxis();
            var axisExtent = baseAxis.getExtent();
            var bandWidth = baseAxis.type === 'category'
                ? baseAxis.getBandWidth()
                : (Math.abs(axisExtent[1] - axisExtent[0]) / data.count());
 
            var columnsOnAxis = columnsMap[getAxisKey(baseAxis)] || {
                bandWidth: bandWidth,
                remainedWidth: bandWidth,
                autoWidthCount: 0,
                categoryGap: '20%',
                gap: '30%',
                stacks: {}
            };
            var stacks = columnsOnAxis.stacks;
            columnsMap[getAxisKey(baseAxis)] = columnsOnAxis;
 
            var stackId = getSeriesStackId(seriesModel);
 
            if (!stacks[stackId]) {
                columnsOnAxis.autoWidthCount++;
            }
            stacks[stackId] = stacks[stackId] || {
                width: 0,
                maxWidth: 0
            };
 
            var barWidth = parsePercent(
                seriesModel.get('barWidth'), bandWidth
            );
            var barMaxWidth = parsePercent(
                seriesModel.get('barMaxWidth'), bandWidth
            );
            var barGap = seriesModel.get('barGap');
            var barCategoryGap = seriesModel.get('barCategoryGap');
 
            // Caution: In a single coordinate system, these barGrid attributes
            // will be shared by series. Consider that they have default values,
            // only the attributes set on the last series will work.
            // Do not change this fact unless there will be a break change.
 
            // TODO
            if (barWidth && !stacks[stackId].width) {
                barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth);
                stacks[stackId].width = barWidth;
                columnsOnAxis.remainedWidth -= barWidth;
            }
 
            barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth);
            (barGap != null) && (columnsOnAxis.gap = barGap);
            (barCategoryGap != null) && (columnsOnAxis.categoryGap = barCategoryGap);
        });
 
        var result = {};
 
        zrUtil.each(columnsMap, function (columnsOnAxis, coordSysName) {
 
            result[coordSysName] = {};
 
            var stacks = columnsOnAxis.stacks;
            var bandWidth = columnsOnAxis.bandWidth;
            var categoryGap = parsePercent(columnsOnAxis.categoryGap, bandWidth);
            var barGapPercent = parsePercent(columnsOnAxis.gap, 1);
 
            var remainedWidth = columnsOnAxis.remainedWidth;
            var autoWidthCount = columnsOnAxis.autoWidthCount;
            var autoWidth = (remainedWidth - categoryGap)
                / (autoWidthCount + (autoWidthCount - 1) * barGapPercent);
            autoWidth = Math.max(autoWidth, 0);
 
            // Find if any auto calculated bar exceeded maxBarWidth
            zrUtil.each(stacks, function (column, stack) {
                var maxWidth = column.maxWidth;
                if (maxWidth && maxWidth < autoWidth) {
                    maxWidth = Math.min(maxWidth, remainedWidth);
                    if (column.width) {
                        maxWidth = Math.min(maxWidth, column.width);
                    }
                    remainedWidth -= maxWidth;
                    column.width = maxWidth;
                    autoWidthCount--;
                }
            });
 
            // Recalculate width again
            autoWidth = (remainedWidth - categoryGap)
                / (autoWidthCount + (autoWidthCount - 1) * barGapPercent);
            autoWidth = Math.max(autoWidth, 0);
 
            var widthSum = 0;
            var lastColumn;
            zrUtil.each(stacks, function (column, idx) {
                if (!column.width) {
                    column.width = autoWidth;
                }
                lastColumn = column;
                widthSum += column.width * (1 + barGapPercent);
            });
            if (lastColumn) {
                widthSum -= lastColumn.width * barGapPercent;
            }
 
            var offset = -widthSum / 2;
            zrUtil.each(stacks, function (column, stackId) {
                result[coordSysName][stackId] = result[coordSysName][stackId] || {
                    offset: offset,
                    width: column.width
                };
 
                offset += column.width * (1 + barGapPercent);
            });
        });
 
        return result;
    }
 
    /**
     * @param {string} seriesType
     * @param {module:echarts/model/Global} ecModel
     * @param {module:echarts/ExtensionAPI} api
     */
    function barLayoutGrid(seriesType, ecModel, api) {
 
        var barWidthAndOffset = calBarWidthAndOffset(
            zrUtil.filter(
                ecModel.getSeriesByType(seriesType),
                function (seriesModel) {
                    return !ecModel.isSeriesFiltered(seriesModel)
                        && seriesModel.coordinateSystem
                        && seriesModel.coordinateSystem.type === 'cartesian2d';
                }
            )
        );
 
        var lastStackCoords = {};
        var lastStackCoordsOrigin = {};
 
        ecModel.eachSeriesByType(seriesType, function (seriesModel) {
 
            var data = seriesModel.getData();
            var cartesian = seriesModel.coordinateSystem;
            var baseAxis = cartesian.getBaseAxis();
 
            var stackId = getSeriesStackId(seriesModel);
            var columnLayoutInfo = barWidthAndOffset[getAxisKey(baseAxis)][stackId];
            var columnOffset = columnLayoutInfo.offset;
            var columnWidth = columnLayoutInfo.width;
            var valueAxis = cartesian.getOtherAxis(baseAxis);
 
            var barMinHeight = seriesModel.get('barMinHeight') || 0;
 
            var valueAxisStart = baseAxis.onZero
                ? valueAxis.toGlobalCoord(valueAxis.dataToCoord(0))
                : valueAxis.getGlobalExtent()[0];
 
            var coords = cartesian.dataToPoints(data, true);
            lastStackCoords[stackId] = lastStackCoords[stackId] || [];
            lastStackCoordsOrigin[stackId] = lastStackCoordsOrigin[stackId] || []; // Fix #4243
 
            data.setLayout({
                offset: columnOffset,
                size: columnWidth
            });
 
            data.each(valueAxis.dim, function (value, idx) {
                if (isNaN(value)) {
                    return;
                }
 
                if (!lastStackCoords[stackId][idx]) {
                    lastStackCoords[stackId][idx] = {
                        p: valueAxisStart, // Positive stack
                        n: valueAxisStart  // Negative stack
                    };
                    lastStackCoordsOrigin[stackId][idx] = {
                        p: valueAxisStart, // Positive stack
                        n: valueAxisStart  // Negative stack
                    };
                }
                var sign = value >= 0 ? 'p' : 'n';
                var coord = coords[idx];
                var lastCoord = lastStackCoords[stackId][idx][sign];
                var lastCoordOrigin = lastStackCoordsOrigin[stackId][idx][sign];
                var x;
                var y;
                var width;
                var height;
 
                if (valueAxis.isHorizontal()) {
                    x = lastCoord;
                    y = coord[1] + columnOffset;
                    width = coord[0] - lastCoordOrigin;
                    height = columnWidth;
 
                    lastStackCoordsOrigin[stackId][idx][sign] += width;
                    if (Math.abs(width) < barMinHeight) {
                        width = (width < 0 ? -1 : 1) * barMinHeight;
                    }
                    lastStackCoords[stackId][idx][sign] += width;
                }
                else {
                    x = coord[0] + columnOffset;
                    y = lastCoord;
                    width = columnWidth;
                    height = coord[1] - lastCoordOrigin;
 
                    lastStackCoordsOrigin[stackId][idx][sign] += height;
                    if (Math.abs(height) < barMinHeight) {
                        // Include zero to has a positive bar
                        height = (height <= 0 ? -1 : 1) * barMinHeight;
                    }
                    lastStackCoords[stackId][idx][sign] += height;
                }
 
                data.setItemLayout(idx, {
                    x: x,
                    y: y,
                    width: width,
                    height: height
                });
            }, true);
 
        }, this);
    }
 
    module.exports = barLayoutGrid;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/layout/points.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/layout/points.js

Statements: 8.33% (1 / 12)      Branches: 0% (0 / 12)      Functions: 0% (0 / 4)      Lines: 8.33% (1 / 12)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30    1                                                      
 
 
    module.exports = function (seriesType, ecModel) {
        ecModel.eachSeriesByType(seriesType, function (seriesModel) {
            var data = seriesModel.getData();
            var coordSys = seriesModel.coordinateSystem;
 
            if (coordSys) {
                var dims = coordSys.dimensions;
 
                if (dims.length === 1) {
                    data.each(dims[0], function (x, idx) {
                        // Also {Array.<number>}, not undefined to avoid if...else... statement
                        data.setItemLayout(idx, isNaN(x) ? [NaN, NaN] : coordSys.dataToPoint(x));
                    });
                }
                else if (dims.length === 2) {
                    data.each(dims, function (x, y, idx) {
                        // Also {Array.<number>}, not undefined to avoid if...else... statement
                        data.setItemLayout(
                            idx, (isNaN(x) || isNaN(y)) ? [NaN, NaN] : coordSys.dataToPoint([x, y])
                        );
                    }, true);
                }
            }
        });
    };
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/loading/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/loading/

Statements: 16.67% (4 / 24)      Branches: 0% (0 / 2)      Functions: 0% (0 / 2)      Lines: 16.67% (4 / 24)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/loading/
File Statements Branches Functions Lines
default.js 16.67% (4 / 24) 0% (0 / 2) 0% (0 / 2) 16.67% (4 / 24)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/loading/default.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/loading/default.js

Statements: 16.67% (4 / 24)      Branches: 0% (0 / 2)      Functions: 0% (0 / 2)      Lines: 16.67% (4 / 24)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99    1 1 1                 1                                                                                                                                                                          
 
 
    var graphic = require('../util/graphic');
    var zrUtil = require('zrender/lib/core/util');
    var PI = Math.PI;
    /**
     * @param {module:echarts/ExtensionAPI} api
     * @param {Object} [opts]
     * @param {string} [opts.text]
     * @param {string} [opts.color]
     * @param {string} [opts.textColor]
     * @return {module:zrender/Element}
     */
    module.exports = function (api, opts) {
        opts = opts || {};
        zrUtil.defaults(opts, {
            text: 'loading',
            color: '#c23531',
            textColor: '#000',
            maskColor: 'rgba(255, 255, 255, 0.8)',
            zlevel: 0
        });
        var mask = new graphic.Rect({
            style: {
                fill: opts.maskColor
            },
            zlevel: opts.zlevel,
            z: 10000
        });
        var arc = new graphic.Arc({
            shape: {
                startAngle: -PI / 2,
                endAngle: -PI / 2 + 0.1,
                r: 10
            },
            style: {
                stroke: opts.color,
                lineCap: 'round',
                lineWidth: 5
            },
            zlevel: opts.zlevel,
            z: 10001
        });
        var labelRect = new graphic.Rect({
            style: {
                fill: 'none',
                text: opts.text,
                textPosition: 'right',
                textDistance: 10,
                textFill: opts.textColor
            },
            zlevel: opts.zlevel,
            z: 10001
        });
 
        arc.animateShape(true)
            .when(1000, {
                endAngle: PI * 3 / 2
            })
            .start('circularInOut');
        arc.animateShape(true)
            .when(1000, {
                startAngle: PI * 3 / 2
            })
            .delay(300)
            .start('circularInOut');
 
        var group = new graphic.Group();
        group.add(arc);
        group.add(labelRect);
        group.add(mask);
        // Inject resize
        group.resize = function () {
            var cx = api.getWidth() / 2;
            var cy = api.getHeight() / 2;
            arc.setShape({
                cx: cx,
                cy: cy
            });
            var r = arc.shape.r;
            labelRect.setShape({
                x: cx - r,
                y: cy - r,
                width: r * 2,
                height: r * 2
            });
 
            mask.setShape({
                x: 0,
                y: 0,
                width: api.getWidth(),
                height: api.getHeight()
            });
        };
        group.resize();
        return group;
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/

Statements: 16.39% (88 / 537)      Branches: 0.63% (2 / 317)      Functions: 0% (0 / 112)      Lines: 16.39% (88 / 537)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/model/
File Statements Branches Functions Lines
Component.js 28.89% (13 / 45) 0% (0 / 12) 0% (0 / 10) 28.89% (13 / 45)
Global.js 11.47% (25 / 218) 0% (0 / 124) 0% (0 / 53) 11.47% (25 / 218)
Model.js 25.45% (14 / 55) 0% (0 / 39) 0% (0 / 14) 25.45% (14 / 55)
OptionManager.js 12.9% (16 / 124) 0% (0 / 79) 0% (0 / 18) 12.9% (16 / 124)
Series.js 18.68% (17 / 91) 0% (0 / 57) 0% (0 / 17) 18.68% (17 / 91)
globalDefault.js 75% (3 / 4) 33.33% (2 / 6) 100% (0 / 0) 75% (3 / 4)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/Component.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/Component.js

Statements: 28.89% (13 / 45)      Branches: 0% (0 / 12)      Functions: 0% (0 / 10)      Lines: 28.89% (13 / 45)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195              1 1 1 1 1 1                 1                                                                                                                                                                                                                                                                                                           1     1     1   1                     1   1    
/**
 * Component model
 *
 * @module echarts/model/Component
 */
 
 
    var Model = require('./Model');
    var zrUtil = require('zrender/lib/core/util');
    var arrayPush = Array.prototype.push;
    var componentUtil = require('../util/component');
    var clazzUtil = require('../util/clazz');
    var layout = require('../util/layout');
 
    /**
     * @alias module:echarts/model/Component
     * @constructor
     * @param {Object} option
     * @param {module:echarts/model/Model} parentModel
     * @param {module:echarts/model/Model} ecModel
     */
    var ComponentModel = Model.extend({
 
        type: 'component',
 
        /**
         * @readOnly
         * @type {string}
         */
        id: '',
 
        /**
         * @readOnly
         */
        name: '',
 
        /**
         * @readOnly
         * @type {string}
         */
        mainType: '',
 
        /**
         * @readOnly
         * @type {string}
         */
        subType: '',
 
        /**
         * @readOnly
         * @type {number}
         */
        componentIndex: 0,
 
        /**
         * @type {Object}
         * @protected
         */
        defaultOption: null,
 
        /**
         * @type {module:echarts/model/Global}
         * @readOnly
         */
        ecModel: null,
 
        /**
         * key: componentType
         * value:  Component model list, can not be null.
         * @type {Object.<string, Array.<module:echarts/model/Model>>}
         * @readOnly
         */
        dependentModels: [],
 
        /**
         * @type {string}
         * @readOnly
         */
        uid: null,
 
        /**
         * Support merge layout params.
         * Only support 'box' now (left/right/top/bottom/width/height).
         * @type {string|Object} Object can be {ignoreSize: true}
         * @readOnly
         */
        layoutMode: null,
 
        $constructor: function (option, parentModel, ecModel, extraOpt) {
            Model.call(this, option, parentModel, ecModel, extraOpt);
 
            this.uid = componentUtil.getUID('componentModel');
        },
 
 
        init: function (option, parentModel, ecModel, extraOpt) {
            this.mergeDefaultAndTheme(option, ecModel);
        },
 
        mergeDefaultAndTheme: function (option, ecModel) {
            var layoutMode = this.layoutMode;
            var inputPositionParams = layoutMode
                ? layout.getLayoutParams(option) : {};
 
            var themeModel = ecModel.getTheme();
            zrUtil.merge(option, themeModel.get(this.mainType));
            zrUtil.merge(option, this.getDefaultOption());
 
            if (layoutMode) {
                layout.mergeLayoutParam(option, inputPositionParams, layoutMode);
            }
        },
 
        mergeOption: function (option, extraOpt) {
            zrUtil.merge(this.option, option, true);
 
            var layoutMode = this.layoutMode;
            if (layoutMode) {
                layout.mergeLayoutParam(this.option, option, layoutMode);
            }
        },
 
        // Hooker after init or mergeOption
        optionUpdated: function (newCptOption, isInit) {},
 
        getDefaultOption: function () {
            if (!clazzUtil.hasOwn(this, '__defaultOption')) {
                var optList = [];
                var Class = this.constructor;
                while (Class) {
                    var opt = Class.prototype.defaultOption;
                    opt && optList.push(opt);
                    Class = Class.superClass;
                }
 
                var defaultOption = {};
                for (var i = optList.length - 1; i >= 0; i--) {
                    defaultOption = zrUtil.merge(defaultOption, optList[i], true);
                }
                clazzUtil.set(this, '__defaultOption', defaultOption);
            }
            return clazzUtil.get(this, '__defaultOption');
        },
 
        getReferringComponents: function (mainType) {
            return this.ecModel.queryComponents({
                mainType: mainType,
                index: this.get(mainType + 'Index', true),
                id: this.get(mainType + 'Id', true)
            });
        }
 
    });
 
    // Reset ComponentModel.extend, add preConstruct.
    // clazzUtil.enableClassExtend(
    //     ComponentModel,
    //     function (option, parentModel, ecModel, extraOpt) {
    //         // Set dependentModels, componentIndex, name, id, mainType, subType.
    //         zrUtil.extend(this, extraOpt);
 
    //         this.uid = componentUtil.getUID('componentModel');
 
    //         // this.setReadOnly([
    //         //     'type', 'id', 'uid', 'name', 'mainType', 'subType',
    //         //     'dependentModels', 'componentIndex'
    //         // ]);
    //     }
    // );
 
    // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
    clazzUtil.enableClassManagement(
        ComponentModel, {registerWhenExtend: true}
    );
    componentUtil.enableSubTypeDefaulter(ComponentModel);
 
    // Add capability of ComponentModel.topologicalTravel.
    componentUtil.enableTopologicalTravel(ComponentModel, getDependencies);
 
    function getDependencies(componentType) {
        var deps = [];
        zrUtil.each(ComponentModel.getClassesByMainType(componentType), function (Clazz) {
            arrayPush.apply(deps, Clazz.prototype.dependencies || []);
        });
        // Ensure main type
        return zrUtil.map(deps, function (type) {
            return clazzUtil.parseClassType(type).main;
        });
    }
 
    zrUtil.mixin(ComponentModel, require('./mixin/boxLayout'));
 
    module.exports = ComponentModel;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/Global.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/Global.js

Statements: 11.47% (25 / 218)      Branches: 0% (0 / 124)      Functions: 0% (0 / 53)      Lines: 11.47% (25 / 218)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714                                          1 1 1 1 1 1 1 1 1   1   1   1                 1                                                                                                                                                                                                                               1                                                                                                                                                                                                                                                                                                                                                                                                                                                                       1                                     1                                                                                                                                                                                                                                                                                                                                                                                       1                                   1                                                                         1                               1                             1                 1                         1                   1   1    
/**
 * ECharts global model
 *
 * @module {echarts/model/Global}
 */
 
 
 
    /**
     * Caution: If the mechanism should be changed some day, these cases
     * should be considered:
     *
     * (1) In `merge option` mode, if using the same option to call `setOption`
     * many times, the result should be the same (try our best to ensure that).
     * (2) In `merge option` mode, if a component has no id/name specified, it
     * will be merged by index, and the result sequence of the components is
     * consistent to the original sequence.
     * (3) `reset` feature (in toolbox). Find detailed info in comments about
     * `mergeOption` in module:echarts/model/OptionManager.
     */
 
    var zrUtil = require('zrender/lib/core/util');
    var modelUtil = require('../util/model');
    var Model = require('./Model');
    var each = zrUtil.each;
    var filter = zrUtil.filter;
    var map = zrUtil.map;
    var isArray = zrUtil.isArray;
    var indexOf = zrUtil.indexOf;
    var isObject = zrUtil.isObject;
 
    var ComponentModel = require('./Component');
 
    var globalDefault = require('./globalDefault');
 
    var OPTION_INNER_KEY = '\0_ec_inner';
 
    /**
     * @alias module:echarts/model/Global
     *
     * @param {Object} option
     * @param {module:echarts/model/Model} parentModel
     * @param {Object} theme
     */
    var GlobalModel = Model.extend({
 
        constructor: GlobalModel,
 
        init: function (option, parentModel, theme, optionManager) {
            theme = theme || {};
 
            this.option = null; // Mark as not initialized.
 
            /**
             * @type {module:echarts/model/Model}
             * @private
             */
            this._theme = new Model(theme);
 
            /**
             * @type {module:echarts/model/OptionManager}
             */
            this._optionManager = optionManager;
        },
 
        setOption: function (option, optionPreprocessorFuncs, onlyGraphic) {
            zrUtil.assert(
                !(OPTION_INNER_KEY in option),
                'please use chart.getOption()'
            );
 
            this._optionManager.setOption(option, optionPreprocessorFuncs);
 
            this.resetOption(null, onlyGraphic);
        },
 
        /**
         * @param {string} type null/undefined: reset all.
         *                      'recreate': force recreate all.
         *                      'timeline': only reset timeline option
         *                      'media': only reset media query option
         * @return {boolean} Whether option changed.
         */
        resetOption: function (type, onlyGraphic) {
            var optionChanged = false;
            var optionManager = this._optionManager;
 
            if (!type || type === 'recreate') {
                var baseOption = optionManager.mountOption(type === 'recreate');
 
                if (!this.option || type === 'recreate') {
                    initBase.call(this, baseOption);
                }
                else {
                    // If only graphic, other series and component will not
                    // go through update process, data should not be restored.
                    // Otherwise grphic els mounted on data will be eliminated
                    // and downplay will not work.
                    !onlyGraphic && this.restoreData();
                    this.mergeOption(baseOption);
                }
                optionChanged = true;
            }
 
            if (type === 'timeline' || type === 'media') {
                this.restoreData();
            }
 
            if (!type || type === 'recreate' || type === 'timeline') {
                var timelineOption = optionManager.getTimelineOption(this);
                timelineOption && (this.mergeOption(timelineOption), optionChanged = true);
            }
 
            if (!type || type === 'recreate' || type === 'media') {
                var mediaOptions = optionManager.getMediaOption(this, this._api);
                if (mediaOptions.length) {
                    each(mediaOptions, function (mediaOption) {
                        this.mergeOption(mediaOption, optionChanged = true);
                    }, this);
                }
            }
 
            return optionChanged;
        },
 
        /**
         * @protected
         */
        mergeOption: function (newOption) {
            var option = this.option;
            var componentsMap = this._componentsMap;
            var newCptTypes = [];
 
            // 如果不存在对应的 component model 则直接 merge
            each(newOption, function (componentOption, mainType) {
                if (componentOption == null) {
                    return;
                }
 
                if (!ComponentModel.hasClass(mainType)) {
                    option[mainType] = option[mainType] == null
                        ? zrUtil.clone(componentOption)
                        : zrUtil.merge(option[mainType], componentOption, true);
                }
                else {
                    newCptTypes.push(mainType);
                }
            });
 
            // FIXME OPTION 同步是否要改回原来的
            ComponentModel.topologicalTravel(
                newCptTypes, ComponentModel.getAllClassMainTypes(), visitComponent, this
            );
 
            this._seriesIndices = this._seriesIndices || [];
 
            function visitComponent(mainType, dependencies) {
                var newCptOptionList = modelUtil.normalizeToArray(newOption[mainType]);
 
                var mapResult = modelUtil.mappingToExists(
                    componentsMap[mainType], newCptOptionList
                );
 
                modelUtil.makeIdAndName(mapResult);
 
                // Set mainType and complete subType.
                each(mapResult, function (item, index) {
                    var opt = item.option;
                    if (isObject(opt)) {
                        item.keyInfo.mainType = mainType;
                        item.keyInfo.subType = determineSubType(mainType, opt, item.exist);
                    }
                });
 
                var dependentModels = getComponentsByTypes(
                    componentsMap, dependencies
                );
 
                option[mainType] = [];
                componentsMap[mainType] = [];
 
                each(mapResult, function (resultItem, index) {
                    var componentModel = resultItem.exist;
                    var newCptOption = resultItem.option;
 
                    zrUtil.assert(
                        isObject(newCptOption) || componentModel,
                        'Empty component definition'
                    );
 
                    // Consider where is no new option and should be merged using {},
                    // see removeEdgeAndAdd in topologicalTravel and
                    // ComponentModel.getAllClassMainTypes.
                    if (!newCptOption) {
                        componentModel.mergeOption({}, this);
                        componentModel.optionUpdated({}, false);
                    }
                    else {
                        var ComponentModelClass = ComponentModel.getClass(
                            mainType, resultItem.keyInfo.subType, true
                        );
 
                        if (componentModel && componentModel instanceof ComponentModelClass) {
                            componentModel.name = resultItem.keyInfo.name;
                            componentModel.mergeOption(newCptOption, this);
                            componentModel.optionUpdated(newCptOption, false);
                        }
                        else {
                            // PENDING Global as parent ?
                            var extraOpt = zrUtil.extend(
                                {
                                    dependentModels: dependentModels,
                                    componentIndex: index
                                },
                                resultItem.keyInfo
                            );
                            componentModel = new ComponentModelClass(
                                newCptOption, this, this, extraOpt
                            );
                            zrUtil.extend(componentModel, extraOpt);
                            componentModel.init(newCptOption, this, this, extraOpt);
                            // Call optionUpdated after init.
                            // newCptOption has been used as componentModel.option
                            // and may be merged with theme and default, so pass null
                            // to avoid confusion.
                            componentModel.optionUpdated(null, true);
                        }
                    }
 
                    componentsMap[mainType][index] = componentModel;
                    option[mainType][index] = componentModel.option;
                }, this);
 
                // Backup series for filtering.
                if (mainType === 'series') {
                    this._seriesIndices = createSeriesIndices(componentsMap.series);
                }
            }
        },
 
        /**
         * Get option for output (cloned option and inner info removed)
         * @public
         * @return {Object}
         */
        getOption: function () {
            var option = zrUtil.clone(this.option);
 
            each(option, function (opts, mainType) {
                if (ComponentModel.hasClass(mainType)) {
                    var opts = modelUtil.normalizeToArray(opts);
                    for (var i = opts.length - 1; i >= 0; i--) {
                        // Remove options with inner id.
                        if (modelUtil.isIdInner(opts[i])) {
                            opts.splice(i, 1);
                        }
                    }
                    option[mainType] = opts;
                }
            });
 
            delete option[OPTION_INNER_KEY];
 
            return option;
        },
 
        /**
         * @return {module:echarts/model/Model}
         */
        getTheme: function () {
            return this._theme;
        },
 
        /**
         * @param {string} mainType
         * @param {number} [idx=0]
         * @return {module:echarts/model/Component}
         */
        getComponent: function (mainType, idx) {
            var list = this._componentsMap[mainType];
            if (list) {
                return list[idx || 0];
            }
        },
 
        /**
         * If none of index and id and name used, return all components with mainType.
         * @param {Object} condition
         * @param {string} condition.mainType
         * @param {string} [condition.subType] If ignore, only query by mainType
         * @param {number|Array.<number>} [condition.index] Either input index or id or name.
         * @param {string|Array.<string>} [condition.id] Either input index or id or name.
         * @param {string|Array.<string>} [condition.name] Either input index or id or name.
         * @return {Array.<module:echarts/model/Component>}
         */
        queryComponents: function (condition) {
            var mainType = condition.mainType;
            if (!mainType) {
                return [];
            }
 
            var index = condition.index;
            var id = condition.id;
            var name = condition.name;
 
            var cpts = this._componentsMap[mainType];
 
            if (!cpts || !cpts.length) {
                return [];
            }
 
            var result;
 
            if (index != null) {
                if (!isArray(index)) {
                    index = [index];
                }
                result = filter(map(index, function (idx) {
                    return cpts[idx];
                }), function (val) {
                    return !!val;
                });
            }
            else if (id != null) {
                var isIdArray = isArray(id);
                result = filter(cpts, function (cpt) {
                    return (isIdArray && indexOf(id, cpt.id) >= 0)
                        || (!isIdArray && cpt.id === id);
                });
            }
            else if (name != null) {
                var isNameArray = isArray(name);
                result = filter(cpts, function (cpt) {
                    return (isNameArray && indexOf(name, cpt.name) >= 0)
                        || (!isNameArray && cpt.name === name);
                });
            }
            else {
                // Return all components with mainType
                result = cpts.slice();
            }
 
            return filterBySubType(result, condition);
        },
 
        /**
         * The interface is different from queryComponents,
         * which is convenient for inner usage.
         *
         * @usage
         * var result = findComponents(
         *     {mainType: 'dataZoom', query: {dataZoomId: 'abc'}}
         * );
         * var result = findComponents(
         *     {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}}
         * );
         * var result = findComponents(
         *     {mainType: 'series'},
         *     function (model, index) {...}
         * );
         * // result like [component0, componnet1, ...]
         *
         * @param {Object} condition
         * @param {string} condition.mainType Mandatory.
         * @param {string} [condition.subType] Optional.
         * @param {Object} [condition.query] like {xxxIndex, xxxId, xxxName},
         *        where xxx is mainType.
         *        If query attribute is null/undefined or has no index/id/name,
         *        do not filtering by query conditions, which is convenient for
         *        no-payload situations or when target of action is global.
         * @param {Function} [condition.filter] parameter: component, return boolean.
         * @return {Array.<module:echarts/model/Component>}
         */
        findComponents: function (condition) {
            var query = condition.query;
            var mainType = condition.mainType;
 
            var queryCond = getQueryCond(query);
            var result = queryCond
                ? this.queryComponents(queryCond)
                : this._componentsMap[mainType];
 
            return doFilter(filterBySubType(result, condition));
 
            function getQueryCond(q) {
                var indexAttr = mainType + 'Index';
                var idAttr = mainType + 'Id';
                var nameAttr = mainType + 'Name';
                return q && (
                        q[indexAttr] != null
                        || q[idAttr] != null
                        || q[nameAttr] != null
                    )
                    ? {
                        mainType: mainType,
                        // subType will be filtered finally.
                        index: q[indexAttr],
                        id: q[idAttr],
                        name: q[nameAttr]
                    }
                    : null;
            }
 
            function doFilter(res) {
                return condition.filter
                     ? filter(res, condition.filter)
                     : res;
            }
        },
 
        /**
         * @usage
         * eachComponent('legend', function (legendModel, index) {
         *     ...
         * });
         * eachComponent(function (componentType, model, index) {
         *     // componentType does not include subType
         *     // (componentType is 'xxx' but not 'xxx.aa')
         * });
         * eachComponent(
         *     {mainType: 'dataZoom', query: {dataZoomId: 'abc'}},
         *     function (model, index) {...}
         * );
         * eachComponent(
         *     {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}},
         *     function (model, index) {...}
         * );
         *
         * @param {string|Object=} mainType When mainType is object, the definition
         *                                  is the same as the method 'findComponents'.
         * @param {Function} cb
         * @param {*} context
         */
        eachComponent: function (mainType, cb, context) {
            var componentsMap = this._componentsMap;
 
            if (typeof mainType === 'function') {
                context = cb;
                cb = mainType;
                each(componentsMap, function (components, componentType) {
                    each(components, function (component, index) {
                        cb.call(context, componentType, component, index);
                    });
                });
            }
            else if (zrUtil.isString(mainType)) {
                each(componentsMap[mainType], cb, context);
            }
            else if (isObject(mainType)) {
                var queryResult = this.findComponents(mainType);
                each(queryResult, cb, context);
            }
        },
 
        /**
         * @param {string} name
         * @return {Array.<module:echarts/model/Series>}
         */
        getSeriesByName: function (name) {
            var series = this._componentsMap.series;
            return filter(series, function (oneSeries) {
                return oneSeries.name === name;
            });
        },
 
        /**
         * @param {number} seriesIndex
         * @return {module:echarts/model/Series}
         */
        getSeriesByIndex: function (seriesIndex) {
            return this._componentsMap.series[seriesIndex];
        },
 
        /**
         * @param {string} subType
         * @return {Array.<module:echarts/model/Series>}
         */
        getSeriesByType: function (subType) {
            var series = this._componentsMap.series;
            return filter(series, function (oneSeries) {
                return oneSeries.subType === subType;
            });
        },
 
        /**
         * @return {Array.<module:echarts/model/Series>}
         */
        getSeries: function () {
            return this._componentsMap.series.slice();
        },
 
        /**
         * After filtering, series may be different
         * frome raw series.
         *
         * @param {Function} cb
         * @param {*} context
         */
        eachSeries: function (cb, context) {
            assertSeriesInitialized(this);
            each(this._seriesIndices, function (rawSeriesIndex) {
                var series = this._componentsMap.series[rawSeriesIndex];
                cb.call(context, series, rawSeriesIndex);
            }, this);
        },
 
        /**
         * Iterate raw series before filtered.
         *
         * @param {Function} cb
         * @param {*} context
         */
        eachRawSeries: function (cb, context) {
            each(this._componentsMap.series, cb, context);
        },
 
        /**
         * After filtering, series may be different.
         * frome raw series.
         *
         * @parma {string} subType
         * @param {Function} cb
         * @param {*} context
         */
        eachSeriesByType: function (subType, cb, context) {
            assertSeriesInitialized(this);
            each(this._seriesIndices, function (rawSeriesIndex) {
                var series = this._componentsMap.series[rawSeriesIndex];
                if (series.subType === subType) {
                    cb.call(context, series, rawSeriesIndex);
                }
            }, this);
        },
 
        /**
         * Iterate raw series before filtered of given type.
         *
         * @parma {string} subType
         * @param {Function} cb
         * @param {*} context
         */
        eachRawSeriesByType: function (subType, cb, context) {
            return each(this.getSeriesByType(subType), cb, context);
        },
 
        /**
         * @param {module:echarts/model/Series} seriesModel
         */
        isSeriesFiltered: function (seriesModel) {
            assertSeriesInitialized(this);
            return zrUtil.indexOf(this._seriesIndices, seriesModel.componentIndex) < 0;
        },
 
        /**
         * @param {Function} cb
         * @param {*} context
         */
        filterSeries: function (cb, context) {
            assertSeriesInitialized(this);
            var filteredSeries = filter(
                this._componentsMap.series, cb, context
            );
            this._seriesIndices = createSeriesIndices(filteredSeries);
        },
 
        restoreData: function () {
            var componentsMap = this._componentsMap;
 
            this._seriesIndices = createSeriesIndices(componentsMap.series);
 
            var componentTypes = [];
            each(componentsMap, function (components, componentType) {
                componentTypes.push(componentType);
            });
 
            ComponentModel.topologicalTravel(
                componentTypes,
                ComponentModel.getAllClassMainTypes(),
                function (componentType, dependencies) {
                    each(componentsMap[componentType], function (component) {
                        component.restoreData();
                    });
                }
            );
        }
 
    });
 
    /**
     * @inner
     */
    function mergeTheme(option, theme) {
        zrUtil.each(theme, function (themeItem, name) {
            // 如果有 component model 则把具体的 merge 逻辑交给该 model 处理
            if (!ComponentModel.hasClass(name)) {
                if (typeof themeItem === 'object') {
                    option[name] = !option[name]
                        ? zrUtil.clone(themeItem)
                        : zrUtil.merge(option[name], themeItem, false);
                }
                else {
                    if (option[name] == null) {
                        option[name] = themeItem;
                    }
                }
            }
        });
    }
 
    function initBase(baseOption) {
        baseOption = baseOption;
 
        // Using OPTION_INNER_KEY to mark that this option can not be used outside,
        // i.e. `chart.setOption(chart.getModel().option);` is forbiden.
        this.option = {};
        this.option[OPTION_INNER_KEY] = 1;
 
        /**
         * Init with series: [], in case of calling findSeries method
         * before series initialized.
         * @type {Object.<string, Array.<module:echarts/model/Model>>}
         * @private
         */
        this._componentsMap = {series: []};
 
        /**
         * Mapping between filtered series list and raw series list.
         * key: filtered series indices, value: raw series indices.
         * @type {Array.<nubmer>}
         * @private
         */
        this._seriesIndices = null;
 
        mergeTheme(baseOption, this._theme.option);
 
        // TODO Needs clone when merging to the unexisted property
        zrUtil.merge(baseOption, globalDefault, false);
 
        this.mergeOption(baseOption);
    }
 
    /**
     * @inner
     * @param {Array.<string>|string} types model types
     * @return {Object} key: {string} type, value: {Array.<Object>} models
     */
    function getComponentsByTypes(componentsMap, types) {
        if (!zrUtil.isArray(types)) {
            types = types ? [types] : [];
        }
 
        var ret = {};
        each(types, function (type) {
            ret[type] = (componentsMap[type] || []).slice();
        });
 
        return ret;
    }
 
    /**
     * @inner
     */
    function determineSubType(mainType, newCptOption, existComponent) {
        var subType = newCptOption.type
            ? newCptOption.type
            : existComponent
            ? existComponent.subType
            // Use determineSubType only when there is no existComponent.
            : ComponentModel.determineSubType(mainType, newCptOption);
 
        // tooltip, markline, markpoint may always has no subType
        return subType;
    }
 
    /**
     * @inner
     */
    function createSeriesIndices(seriesModels) {
        return map(seriesModels, function (series) {
            return series.componentIndex;
        }) || [];
    }
 
    /**
     * @inner
     */
    function filterBySubType(components, condition) {
        // Using hasOwnProperty for restrict. Consider
        // subType is undefined in user payload.
        return condition.hasOwnProperty('subType')
            ? filter(components, function (cpt) {
                return cpt.subType === condition.subType;
            })
            : components;
    }
 
    /**
     * @inner
     */
    function assertSeriesInitialized(ecModel) {
        // Components that use _seriesIndices should depends on series component,
        // which make sure that their initialization is after series.
        if (__DEV__) {
            if (!ecModel._seriesIndices) {
                throw new Error('Series has not been initialized yet.');
            }
        }
    }
 
    zrUtil.mixin(GlobalModel, require('./mixin/colorPalette'));
 
    module.exports = GlobalModel;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/Model.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/Model.js

Statements: 25.45% (14 / 55)      Branches: 0% (0 / 39)      Functions: 0% (0 / 14)      Lines: 25.45% (14 / 55)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198          1 1 1                 1                                                           1                                                                                                                                                                                                                                         1                                   1           1   1 1 1 1 1   1    
/**
 * @module echarts/model/Model
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
    var clazzUtil = require('../util/clazz');
    var env = require('zrender/lib/core/env');
 
    /**
     * @alias module:echarts/model/Model
     * @constructor
     * @param {Object} option
     * @param {module:echarts/model/Model} [parentModel]
     * @param {module:echarts/model/Global} [ecModel]
     */
    function Model(option, parentModel, ecModel) {
        /**
         * @type {module:echarts/model/Model}
         * @readOnly
         */
        this.parentModel = parentModel;
 
        /**
         * @type {module:echarts/model/Global}
         * @readOnly
         */
        this.ecModel = ecModel;
 
        /**
         * @type {Object}
         * @protected
         */
        this.option = option;
 
        // Simple optimization
        // if (this.init) {
        //     if (arguments.length <= 4) {
        //         this.init(option, parentModel, ecModel, extraOpt);
        //     }
        //     else {
        //         this.init.apply(this, arguments);
        //     }
        // }
    }
 
    Model.prototype = {
 
        constructor: Model,
 
        /**
         * Model 的初始化函数
         * @param {Object} option
         */
        init: null,
 
        /**
         * 从新的 Option merge
         */
        mergeOption: function (option) {
            zrUtil.merge(this.option, option, true);
        },
 
        /**
         * @param {string|Array.<string>} path
         * @param {boolean} [ignoreParent=false]
         * @return {*}
         */
        get: function (path, ignoreParent) {
            if (path == null) {
                return this.option;
            }
 
            return doGet(
                this.option,
                this.parsePath(path),
                !ignoreParent && getParent(this, path)
            );
        },
 
        /**
         * @param {string} key
         * @param {boolean} [ignoreParent=false]
         * @return {*}
         */
        getShallow: function (key, ignoreParent) {
            var option = this.option;
 
            var val = option == null ? option : option[key];
            var parentModel = !ignoreParent && getParent(this, key);
            if (val == null && parentModel) {
                val = parentModel.getShallow(key);
            }
            return val;
        },
 
        /**
         * @param {string|Array.<string>} path
         * @param {module:echarts/model/Model} [parentModel]
         * @return {module:echarts/model/Model}
         */
        getModel: function (path, parentModel) {
            var obj = path == null
                ? this.option
                : doGet(this.option, path = this.parsePath(path));
 
            var thisParentModel;
            parentModel = parentModel || (
                (thisParentModel = getParent(this, path))
                    && thisParentModel.getModel(path)
            );
 
            return new Model(obj, parentModel, this.ecModel);
        },
 
        /**
         * If model has option
         */
        isEmpty: function () {
            return this.option == null;
        },
 
        restoreData: function () {},
 
        // Pending
        clone: function () {
            var Ctor = this.constructor;
            return new Ctor(zrUtil.clone(this.option));
        },
 
        setReadOnly: function (properties) {
            clazzUtil.setReadOnly(this, properties);
        },
 
        // If path is null/undefined, return null/undefined.
        parsePath: function(path) {
            if (typeof path === 'string') {
                path = path.split('.');
            }
            return path;
        },
 
        /**
         * @param {Function} getParentMethod
         *        param {Array.<string>|string} path
         *        return {module:echarts/model/Model}
         */
        customizeGetParent: function (getParentMethod) {
            clazzUtil.set(this, 'getParent', getParentMethod);
        },
 
        isAnimationEnabled: function () {
            if (!env.node) {
                if (this.option.animation != null) {
                    return !!this.option.animation;
                }
                else if (this.parentModel) {
                    return this.parentModel.isAnimationEnabled();
                }
            }
        }
    };
 
    function doGet(obj, pathArr, parentModel) {
        for (var i = 0; i < pathArr.length; i++) {
            // Ignore empty
            if (!pathArr[i]) {
                continue;
            }
            // obj could be number/string/... (like 0)
            obj = (obj && typeof obj === 'object') ? obj[pathArr[i]] : null;
            if (obj == null) {
                break;
            }
        }
        if (obj == null && parentModel) {
            obj = parentModel.get(pathArr);
        }
        return obj;
    }
 
    function getParent(model, path) {
        var getParentMethod = clazzUtil.get(model, 'getParent');
        return getParentMethod ? getParentMethod.call(model, path) : model.parentModel;
    }
 
    // Enable Model.extend.
    clazzUtil.enableClassExtend(Model);
 
    var mixin = zrUtil.mixin;
    mixin(Model, require('./mixin/lineStyle'));
    mixin(Model, require('./mixin/areaStyle'));
    mixin(Model, require('./mixin/textStyle'));
    mixin(Model, require('./mixin/itemStyle'));
 
    module.exports = Model;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/OptionManager.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/OptionManager.js

Statements: 12.9% (16 / 124)      Branches: 0% (0 / 79)      Functions: 0% (0 / 18)      Lines: 12.9% (16 / 124)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436                1 1 1 1 1 1 1   1                                                                                                                 1                                                                                                               1                                                                                                                                                                                                                                                                                     1                                                                                                                                               1                                                     1                       1                                                   1                                                       1    
/**
 * ECharts option manager
 *
 * @module {echarts/model/OptionManager}
 */
 
 
 
    var zrUtil = require('zrender/lib/core/util');
    var modelUtil = require('../util/model');
    var ComponentModel = require('./Component');
    var each = zrUtil.each;
    var clone = zrUtil.clone;
    var map = zrUtil.map;
    var merge = zrUtil.merge;
 
    var QUERY_REG = /^(min|max)?(.+)$/;
 
    /**
     * TERM EXPLANATIONS:
     *
     * [option]:
     *
     *     An object that contains definitions of components. For example:
     *     var option = {
     *         title: {...},
     *         legend: {...},
     *         visualMap: {...},
     *         series: [
     *             {data: [...]},
     *             {data: [...]},
     *             ...
     *         ]
     *     };
     *
     * [rawOption]:
     *
     *     An object input to echarts.setOption. 'rawOption' may be an
     *     'option', or may be an object contains multi-options. For example:
     *     var option = {
     *         baseOption: {
     *             title: {...},
     *             legend: {...},
     *             series: [
     *                 {data: [...]},
     *                 {data: [...]},
     *                 ...
     *             ]
     *         },
     *         timeline: {...},
     *         options: [
     *             {title: {...}, series: {data: [...]}},
     *             {title: {...}, series: {data: [...]}},
     *             ...
     *         ],
     *         media: [
     *             {
     *                 query: {maxWidth: 320},
     *                 option: {series: {x: 20}, visualMap: {show: false}}
     *             },
     *             {
     *                 query: {minWidth: 320, maxWidth: 720},
     *                 option: {series: {x: 500}, visualMap: {show: true}}
     *             },
     *             {
     *                 option: {series: {x: 1200}, visualMap: {show: true}}
     *             }
     *         ]
     *     };
     *
     * @alias module:echarts/model/OptionManager
     * @param {module:echarts/ExtensionAPI} api
     */
    function OptionManager(api) {
 
        /**
         * @private
         * @type {module:echarts/ExtensionAPI}
         */
        this._api = api;
 
        /**
         * @private
         * @type {Array.<number>}
         */
        this._timelineOptions = [];
 
        /**
         * @private
         * @type {Array.<Object>}
         */
        this._mediaList = [];
 
        /**
         * @private
         * @type {Object}
         */
        this._mediaDefault;
 
        /**
         * -1, means default.
         * empty means no media.
         * @private
         * @type {Array.<number>}
         */
        this._currentMediaIndices = [];
 
        /**
         * @private
         * @type {Object}
         */
        this._optionBackup;
 
        /**
         * @private
         * @type {Object}
         */
        this._newBaseOption;
    }
 
    // timeline.notMerge is not supported in ec3. Firstly there is rearly
    // case that notMerge is needed. Secondly supporting 'notMerge' requires
    // rawOption cloned and backuped when timeline changed, which does no
    // good to performance. What's more, that both timeline and setOption
    // method supply 'notMerge' brings complex and some problems.
    // Consider this case:
    // (step1) chart.setOption({timeline: {notMerge: false}, ...}, false);
    // (step2) chart.setOption({timeline: {notMerge: true}, ...}, false);
 
    OptionManager.prototype = {
 
        constructor: OptionManager,
 
        /**
         * @public
         * @param {Object} rawOption Raw option.
         * @param {module:echarts/model/Global} ecModel
         * @param {Array.<Function>} optionPreprocessorFuncs
         * @return {Object} Init option
         */
        setOption: function (rawOption, optionPreprocessorFuncs) {
            rawOption = clone(rawOption, true);
 
            // FIXME
            // 如果 timeline options 或者 media 中设置了某个属性,而baseOption中没有设置,则进行警告。
 
            var oldOptionBackup = this._optionBackup;
            var newParsedOption = parseRawOption.call(
                this, rawOption, optionPreprocessorFuncs, !oldOptionBackup
            );
            this._newBaseOption = newParsedOption.baseOption;
 
            // For setOption at second time (using merge mode);
            if (oldOptionBackup) {
                // Only baseOption can be merged.
                mergeOption(oldOptionBackup.baseOption, newParsedOption.baseOption);
 
                // For simplicity, timeline options and media options do not support merge,
                // that is, if you `setOption` twice and both has timeline options, the latter
                // timeline opitons will not be merged to the formers, but just substitude them.
                if (newParsedOption.timelineOptions.length) {
                    oldOptionBackup.timelineOptions = newParsedOption.timelineOptions;
                }
                if (newParsedOption.mediaList.length) {
                    oldOptionBackup.mediaList = newParsedOption.mediaList;
                }
                if (newParsedOption.mediaDefault) {
                    oldOptionBackup.mediaDefault = newParsedOption.mediaDefault;
                }
            }
            else {
                this._optionBackup = newParsedOption;
            }
        },
 
        /**
         * @param {boolean} isRecreate
         * @return {Object}
         */
        mountOption: function (isRecreate) {
            var optionBackup = this._optionBackup;
 
            // TODO
            // 如果没有reset功能则不clone。
 
            this._timelineOptions = map(optionBackup.timelineOptions, clone);
            this._mediaList = map(optionBackup.mediaList, clone);
            this._mediaDefault = clone(optionBackup.mediaDefault);
            this._currentMediaIndices = [];
 
            return clone(isRecreate
                // this._optionBackup.baseOption, which is created at the first `setOption`
                // called, and is merged into every new option by inner method `mergeOption`
                // each time `setOption` called, can be only used in `isRecreate`, because
                // its reliability is under suspicion. In other cases option merge is
                // performed by `model.mergeOption`.
                ? optionBackup.baseOption : this._newBaseOption
            );
        },
 
        /**
         * @param {module:echarts/model/Global} ecModel
         * @return {Object}
         */
        getTimelineOption: function (ecModel) {
            var option;
            var timelineOptions = this._timelineOptions;
 
            if (timelineOptions.length) {
                // getTimelineOption can only be called after ecModel inited,
                // so we can get currentIndex from timelineModel.
                var timelineModel = ecModel.getComponent('timeline');
                if (timelineModel) {
                    option = clone(
                        timelineOptions[timelineModel.getCurrentIndex()],
                        true
                    );
                }
            }
 
            return option;
        },
 
        /**
         * @param {module:echarts/model/Global} ecModel
         * @return {Array.<Object>}
         */
        getMediaOption: function (ecModel) {
            var ecWidth = this._api.getWidth();
            var ecHeight = this._api.getHeight();
            var mediaList = this._mediaList;
            var mediaDefault = this._mediaDefault;
            var indices = [];
            var result = [];
 
            // No media defined.
            if (!mediaList.length && !mediaDefault) {
                return result;
            }
 
            // Multi media may be applied, the latter defined media has higher priority.
            for (var i = 0, len = mediaList.length; i < len; i++) {
                if (applyMediaQuery(mediaList[i].query, ecWidth, ecHeight)) {
                    indices.push(i);
                }
            }
 
            // FIXME
            // 是否mediaDefault应该强制用户设置,否则可能修改不能回归。
            if (!indices.length && mediaDefault) {
                indices = [-1];
            }
 
            if (indices.length && !indicesEquals(indices, this._currentMediaIndices)) {
                result = map(indices, function (index) {
                    return clone(
                        index === -1 ? mediaDefault.option : mediaList[index].option
                    );
                });
            }
            // Otherwise return nothing.
 
            this._currentMediaIndices = indices;
 
            return result;
        }
    };
 
    function parseRawOption(rawOption, optionPreprocessorFuncs, isNew) {
        var timelineOptions = [];
        var mediaList = [];
        var mediaDefault;
        var baseOption;
 
        // Compatible with ec2.
        var timelineOpt = rawOption.timeline;
 
        if (rawOption.baseOption) {
            baseOption = rawOption.baseOption;
        }
 
        // For timeline
        if (timelineOpt || rawOption.options) {
            baseOption = baseOption || {};
            timelineOptions = (rawOption.options || []).slice();
        }
 
        // For media query
        if (rawOption.media) {
            baseOption = baseOption || {};
            var media = rawOption.media;
            each(media, function (singleMedia) {
                if (singleMedia && singleMedia.option) {
                    if (singleMedia.query) {
                        mediaList.push(singleMedia);
                    }
                    else if (!mediaDefault) {
                        // Use the first media default.
                        mediaDefault = singleMedia;
                    }
                }
            });
        }
 
        // For normal option
        if (!baseOption) {
            baseOption = rawOption;
        }
 
        // Set timelineOpt to baseOption in ec3,
        // which is convenient for merge option.
        if (!baseOption.timeline) {
            baseOption.timeline = timelineOpt;
        }
 
        // Preprocess.
        each([baseOption].concat(timelineOptions)
            .concat(zrUtil.map(mediaList, function (media) {
                return media.option;
            })),
            function (option) {
                each(optionPreprocessorFuncs, function (preProcess) {
                    preProcess(option, isNew);
                });
            }
        );
 
        return {
            baseOption: baseOption,
            timelineOptions: timelineOptions,
            mediaDefault: mediaDefault,
            mediaList: mediaList
        };
    }
 
    /**
     * @see <http://www.w3.org/TR/css3-mediaqueries/#media1>
     * Support: width, height, aspectRatio
     * Can use max or min as prefix.
     */
    function applyMediaQuery(query, ecWidth, ecHeight) {
        var realMap = {
            width: ecWidth,
            height: ecHeight,
            aspectratio: ecWidth / ecHeight // lowser case for convenientce.
        };
 
        var applicatable = true;
 
        zrUtil.each(query, function (value, attr) {
            var matched = attr.match(QUERY_REG);
 
            if (!matched || !matched[1] || !matched[2]) {
                return;
            }
 
            var operator = matched[1];
            var realAttr = matched[2].toLowerCase();
 
            if (!compare(realMap[realAttr], value, operator)) {
                applicatable = false;
            }
        });
 
        return applicatable;
    }
 
    function compare(real, expect, operator) {
        if (operator === 'min') {
            return real >= expect;
        }
        else if (operator === 'max') {
            return real <= expect;
        }
        else { // Equals
            return real === expect;
        }
    }
 
    function indicesEquals(indices1, indices2) {
        // indices is always order by asc and has only finite number.
        return indices1.join(',') === indices2.join(',');
    }
 
    /**
     * Consider case:
     * `chart.setOption(opt1);`
     * Then user do some interaction like dataZoom, dataView changing.
     * `chart.setOption(opt2);`
     * Then user press 'reset button' in toolbox.
     *
     * After doing that all of the interaction effects should be reset, the
     * chart should be the same as the result of invoke
     * `chart.setOption(opt1); chart.setOption(opt2);`.
     *
     * Although it is not able ensure that
     * `chart.setOption(opt1); chart.setOption(opt2);` is equivalents to
     * `chart.setOption(merge(opt1, opt2));` exactly,
     * this might be the only simple way to implement that feature.
     *
     * MEMO: We've considered some other approaches:
     * 1. Each model handle its self restoration but not uniform treatment.
     *     (Too complex in logic and error-prone)
     * 2. Use a shadow ecModel. (Performace expensive)
     */
    function mergeOption(oldOption, newOption) {
        newOption = newOption || {};
 
        each(newOption, function (newCptOpt, mainType) {
            if (newCptOpt == null) {
                return;
            }
 
            var oldCptOpt = oldOption[mainType];
 
            if (!ComponentModel.hasClass(mainType)) {
                oldOption[mainType] = merge(oldCptOpt, newCptOpt, true);
            }
            else {
                newCptOpt = modelUtil.normalizeToArray(newCptOpt);
                oldCptOpt = modelUtil.normalizeToArray(oldCptOpt);
 
                var mapResult = modelUtil.mappingToExists(oldCptOpt, newCptOpt);
 
                oldOption[mainType] = map(mapResult, function (item) {
                    return (item.option && item.exist)
                        ? merge(item.exist, item.option, true)
                        : (item.exist || item.option);
                });
            }
        });
    }
 
    module.exports = OptionManager;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/Series.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/Series.js

Statements: 18.68% (17 / 91)      Branches: 0% (0 / 57)      Functions: 0% (0 / 17)      Lines: 18.68% (17 / 91)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329      1 1 1 1 1 1 1 1   1 1 1 1   1                                                                                                                                                                                                                                                                                                                                                                                                             1                                                                                                                                                                                                                     1 1   1    
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
    var formatUtil = require('../util/format');
    var classUtil = require('../util/clazz');
    var modelUtil = require('../util/model');
    var ComponentModel = require('./Component');
    var colorPaletteMixin = require('./mixin/colorPalette');
    var env = require('zrender/lib/core/env');
    var layout = require('../util/layout');
 
    var set = classUtil.set;
    var get = classUtil.get;
    var encodeHTML = formatUtil.encodeHTML;
    var addCommas = formatUtil.addCommas;
 
    var SeriesModel = ComponentModel.extend({
 
        type: 'series.__base__',
 
        /**
         * @readOnly
         */
        seriesIndex: 0,
 
        // coodinateSystem will be injected in the echarts/CoordinateSystem
        coordinateSystem: null,
 
        /**
         * @type {Object}
         * @protected
         */
        defaultOption: null,
 
        /**
         * Data provided for legend
         * @type {Function}
         */
        // PENDING
        legendDataProvider: null,
 
        /**
         * Access path of color for visual
         */
        visualColorAccessPath: 'itemStyle.normal.color',
 
        /**
         * Support merge layout params.
         * Only support 'box' now (left/right/top/bottom/width/height).
         * @type {string|Object} Object can be {ignoreSize: true}
         * @readOnly
         */
        layoutMode: null,
 
        init: function (option, parentModel, ecModel, extraOpt) {
 
            /**
             * @type {number}
             * @readOnly
             */
            this.seriesIndex = this.componentIndex;
 
            this.mergeDefaultAndTheme(option, ecModel);
 
            var data = this.getInitialData(option, ecModel);
            if (__DEV__) {
                zrUtil.assert(data, 'getInitialData returned invalid data.');
            }
            /**
             * @type {module:echarts/data/List|module:echarts/data/Tree|module:echarts/data/Graph}
             * @private
             */
            set(this, 'dataBeforeProcessed', data);
 
            // If we reverse the order (make data firstly, and then make
            // dataBeforeProcessed by cloneShallow), cloneShallow will
            // cause data.graph.data !== data when using
            // module:echarts/data/Graph or module:echarts/data/Tree.
            // See module:echarts/data/helper/linkList
            this.restoreData();
        },
 
        /**
         * Util for merge default and theme to option
         * @param  {Object} option
         * @param  {module:echarts/model/Global} ecModel
         */
        mergeDefaultAndTheme: function (option, ecModel) {
            var layoutMode = this.layoutMode;
            var inputPositionParams = layoutMode
                ? layout.getLayoutParams(option) : {};
 
            zrUtil.merge(
                option,
                ecModel.getTheme().get(this.subType)
            );
            zrUtil.merge(option, this.getDefaultOption());
 
            // Default label emphasis `position` and `show`
            // FIXME Set label in mergeOption
            modelUtil.defaultEmphasis(option.label, modelUtil.LABEL_OPTIONS);
 
            this.fillDataTextStyle(option.data);
 
            if (layoutMode) {
                layout.mergeLayoutParam(option, inputPositionParams, layoutMode);
            }
        },
 
        mergeOption: function (newSeriesOption, ecModel) {
            newSeriesOption = zrUtil.merge(this.option, newSeriesOption, true);
            this.fillDataTextStyle(newSeriesOption.data);
 
            var layoutMode = this.layoutMode;
            if (layoutMode) {
                layout.mergeLayoutParam(this.option, newSeriesOption, layoutMode);
            }
 
            var data = this.getInitialData(newSeriesOption, ecModel);
            // TODO Merge data?
            if (data) {
                set(this, 'data', data);
                set(this, 'dataBeforeProcessed', data.cloneShallow());
            }
        },
 
        fillDataTextStyle: function (data) {
            // Default data label emphasis `position` and `show`
            // FIXME Tree structure data ?
            // FIXME Performance ?
            if (data) {
                for (var i = 0; i < data.length; i++) {
                    if (data[i] && data[i].label) {
                        modelUtil.defaultEmphasis(data[i].label, modelUtil.LABEL_OPTIONS);
                    }
                }
            }
        },
 
        /**
         * Init a data structure from data related option in series
         * Must be overwritten
         */
        getInitialData: function () {},
 
        /**
         * @param {string} [dataType]
         * @return {module:echarts/data/List}
         */
        getData: function (dataType) {
            var data = get(this, 'data');
            return dataType == null ? data : data.getLinkedData(dataType);
        },
 
        /**
         * @param {module:echarts/data/List} data
         */
        setData: function (data) {
            set(this, 'data', data);
        },
 
        /**
         * Get data before processed
         * @return {module:echarts/data/List}
         */
        getRawData: function () {
            return get(this, 'dataBeforeProcessed');
        },
 
        /**
         * Coord dimension to data dimension.
         *
         * By default the result is the same as dimensions of series data.
         * But in some series data dimensions are different from coord dimensions (i.e.
         * candlestick and boxplot). Override this method to handle those cases.
         *
         * Coord dimension to data dimension can be one-to-many
         *
         * @param {string} coordDim
         * @return {Array.<string>} dimensions on the axis.
         */
        coordDimToDataDim: function (coordDim) {
            return [coordDim];
        },
 
        /**
         * Convert data dimension to coord dimension.
         *
         * @param {string|number} dataDim
         * @return {string}
         */
        dataDimToCoordDim: function (dataDim) {
            return dataDim;
        },
 
        /**
         * Get base axis if has coordinate system and has axis.
         * By default use coordSys.getBaseAxis();
         * Can be overrided for some chart.
         * @return {type} description
         */
        getBaseAxis: function () {
            var coordSys = this.coordinateSystem;
            return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis();
        },
 
        // FIXME
        /**
         * Default tooltip formatter
         *
         * @param {number} dataIndex
         * @param {boolean} [multipleSeries=false]
         * @param {number} [dataType]
         */
        formatTooltip: function (dataIndex, multipleSeries, dataType) {
            function formatArrayValue(value) {
                var result = [];
 
                zrUtil.each(value, function (val, idx) {
                    var dimInfo = data.getDimensionInfo(idx);
                    var dimType = dimInfo && dimInfo.type;
                    var valStr;
 
                    if (dimType === 'ordinal') {
                        valStr = val + '';
                    }
                    else if (dimType === 'time') {
                        valStr = multipleSeries ? '' : formatUtil.formatTime('yyyy/MM/dd hh:mm:ss', val);
                    }
                    else {
                        valStr = addCommas(val);
                    }
 
                    valStr && result.push(valStr);
                });
 
                return result.join(', ');
            }
 
            var data = get(this, 'data');
 
            var value = this.getRawValue(dataIndex);
            var formattedValue = encodeHTML(
                zrUtil.isArray(value) ? formatArrayValue(value) : addCommas(value)
            );
            var name = data.getName(dataIndex);
 
            var color = data.getItemVisual(dataIndex, 'color');
            if (zrUtil.isObject(color) && color.colorStops) {
                color = (color.colorStops[0] || {}).color;
            }
            color = color || 'transparent';
 
            var colorEl = '<span style="display:inline-block;margin-right:5px;'
                + 'border-radius:10px;width:9px;height:9px;background-color:' + encodeHTML(color) + '"></span>';
 
            var seriesName = this.name;
            // FIXME
            if (seriesName === '\0-') {
                // Not show '-'
                seriesName = '';
            }
            return !multipleSeries
                ? ((seriesName && encodeHTML(seriesName) + '<br />') + colorEl
                    + (name
                        ? encodeHTML(name) + ' : ' + formattedValue
                        : formattedValue
                    )
                  )
                : (colorEl + encodeHTML(this.name) + ' : ' + formattedValue);
        },
 
        /**
         * @return {boolean}
         */
        isAnimationEnabled: function () {
            if (env.node) {
                return false;
            }
 
            var animationEnabled = this.getShallow('animation');
            if (animationEnabled) {
                if (this.getData().count() > this.getShallow('animationThreshold')) {
                    animationEnabled = false;
                }
            }
            return animationEnabled;
        },
 
        restoreData: function () {
            set(this, 'data', get(this, 'dataBeforeProcessed').cloneShallow());
        },
 
        getColorFromPalette: function (name, scope) {
            var ecModel = this.ecModel;
            // PENDING
            var color = colorPaletteMixin.getColorFromPalette.call(this, name, scope);
            if (!color) {
                color = ecModel.getColorFromPalette(name, scope);
            }
            return color;
        },
 
        /**
         * Get data indices for show tooltip content. See tooltip.
         * @abstract
         * @param {Array.<string>|string} dim
         * @param {Array.<number>} value
         * @param {module:echarts/coord/single/SingleAxis} baseAxis
         * @return {Object} {dataIndices, nestestValue}.
         */
        getAxisTooltipData: null,
 
        /**
         * See tooltip.
         * @abstract
         * @param {number} dataIndex
         * @return {Array.<number>} Point of tooltip. null/undefined can be returned.
         */
        getTooltipPosition: null
    });
 
    zrUtil.mixin(SeriesModel, modelUtil.dataFormatMixin);
    zrUtil.mixin(SeriesModel, colorPaletteMixin);
 
    module.exports = SeriesModel;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/globalDefault.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/globalDefault.js

Statements: 75% (3 / 4)      Branches: 33.33% (2 / 6)      Functions: 100% (0 / 0)      Lines: 75% (3 / 4)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60  1   1     1                                                                                                          
 
    var platform = '';
    // Navigator not exists in node
    Iif (typeof navigator !== 'undefined') {
        platform = navigator.platform || '';
    }
    module.exports = {
        // 全图默认背景
        // backgroundColor: 'rgba(0,0,0,0)',
 
        // https://dribbble.com/shots/1065960-Infographic-Pie-chart-visualization
        // color: ['#5793f3', '#d14a61', '#fd9c35', '#675bba', '#fec42c', '#dd4444', '#d4df5a', '#cd4870'],
        // 浅色
        // color: ['#bcd3bb', '#e88f70', '#edc1a5', '#9dc5c8', '#e1e8c8', '#7b7c68', '#e5b5b5', '#f0b489', '#928ea8', '#bda29a'],
        // color: ['#cc5664', '#9bd6ec', '#ea946e', '#8acaaa', '#f1ec64', '#ee8686', '#a48dc1', '#5da6bc', '#b9dcae'],
        // 深色
        color: ['#c23531','#2f4554', '#61a0a8', '#d48265', '#91c7ae','#749f83',  '#ca8622', '#bda29a','#6e7074', '#546570', '#c4ccd3'],
 
        // 默认需要 Grid 配置项
        // grid: {},
        // 主题,主题
        textStyle: {
            // color: '#000',
            // decoration: 'none',
            // PENDING
            fontFamily: platform.match(/^Win/) ? 'Microsoft YaHei' : 'sans-serif',
            // fontFamily: 'Arial, Verdana, sans-serif',
            fontSize: 12,
            fontStyle: 'normal',
            fontWeight: 'normal'
        },
 
        // http://blogs.adobe.com/webplatform/2014/02/24/using-blend-modes-in-html-canvas/
        // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation
        // Default is source-over
        blendMode: null,
 
        animation: 'auto',
        animationDuration: 1000,
        animationDurationUpdate: 300,
        animationEasing: 'exponentialOut',
        animationEasingUpdate: 'cubicOut',
 
        animationThreshold: 2000,
        // Configuration for progressive/incremental rendering
        progressiveThreshold: 3000,
        progressive: 400,
 
        // Threshold of if use single hover layer to optimize.
        // It is recommended that `hoverLayerThreshold` is equivalent to or less than
        // `progressiveThreshold`, otherwise hover will cause restart of progressive,
        // which is unexpected.
        // see example <echarts/test/heatmap-large.html>.
        hoverLayerThreshold: 3000,
 
        // See: module:echarts/scale/Time
        useUTC: false
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/mixin/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/mixin/

Statements: 27.94% (19 / 68)      Branches: 3.39% (2 / 59)      Functions: 7.14% (1 / 14)      Lines: 27.94% (19 / 68)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/model/mixin/
File Statements Branches Functions Lines
areaStyle.js 100% (1 / 1) 100% (0 / 0) 100% (0 / 0) 100% (1 / 1)
boxLayout.js 50% (1 / 2) 100% (0 / 0) 0% (0 / 1) 50% (1 / 2)
colorPalette.js 21.05% (4 / 19) 0% (0 / 14) 0% (0 / 2) 21.05% (4 / 19)
itemStyle.js 25% (2 / 8) 0% (0 / 8) 0% (0 / 2) 25% (2 / 8)
lineStyle.js 16.67% (2 / 12) 0% (0 / 10) 0% (0 / 2) 16.67% (2 / 12)
makeStyleMapper.js 40% (6 / 15) 20% (2 / 10) 50% (1 / 2) 40% (6 / 15)
textStyle.js 27.27% (3 / 11) 0% (0 / 17) 0% (0 / 5) 27.27% (3 / 11)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/mixin/areaStyle.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/mixin/areaStyle.js

Statements: 100% (1 / 1)      Branches: 100% (0 / 0)      Functions: 100% (0 / 0)      Lines: 100% (1 / 1)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  1                          
 
    module.exports = {
        getAreaStyle: require('./makeStyleMapper')(
            [
                ['fill', 'color'],
                ['shadowBlur'],
                ['shadowOffsetX'],
                ['shadowOffsetY'],
                ['opacity'],
                ['shadowColor']
            ]
        )
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/mixin/boxLayout.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/mixin/boxLayout.js

Statements: 50% (1 / 2)      Branches: 100% (0 / 0)      Functions: 0% (0 / 1)      Lines: 50% (1 / 2)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16    1                          
 
 
    module.exports = {
        getBoxLayoutParams: function () {
            return {
                left: this.get('left'),
                top: this.get('top'),
                right: this.get('right'),
                bottom: this.get('bottom'),
                width: this.get('width'),
                height: this.get('height')
            };
        }
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/mixin/colorPalette.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/mixin/colorPalette.js

Statements: 21.05% (4 / 19)      Branches: 0% (0 / 14)      Functions: 0% (0 / 2)      Lines: 21.05% (4 / 19)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35    1 1 1   1                                                        
 
 
    var classUtil = require('../../util/clazz');
    var set = classUtil.set;
    var get = classUtil.get;
 
    module.exports = {
        clearColorPalette: function () {
            set(this, 'colorIdx', 0);
            set(this, 'colorNameMap', {});
        },
 
        getColorFromPalette: function (name, scope) {
            scope = scope || this;
            var colorIdx = get(scope, 'colorIdx') || 0;
            var colorNameMap = get(scope, 'colorNameMap') || set(scope, 'colorNameMap', {});
            if (colorNameMap[name]) {
                return colorNameMap[name];
            }
            var colorPalette = this.get('color', true) || [];
            if (!colorPalette.length) {
                return;
            }
 
            var color = colorPalette[colorIdx];
            if (name) {
                colorNameMap[name] = color;
            }
            set(scope, 'colorIdx', (colorIdx + 1) % colorPalette.length);
 
            return color;
        }
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/mixin/itemStyle.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/mixin/itemStyle.js

Statements: 25% (2 / 8)      Branches: 0% (0 / 8)      Functions: 0% (0 / 2)      Lines: 25% (2 / 8)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31  1                           1                              
 
    var getItemStyle = require('./makeStyleMapper')(
        [
            ['fill', 'color'],
            ['stroke', 'borderColor'],
            ['lineWidth', 'borderWidth'],
            ['opacity'],
            ['shadowBlur'],
            ['shadowOffsetX'],
            ['shadowOffsetY'],
            ['shadowColor'],
            ['textPosition'],
            ['textAlign']
        ]
    );
    module.exports = {
        getItemStyle: function (excludes, includes) {
            var style = getItemStyle.call(this, excludes, includes);
            var lineDash = this.getBorderLineDash();
            lineDash && (style.lineDash = lineDash);
            return style;
        },
 
        getBorderLineDash: function () {
            var lineType = this.get('borderType');
            return (lineType === 'solid' || lineType == null) ? null
                : (lineType === 'dashed' ? [5, 5] : [1, 1]);
        }
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/mixin/lineStyle.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/mixin/lineStyle.js

Statements: 16.67% (2 / 12)      Branches: 0% (0 / 10)      Functions: 0% (0 / 2)      Lines: 16.67% (2 / 12)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33  1                     1                                        
 
    var getLineStyle = require('./makeStyleMapper')(
        [
            ['lineWidth', 'width'],
            ['stroke', 'color'],
            ['opacity'],
            ['shadowBlur'],
            ['shadowOffsetX'],
            ['shadowOffsetY'],
            ['shadowColor']
        ]
    );
    module.exports = {
        getLineStyle: function (excludes) {
            var style = getLineStyle.call(this, excludes);
            var lineDash = this.getLineDash(style.lineWidth);
            lineDash && (style.lineDash = lineDash);
            return style;
        },
 
        getLineDash: function (lineWidth) {
            if (lineWidth == null) {
                lineWidth = 1;
            }
            var lineType = this.get('type');
            var dotSize = Math.max(lineWidth, 2);
            var dashSize = lineWidth * 4;
            return (lineType === 'solid' || lineType == null) ? null
                : (lineType === 'dashed' ? [dashSize, dashSize] : [dotSize, dotSize]);
        }
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/mixin/makeStyleMapper.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/mixin/makeStyleMapper.js

Statements: 40% (6 / 15)      Branches: 20% (2 / 10)      Functions: 50% (1 / 2)      Lines: 40% (6 / 15)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31      1   1   4 33 22     4                                    
// TODO Parse shadow style
// TODO Only shallow path support
 
    var zrUtil = require('zrender/lib/core/util');
 
    module.exports = function (properties) {
        // Normalize
        for (var i = 0; i < properties.length; i++) {
            if (!properties[i][1]) {
               properties[i][1] = properties[i][0];
            }
        }
        return function (excludes, includes) {
            var style = {};
            for (var i = 0; i < properties.length; i++) {
                var propName = properties[i][1];
                if ((excludes && zrUtil.indexOf(excludes, propName) >= 0)
                    || (includes && zrUtil.indexOf(includes, propName) < 0)
                ) {
                    continue;
                }
                var val = this.getShallow(propName);
                if (val != null) {
                    style[properties[i][0]] = val;
                }
            }
            return style;
        };
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/mixin/textStyle.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/model/mixin/textStyle.js

Statements: 27.27% (3 / 11)      Branches: 0% (0 / 17)      Functions: 0% (0 / 5)      Lines: 27.27% (3 / 11)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52    1   1       1                                                                                      
 
 
    var textContain = require('zrender/lib/contain/text');
 
    function getShallow(model, path) {
        return model && model.getShallow(path);
    }
 
    module.exports = {
        /**
         * Get color property or get color from option.textStyle.color
         * @return {string}
         */
        getTextColor: function () {
            var ecModel = this.ecModel;
            return this.getShallow('color')
                || (ecModel && ecModel.get('textStyle.color'));
        },
 
        /**
         * Create font string from fontStyle, fontWeight, fontSize, fontFamily
         * @return {string}
         */
        getFont: function () {
            var ecModel = this.ecModel;
            var gTextStyleModel = ecModel && ecModel.getModel('textStyle');
            return [
                // FIXME in node-canvas fontWeight is before fontStyle
                this.getShallow('fontStyle') || getShallow(gTextStyleModel, 'fontStyle'),
                this.getShallow('fontWeight') || getShallow(gTextStyleModel, 'fontWeight'),
                (this.getShallow('fontSize') || getShallow(gTextStyleModel, 'fontSize') || 12) + 'px',
                this.getShallow('fontFamily') || getShallow(gTextStyleModel, 'fontFamily') || 'sans-serif'
            ].join(' ');
        },
 
        getTextRect: function (text) {
            return textContain.getBoundingRect(
                text,
                this.getFont(),
                this.getShallow('align'),
                this.getShallow('baseline')
            );
        },
 
        truncateText: function (text, containerWidth, ellipsis, options) {
            return textContain.truncateText(
                text, containerWidth, this.getFont(), ellipsis, options
            );
        }
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/preprocessor/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/preprocessor/

Statements: 18.52% (10 / 54)      Branches: 0% (0 / 34)      Functions: 0% (0 / 8)      Lines: 18.52% (10 / 54)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/preprocessor/
File Statements Branches Functions Lines
backwardCompat.js 18.52% (10 / 54) 0% (0 / 34) 0% (0 / 8) 18.52% (10 / 54)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/preprocessor/backwardCompat.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/preprocessor/backwardCompat.js

Statements: 18.52% (10 / 54)      Branches: 0% (0 / 34)      Functions: 0% (0 / 8)      Lines: 18.52% (10 / 54)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106      1 1   1                       1                               1               1       1       1           1   1                                                                                              
// Compatitable with 2.0
 
 
    var zrUtil = require('zrender/lib/core/util');
    var compatStyle = require('./helper/compatStyle');
 
    function get(opt, path) {
        path = path.split(',');
        var obj = opt;
        for (var i = 0; i < path.length; i++) {
            obj = obj && obj[path[i]];
            if (obj == null) {
                break;
            }
        }
        return obj;
    }
 
    function set(opt, path, val, overwrite) {
        path = path.split(',');
        var obj = opt;
        var key;
        for (var i = 0; i < path.length - 1; i++) {
            key = path[i];
            if (obj[key] == null) {
                obj[key] = {};
            }
            obj = obj[key];
        }
        if (overwrite || obj[path[i]] == null) {
            obj[path[i]] = val;
        }
    }
 
    function compatLayoutProperties(option) {
        each(LAYOUT_PROPERTIES, function (prop) {
            if (prop[0] in option && !(prop[1] in option)) {
                option[prop[1]] = option[prop[0]];
            }
        });
    }
 
    var LAYOUT_PROPERTIES = [
        ['x', 'left'], ['y', 'top'], ['x2', 'right'], ['y2', 'bottom']
    ];
 
    var COMPATITABLE_COMPONENTS = [
        'grid', 'geo', 'parallel', 'legend', 'toolbox', 'title', 'visualMap', 'dataZoom', 'timeline'
    ];
 
    var COMPATITABLE_SERIES = [
        'bar', 'boxplot', 'candlestick', 'chord', 'effectScatter',
        'funnel', 'gauge', 'lines', 'graph', 'heatmap', 'line', 'map', 'parallel',
        'pie', 'radar', 'sankey', 'scatter', 'treemap'
    ];
 
    var each = zrUtil.each;
 
    module.exports = function (option) {
        each(option.series, function (seriesOpt) {
            if (!zrUtil.isObject(seriesOpt)) {
                return;
            }
 
            var seriesType = seriesOpt.type;
 
            compatStyle(seriesOpt);
 
            if (seriesType === 'pie' || seriesType === 'gauge') {
                if (seriesOpt.clockWise != null) {
                    seriesOpt.clockwise = seriesOpt.clockWise;
                }
            }
            if (seriesType === 'gauge') {
                var pointerColor = get(seriesOpt, 'pointer.color');
                pointerColor != null
                    && set(seriesOpt, 'itemStyle.normal.color', pointerColor);
            }
 
            for (var i = 0; i < COMPATITABLE_SERIES.length; i++) {
                if (COMPATITABLE_SERIES[i] === seriesOpt.type) {
                    compatLayoutProperties(seriesOpt);
                    break;
                }
            }
        });
 
        // dataRange has changed to visualMap
        if (option.dataRange) {
            option.visualMap = option.dataRange;
        }
 
        each(COMPATITABLE_COMPONENTS, function (componentName) {
            var options = option[componentName];
            if (options) {
                if (!zrUtil.isArray(options)) {
                    options = [options];
                }
                each(options, function (option) {
                    compatLayoutProperties(option);
                });
            }
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/preprocessor/helper/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/preprocessor/helper/

Statements: 9.3% (4 / 43)      Branches: 0% (0 / 34)      Functions: 0% (0 / 3)      Lines: 9.3% (4 / 43)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/preprocessor/helper/
File Statements Branches Functions Lines
compatStyle.js 9.3% (4 / 43) 0% (0 / 34) 0% (0 / 3) 9.3% (4 / 43)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/preprocessor/helper/compatStyle.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/preprocessor/helper/compatStyle.js

Statements: 9.3% (4 / 43)      Branches: 0% (0 / 34)      Functions: 0% (0 / 3)      Lines: 9.3% (4 / 43)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77    1   1         1                                                           1                                                                          
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    var POSSIBLE_STYLES = [
        'areaStyle', 'lineStyle', 'nodeStyle', 'linkStyle',
        'chordStyle', 'label', 'labelLine'
    ];
 
    function compatItemStyle(opt) {
        var itemStyleOpt = opt && opt.itemStyle;
        if (itemStyleOpt) {
            zrUtil.each(POSSIBLE_STYLES, function (styleName) {
                var normalItemStyleOpt = itemStyleOpt.normal;
                var emphasisItemStyleOpt = itemStyleOpt.emphasis;
                if (normalItemStyleOpt && normalItemStyleOpt[styleName]) {
                    opt[styleName] = opt[styleName] || {};
                    if (!opt[styleName].normal) {
                        opt[styleName].normal = normalItemStyleOpt[styleName];
                    }
                    else {
                        zrUtil.merge(opt[styleName].normal, normalItemStyleOpt[styleName]);
                    }
                    normalItemStyleOpt[styleName] = null;
                }
                if (emphasisItemStyleOpt && emphasisItemStyleOpt[styleName]) {
                    opt[styleName] = opt[styleName] || {};
                    if (!opt[styleName].emphasis) {
                        opt[styleName].emphasis = emphasisItemStyleOpt[styleName];
                    }
                    else {
                        zrUtil.merge(opt[styleName].emphasis, emphasisItemStyleOpt[styleName]);
                    }
                    emphasisItemStyleOpt[styleName] = null;
                }
            });
        }
    }
 
    module.exports = function (seriesOpt) {
        if (!seriesOpt) {
            return;
        }
        compatItemStyle(seriesOpt);
        compatItemStyle(seriesOpt.markPoint);
        compatItemStyle(seriesOpt.markLine);
        var data = seriesOpt.data;
        if (data) {
            for (var i = 0; i < data.length; i++) {
                compatItemStyle(data[i]);
            }
            // mark point data
            var markPoint = seriesOpt.markPoint;
            if (markPoint && markPoint.data) {
                var mpData = markPoint.data;
                for (var i = 0; i < mpData.length; i++) {
                    compatItemStyle(mpData[i]);
                }
            }
            // mark line data
            var markLine = seriesOpt.markLine;
            if (markLine && markLine.data) {
                var mlData = markLine.data;
                for (var i = 0; i < mlData.length; i++) {
                    if (zrUtil.isArray(mlData[i])) {
                        compatItemStyle(mlData[i][0]);
                        compatItemStyle(mlData[i][1]);
                    }
                    else {
                        compatItemStyle(mlData[i]);
                    }
                }
            }
        }
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/processor/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/processor/

Statements: 7.27% (4 / 55)      Branches: 0% (0 / 28)      Functions: 0% (0 / 11)      Lines: 7.27% (4 / 55)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/processor/
File Statements Branches Functions Lines
dataFilter.js 8.33% (1 / 12) 0% (0 / 6) 0% (0 / 3) 8.33% (1 / 12)
dataSample.js 6.98% (3 / 43) 0% (0 / 22) 0% (0 / 8) 6.98% (3 / 43)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/processor/dataFilter.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/processor/dataFilter.js

Statements: 8.33% (1 / 12)      Branches: 0% (0 / 6)      Functions: 0% (0 / 3)      Lines: 8.33% (1 / 12)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24  1                                            
 
    module.exports = function (seriesType, ecModel) {
        var legendModels = ecModel.findComponents({
            mainType: 'legend'
        });
        if (!legendModels || !legendModels.length) {
            return;
        }
        ecModel.eachSeriesByType(seriesType, function (series) {
            var data = series.getData();
            data.filterSelf(function (idx) {
                var name = data.getName(idx);
                // If in any legend component the status is not selected.
                for (var i = 0; i < legendModels.length; i++) {
                    if (!legendModels[i].isSelected(name)) {
                        return false;
                    }
                }
                return true;
            }, this);
        }, this);
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/processor/dataSample.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/processor/dataSample.js

Statements: 6.98% (3 / 43)      Branches: 0% (0 / 22)      Functions: 0% (0 / 8)      Lines: 6.98% (3 / 43)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79  1                                                                                   1     1                                                                
 
    var samplers = {
        average: function (frame) {
            var sum = 0;
            var count = 0;
            for (var i = 0; i < frame.length; i++) {
                if (!isNaN(frame[i])) {
                    sum += frame[i];
                    count++;
                }
            }
            // Return NaN if count is 0
            return count === 0 ? NaN : sum / count;
        },
        sum: function (frame) {
            var sum = 0;
            for (var i = 0; i < frame.length; i++) {
                // Ignore NaN
                sum += frame[i] || 0;
            }
            return sum;
        },
        max: function (frame) {
            var max = -Infinity;
            for (var i = 0; i < frame.length; i++) {
                frame[i] > max && (max = frame[i]);
            }
            return max;
        },
        min: function (frame) {
            var min = Infinity;
            for (var i = 0; i < frame.length; i++) {
                frame[i] < min && (min = frame[i]);
            }
            return min;
        },
        // TODO
        // Median
        nearest: function (frame) {
            return frame[0];
        }
    };
 
    var indexSampler = function (frame, value) {
        return Math.round(frame.length / 2);
    };
    module.exports = function (seriesType, ecModel, api) {
        ecModel.eachSeriesByType(seriesType, function (seriesModel) {
            var data = seriesModel.getData();
            var sampling = seriesModel.get('sampling');
            var coordSys = seriesModel.coordinateSystem;
            // Only cartesian2d support down sampling
            if (coordSys.type === 'cartesian2d' && sampling) {
                var baseAxis = coordSys.getBaseAxis();
                var valueAxis = coordSys.getOtherAxis(baseAxis);
                var extent = baseAxis.getExtent();
                // Coordinste system has been resized
                var size = extent[1] - extent[0];
                var rate = Math.round(data.count() / size);
                if (rate > 1) {
                    var sampler;
                    if (typeof sampling === 'string') {
                        sampler = samplers[sampling];
                    }
                    else if (typeof sampling === 'function') {
                        sampler = sampling;
                    }
                    if (sampler) {
                        data = data.downSample(
                            valueAxis.dim, 1 / rate, sampler, indexSampler
                        );
                        seriesModel.setData(data);
                    }
                }
            }
        }, this);
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/scale/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/scale/

Statements: 23.97% (76 / 317)      Branches: 0% (0 / 121)      Functions: 3.33% (2 / 60)      Lines: 23.97% (76 / 317)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/scale/
File Statements Branches Functions Lines
Interval.js 11.27% (8 / 71) 0% (0 / 40) 0% (0 / 10) 11.27% (8 / 71)
Log.js 25% (18 / 72) 0% (0 / 23) 6.67% (1 / 15) 25% (18 / 72)
Ordinal.js 25% (6 / 24) 0% (0 / 6) 0% (0 / 10) 25% (6 / 24)
Scale.js 35.42% (17 / 48) 0% (0 / 16) 0% (0 / 13) 35.42% (17 / 48)
Time.js 30.16% (19 / 63) 0% (0 / 18) 12.5% (1 / 8) 30.16% (19 / 63)
helper.js 20.51% (8 / 39) 0% (0 / 18) 0% (0 / 4) 20.51% (8 / 39)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/scale/Interval.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/scale/Interval.js

Statements: 11.27% (8 / 71)      Branches: 0% (0 / 40)      Functions: 0% (0 / 10)      Lines: 11.27% (8 / 71)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206              1 1 1 1   1           1                                                                                                                                                                                                                                                                                                                                                                       1       1      
/**
 * Interval scale
 * @module echarts/scale/Interval
 */
 
 
 
    var numberUtil = require('../util/number');
    var formatUtil = require('../util/format');
    var Scale = require('./Scale');
    var helper = require('./helper');
 
    var roundNumber = numberUtil.round;
 
    /**
     * @alias module:echarts/coord/scale/Interval
     * @constructor
     */
    var IntervalScale = Scale.extend({
 
        type: 'interval',
 
        _interval: 0,
 
        _intervalPrecision: 2,
 
        setExtent: function (start, end) {
            var thisExtent = this._extent;
            //start,end may be a Number like '25',so...
            if (!isNaN(start)) {
                thisExtent[0] = parseFloat(start);
            }
            if (!isNaN(end)) {
                thisExtent[1] = parseFloat(end);
            }
        },
 
        unionExtent: function (other) {
            var extent = this._extent;
            other[0] < extent[0] && (extent[0] = other[0]);
            other[1] > extent[1] && (extent[1] = other[1]);
 
            // unionExtent may called by it's sub classes
            IntervalScale.prototype.setExtent.call(this, extent[0], extent[1]);
        },
        /**
         * Get interval
         */
        getInterval: function () {
            if (!this._interval) {
                this.niceTicks();
            }
            return this._interval;
        },
 
        /**
         * Set interval
         */
        setInterval: function (interval) {
            this._interval = interval;
            // Dropped auto calculated niceExtent and use user setted extent
            // We assume user wan't to set both interval, min, max to get a better result
            this._niceExtent = this._extent.slice();
        },
 
        /**
         * @return {Array.<number>}
         */
        getTicks: function () {
            if (!this._interval) {
                this.niceTicks();
            }
            return helper.intervalScaleGetTicks(
                this._interval, this._extent, this._niceExtent, this._intervalPrecision
            );
        },
 
        /**
         * @return {Array.<string>}
         */
        getTicksLabels: function () {
            var labels = [];
            var ticks = this.getTicks();
            for (var i = 0; i < ticks.length; i++) {
                labels.push(this.getLabel(ticks[i]));
            }
            return labels;
        },
 
        /**
         * @param {number} data
         * @param {Object} [opt]
         * @param {number|string} [opt.precision] If 'auto', use nice presision.
         * @param {boolean} [opt.pad] returns 1.50 but not 1.5 if precision is 2.
         * @return {string}
         */
        getLabel: function (data, opt) {
            if (data == null) {
                return '';
            }
 
            var precision = opt && opt.precision;
 
            if (precision == null) {
                precision = numberUtil.getPrecisionSafe(data) || 0;
            }
            else if (precision === 'auto') {
                // Should be more precise then tick.
                precision = this._intervalPrecision;
            }
 
            // (1) If `precision` is set, 12.005 should be display as '12.00500'.
            // (2) Use roundNumber (toFixed) to avoid scientific notation like '3.5e-7'.
            data = roundNumber(data, precision, true);
 
            return formatUtil.addCommas(data);
        },
 
        /**
         * Update interval and extent of intervals for nice ticks
         *
         * @param {number} [splitNumber = 5] Desired number of ticks
         */
        niceTicks: function (splitNumber) {
            splitNumber = splitNumber || 5;
            var extent = this._extent;
            var span = extent[1] - extent[0];
            if (!isFinite(span)) {
                return;
            }
            // User may set axis min 0 and data are all negative
            // FIXME If it needs to reverse ?
            if (span < 0) {
                span = -span;
                extent.reverse();
            }
 
            var result = helper.intervalScaleNiceTicks(extent, splitNumber);
 
            this._intervalPrecision = result.intervalPrecision;
            this._interval = result.interval;
            this._niceExtent = result.niceTickExtent;
        },
 
        /**
         * Nice extent.
         * @param {number} [splitNumber = 5] Given approx tick number
         * @param {boolean} [fixMin=false]
         * @param {boolean} [fixMax=false]
         */
        niceExtent: function (splitNumber, fixMin, fixMax) {
            var extent = this._extent;
            // If extent start and end are same, expand them
            if (extent[0] === extent[1]) {
                if (extent[0] !== 0) {
                    // Expand extent
                    var expandSize = extent[0];
                    // In the fowllowing case
                    //      Axis has been fixed max 100
                    //      Plus data are all 100 and axis extent are [100, 100].
                    // Extend to the both side will cause expanded max is larger than fixed max.
                    // So only expand to the smaller side.
                    if (!fixMax) {
                        extent[1] += expandSize / 2;
                        extent[0] -= expandSize / 2;
                    }
                    else {
                        extent[0] -= expandSize / 2;
                    }
                }
                else {
                    extent[1] = 1;
                }
            }
            var span = extent[1] - extent[0];
            // If there are no data and extent are [Infinity, -Infinity]
            if (!isFinite(span)) {
                extent[0] = 0;
                extent[1] = 1;
            }
 
            this.niceTicks(splitNumber);
 
            // var extent = this._extent;
            var interval = this._interval;
 
            if (!fixMin) {
                extent[0] = roundNumber(Math.floor(extent[0] / interval) * interval);
            }
            if (!fixMax) {
                extent[1] = roundNumber(Math.ceil(extent[1] / interval) * interval);
            }
        }
    });
 
    /**
     * @return {module:echarts/scale/Time}
     */
    IntervalScale.create = function () {
        return new IntervalScale();
    };
 
    module.exports = IntervalScale;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/scale/Log.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/scale/Log.js

Statements: 25% (18 / 72)      Branches: 0% (0 / 23)      Functions: 6.67% (1 / 15)      Lines: 25% (18 / 72)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192            1 1 1     1   1 1   1 1   1 1 1   1   1                                                                                                                                                                                                                                                                                                         1 2           1       1       1    
/**
 * Log scale
 * @module echarts/scale/Log
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
    var Scale = require('./Scale');
    var numberUtil = require('../util/number');
 
    // Use some method of IntervalScale
    var IntervalScale = require('./Interval');
 
    var scaleProto = Scale.prototype;
    var intervalScaleProto = IntervalScale.prototype;
 
    var getPrecisionSafe = numberUtil.getPrecisionSafe;
    var roundingErrorFix = numberUtil.round;
 
    var mathFloor = Math.floor;
    var mathCeil = Math.ceil;
    var mathPow = Math.pow;
 
    var mathLog = Math.log;
 
    var LogScale = Scale.extend({
 
        type: 'log',
 
        base: 10,
 
        $constructor: function () {
            Scale.apply(this, arguments);
            this._originalScale = new IntervalScale();
        },
 
        /**
         * @return {Array.<number>}
         */
        getTicks: function () {
            var originalScale = this._originalScale;
            var extent = this._extent;
            var originalExtent = originalScale.getExtent();
 
            return zrUtil.map(intervalScaleProto.getTicks.call(this), function (val) {
                var powVal = numberUtil.round(mathPow(this.base, val));
 
                // Fix #4158
                powVal = (val === extent[0] && originalScale.__fixMin)
                    ? fixRoundingError(powVal, originalExtent[0])
                    : powVal;
                powVal = (val === extent[1] && originalScale.__fixMax)
                    ? fixRoundingError(powVal, originalExtent[1])
                    : powVal;
 
                return powVal;
            }, this);
        },
 
        /**
         * @param {number} val
         * @return {string}
         */
        getLabel: intervalScaleProto.getLabel,
 
        /**
         * @param  {number} val
         * @return {number}
         */
        scale: function (val) {
            val = scaleProto.scale.call(this, val);
            return mathPow(this.base, val);
        },
 
        /**
         * @param {number} start
         * @param {number} end
         */
        setExtent: function (start, end) {
            var base = this.base;
            start = mathLog(start) / mathLog(base);
            end = mathLog(end) / mathLog(base);
            intervalScaleProto.setExtent.call(this, start, end);
        },
 
        /**
         * @return {number} end
         */
        getExtent: function () {
            var base = this.base;
            var extent = scaleProto.getExtent.call(this);
            extent[0] = mathPow(base, extent[0]);
            extent[1] = mathPow(base, extent[1]);
 
            // Fix #4158
            var originalScale = this._originalScale;
            var originalExtent = originalScale.getExtent();
            originalScale.__fixMin && (extent[0] = fixRoundingError(extent[0], originalExtent[0]));
            originalScale.__fixMax && (extent[1] = fixRoundingError(extent[1], originalExtent[1]));
 
            return extent;
        },
 
        /**
         * @param  {Array.<number>} extent
         */
        unionExtent: function (extent) {
            this._originalScale.unionExtent(extent);
 
            var base = this.base;
            extent[0] = mathLog(extent[0]) / mathLog(base);
            extent[1] = mathLog(extent[1]) / mathLog(base);
            scaleProto.unionExtent.call(this, extent);
        },
 
        /**
         * @override
         */
        unionExtentFromData: function (data, dim) {
            this.unionExtent(data.getDataExtent(dim, true, function (val) {
                return val > 0;
            }));
        },
 
        /**
         * Update interval and extent of intervals for nice ticks
         * @param  {number} [approxTickNum = 10] Given approx tick number
         */
        niceTicks: function (approxTickNum) {
            approxTickNum = approxTickNum || 10;
            var extent = this._extent;
            var span = extent[1] - extent[0];
            if (span === Infinity || span <= 0) {
                return;
            }
 
            var interval = numberUtil.quantity(span);
            var err = approxTickNum / span * interval;
 
            // Filter ticks to get closer to the desired count.
            if (err <= 0.5) {
                interval *= 10;
            }
 
            // Interval should be integer
            while (!isNaN(interval) && Math.abs(interval) < 1 && Math.abs(interval) > 0) {
                interval *= 10;
            }
 
            var niceExtent = [
                numberUtil.round(mathCeil(extent[0] / interval) * interval),
                numberUtil.round(mathFloor(extent[1] / interval) * interval)
            ];
 
            this._interval = interval;
            this._niceExtent = niceExtent;
        },
 
        /**
         * Nice extent.
         * @param {number} [approxTickNum = 10] Given approx tick number
         * @param {boolean} [fixMin=false]
         * @param {boolean} [fixMax=false]
         */
        niceExtent: function (splitNumber, fixMin, fixMax) {
            intervalScaleProto.niceExtent.call(this, splitNumber, fixMin, fixMax);
 
            var originalScale = this._originalScale;
            originalScale.__fixMin = fixMin;
            originalScale.__fixMax = fixMax;
        }
 
    });
 
    zrUtil.each(['contain', 'normalize'], function (methodName) {
        LogScale.prototype[methodName] = function (val) {
            val = mathLog(val) / mathLog(this.base);
            return scaleProto[methodName].call(this, val);
        };
    });
 
    LogScale.create = function () {
        return new LogScale();
    };
 
    function fixRoundingError(val, originalVal) {
        return roundingErrorFix(val, getPrecisionSafe(originalVal));
    }
 
    module.exports = LogScale;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/scale/Ordinal.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/scale/Ordinal.js

Statements: 25% (6 / 24)      Branches: 0% (0 / 6)      Functions: 0% (0 / 10)      Lines: 25% (6 / 24)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103                    1 1   1   1                                                                                                                                                                 1       1    
/**
 * Linear continuous scale
 * @module echarts/coord/scale/Ordinal
 *
 * http://en.wikipedia.org/wiki/Level_of_measurement
 */
 
// FIXME only one data
 
 
    var zrUtil = require('zrender/lib/core/util');
    var Scale = require('./Scale');
 
    var scaleProto = Scale.prototype;
 
    var OrdinalScale = Scale.extend({
 
        type: 'ordinal',
 
        init: function (data, extent) {
            this._data = data;
            this._extent = extent || [0, data.length - 1];
        },
 
        parse: function (val) {
            return typeof val === 'string'
                ? zrUtil.indexOf(this._data, val)
                // val might be float.
                : Math.round(val);
        },
 
        contain: function (rank) {
            rank = this.parse(rank);
            return scaleProto.contain.call(this, rank)
                && this._data[rank] != null;
        },
 
        /**
         * Normalize given rank or name to linear [0, 1]
         * @param {number|string} [val]
         * @return {number}
         */
        normalize: function (val) {
            return scaleProto.normalize.call(this, this.parse(val));
        },
 
        scale: function (val) {
            return Math.round(scaleProto.scale.call(this, val));
        },
 
        /**
         * @return {Array}
         */
        getTicks: function () {
            var ticks = [];
            var extent = this._extent;
            var rank = extent[0];
 
            while (rank <= extent[1]) {
                ticks.push(rank);
                rank++;
            }
 
            return ticks;
        },
 
        /**
         * Get item on rank n
         * @param {number} n
         * @return {string}
         */
        getLabel: function (n) {
            return this._data[n];
        },
 
        /**
         * @return {number}
         */
        count: function () {
            return this._extent[1] - this._extent[0] + 1;
        },
 
        /**
         * @override
         */
        unionExtentFromData: function (data, dim) {
            this.unionExtent(data.getDataExtent(dim, false));
        },
 
        niceTicks: zrUtil.noop,
        niceExtent: zrUtil.noop
    });
 
    /**
     * @return {module:echarts/scale/Time}
     */
    OrdinalScale.create = function () {
        return new OrdinalScale();
    };
 
    module.exports = OrdinalScale;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/scale/Scale.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/scale/Scale.js

Statements: 35.42% (17 / 48)      Branches: 0% (0 / 16)      Functions: 0% (0 / 13)      Lines: 35.42% (17 / 48)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159            1         1                                       1             1               1       1                   1                         1                 1                         1               1                 1                         1                         1                         1 1       1    
/**
 * // Scale class management
 * @module echarts/scale/Scale
 */
 
 
    var clazzUtil = require('../util/clazz');
 
    /**
     * @param {Object} [setting]
     */
    function Scale(setting) {
        this._setting = setting || {};
 
        /**
         * Extent
         * @type {Array.<number>}
         * @protected
         */
        this._extent = [Infinity, -Infinity];
 
        /**
         * Step is calculated in adjustExtent
         * @type {Array.<number>}
         * @protected
         */
        this._interval = 0;
 
        this.init && this.init.apply(this, arguments);
    }
 
    var scaleProto = Scale.prototype;
 
    /**
     * Parse input val to valid inner number.
     * @param {*} val
     * @return {number}
     */
    scaleProto.parse = function (val) {
        // Notice: This would be a trap here, If the implementation
        // of this method depends on extent, and this method is used
        // before extent set (like in dataZoom), it would be wrong.
        // Nevertheless, parse does not depend on extent generally.
        return val;
    };
 
    scaleProto.getSetting = function (name) {
        return this._setting[name];
    };
 
    scaleProto.contain = function (val) {
        var extent = this._extent;
        return val >= extent[0] && val <= extent[1];
    };
 
    /**
     * Normalize value to linear [0, 1], return 0.5 if extent span is 0
     * @param {number} val
     * @return {number}
     */
    scaleProto.normalize = function (val) {
        var extent = this._extent;
        if (extent[1] === extent[0]) {
            return 0.5;
        }
        return (val - extent[0]) / (extent[1] - extent[0]);
    };
 
    /**
     * Scale normalized value
     * @param {number} val
     * @return {number}
     */
    scaleProto.scale = function (val) {
        var extent = this._extent;
        return val * (extent[1] - extent[0]) + extent[0];
    };
 
    /**
     * Set extent from data
     * @param {Array.<number>} other
     */
    scaleProto.unionExtent = function (other) {
        var extent = this._extent;
        other[0] < extent[0] && (extent[0] = other[0]);
        other[1] > extent[1] && (extent[1] = other[1]);
        // not setExtent because in log axis it may transformed to power
        // this.setExtent(extent[0], extent[1]);
    };
 
    /**
     * Set extent from data
     * @param {module:echarts/data/List} data
     * @param {string} dim
     */
    scaleProto.unionExtentFromData = function (data, dim) {
        this.unionExtent(data.getDataExtent(dim, true));
    };
 
    /**
     * Get extent
     * @return {Array.<number>}
     */
    scaleProto.getExtent = function () {
        return this._extent.slice();
    };
 
    /**
     * Set extent
     * @param {number} start
     * @param {number} end
     */
    scaleProto.setExtent = function (start, end) {
        var thisExtent = this._extent;
        if (!isNaN(start)) {
            thisExtent[0] = start;
        }
        if (!isNaN(end)) {
            thisExtent[1] = end;
        }
    };
 
    /**
     * @return {Array.<string>}
     */
    scaleProto.getTicksLabels = function () {
        var labels = [];
        var ticks = this.getTicks();
        for (var i = 0; i < ticks.length; i++) {
            labels.push(this.getLabel(ticks[i]));
        }
        return labels;
    };
 
    /**
     * When axis extent depends on data and no data exists,
     * axis ticks should not be drawn, which is named 'blank'.
     */
    scaleProto.isBlank = function () {
        return this._isBlank;
    },
 
    /**
     * When axis extent depends on data and no data exists,
     * axis ticks should not be drawn, which is named 'blank'.
     */
    scaleProto.setBlank = function (isBlank) {
        this._isBlank = isBlank;
    };
 
 
    clazzUtil.enableClassExtend(Scale);
    clazzUtil.enableClassManagement(Scale, {
        registerWhenExtend: true
    });
 
    module.exports = Scale;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/scale/Time.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/scale/Time.js

Statements: 30.16% (19 / 63)      Branches: 0% (0 / 18)      Functions: 12.5% (1 / 8)      Lines: 30.16% (19 / 63)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178                                  1 1 1 1   1   1   1 1 1 1 1 1     1                                 1                                                                                                                                                                         1 2           1                                                       1       1    
/**
 * Interval scale
 * @module echarts/coord/scale/Time
 */
 
 
 
    // [About UTC and local time zone]:
    // In most cases, `number.parseDate` will treat input data string as local time
    // (except time zone is specified in time string). And `format.formateTime` returns
    // local time by default. option.useUTC is false by default. This design have
    // concidered these common case:
    // (1) Time that is persistent in server is in UTC, but it is needed to be diplayed
    // in local time by default.
    // (2) By default, the input data string (e.g., '2011-01-02') should be displayed
    // as its original time, without any time difference.
 
    var zrUtil = require('zrender/lib/core/util');
    var numberUtil = require('../util/number');
    var formatUtil = require('../util/format');
    var scaleHelper = require('./helper');
 
    var IntervalScale = require('./Interval');
 
    var intervalScaleProto = IntervalScale.prototype;
 
    var mathCeil = Math.ceil;
    var mathFloor = Math.floor;
    var ONE_SECOND = 1000;
    var ONE_MINUTE = ONE_SECOND * 60;
    var ONE_HOUR = ONE_MINUTE * 60;
    var ONE_DAY = ONE_HOUR * 24;
 
    // FIXME 公用?
    var bisect = function (a, x, lo, hi) {
        while (lo < hi) {
            var mid = lo + hi >>> 1;
            if (a[mid][2] < x) {
                lo = mid + 1;
            }
            else {
                hi  = mid;
            }
        }
        return lo;
    };
 
    /**
     * @alias module:echarts/coord/scale/Time
     * @constructor
     */
    var TimeScale = IntervalScale.extend({
        type: 'time',
 
        // Overwrite
        getLabel: function (val) {
            var stepLvl = this._stepLvl;
 
            var date = new Date(val);
 
            return formatUtil.formatTime(stepLvl[0], date, this.getSetting('useUTC'));
        },
 
        // Overwrite
        niceExtent: function (approxTickNum, fixMin, fixMax) {
            var extent = this._extent;
            // If extent start and end are same, expand them
            if (extent[0] === extent[1]) {
                // Expand extent
                extent[0] -= ONE_DAY;
                extent[1] += ONE_DAY;
            }
            // If there are no data and extent are [Infinity, -Infinity]
            if (extent[1] === -Infinity && extent[0] === Infinity) {
                var d = new Date();
                extent[1] = new Date(d.getFullYear(), d.getMonth(), d.getDate());
                extent[0] = extent[1] - ONE_DAY;
            }
 
            this.niceTicks(approxTickNum);
 
            // var extent = this._extent;
            var interval = this._interval;
 
            if (!fixMin) {
                extent[0] = numberUtil.round(mathFloor(extent[0] / interval) * interval);
            }
            if (!fixMax) {
                extent[1] = numberUtil.round(mathCeil(extent[1] / interval) * interval);
            }
        },
 
        // Overwrite
        niceTicks: function (approxTickNum) {
            var timezoneOffset = this.getSetting('useUTC')
                ? 0 : numberUtil.getTimezoneOffset() * 60 * 1000;
            approxTickNum = approxTickNum || 10;
 
            var extent = this._extent;
            var span = extent[1] - extent[0];
            var approxInterval = span / approxTickNum;
            var scaleLevelsLen = scaleLevels.length;
            var idx = bisect(scaleLevels, approxInterval, 0, scaleLevelsLen);
 
            var level = scaleLevels[Math.min(idx, scaleLevelsLen - 1)];
            var interval = level[2];
            // Same with interval scale if span is much larger than 1 year
            if (level[0] === 'year') {
                var yearSpan = span / interval;
 
                // From "Nice Numbers for Graph Labels" of Graphic Gems
                // var niceYearSpan = numberUtil.nice(yearSpan, false);
                var yearStep = numberUtil.nice(yearSpan / approxTickNum, true);
 
                interval *= yearStep;
            }
 
            var niceExtent = [
                Math.round(mathCeil((extent[0] - timezoneOffset) / interval) * interval + timezoneOffset),
                Math.round(mathFloor((extent[1] - timezoneOffset)/ interval) * interval + timezoneOffset)
            ];
 
            scaleHelper.fixExtent(niceExtent, extent);
 
            this._stepLvl = level;
            // Interval will be used in getTicks
            this._interval = interval;
            this._niceExtent = niceExtent;
        },
 
        parse: function (val) {
            // val might be float.
            return +numberUtil.parseDate(val);
        }
    });
 
    zrUtil.each(['contain', 'normalize'], function (methodName) {
        TimeScale.prototype[methodName] = function (val) {
            return intervalScaleProto[methodName].call(this, this.parse(val));
        };
    });
 
    // Steps from d3
    var scaleLevels = [
        // Format       step    interval
        ['hh:mm:ss',    1,      ONE_SECOND],           // 1s
        ['hh:mm:ss',    5,      ONE_SECOND * 5],       // 5s
        ['hh:mm:ss',    10,     ONE_SECOND * 10],      // 10s
        ['hh:mm:ss',    15,     ONE_SECOND * 15],      // 15s
        ['hh:mm:ss',    30,     ONE_SECOND * 30],      // 30s
        ['hh:mm\nMM-dd',1,      ONE_MINUTE],          // 1m
        ['hh:mm\nMM-dd',5,      ONE_MINUTE * 5],      // 5m
        ['hh:mm\nMM-dd',10,     ONE_MINUTE * 10],     // 10m
        ['hh:mm\nMM-dd',15,     ONE_MINUTE * 15],     // 15m
        ['hh:mm\nMM-dd',30,     ONE_MINUTE * 30],     // 30m
        ['hh:mm\nMM-dd',1,      ONE_HOUR],        // 1h
        ['hh:mm\nMM-dd',2,      ONE_HOUR * 2],    // 2h
        ['hh:mm\nMM-dd',6,      ONE_HOUR * 6],    // 6h
        ['hh:mm\nMM-dd',12,     ONE_HOUR * 12],   // 12h
        ['MM-dd\nyyyy', 1,      ONE_DAY],   // 1d
        ['week',        7,      ONE_DAY * 7],        // 7d
        ['month',       1,      ONE_DAY * 31],       // 1M
        ['quarter',     3,      ONE_DAY * 380 / 4],  // 3M
        ['half-year',   6,      ONE_DAY * 380 / 2],  // 6M
        ['year',        1,      ONE_DAY * 380]       // 1Y
    ];
 
    /**
     * @param {module:echarts/model/Model}
     * @return {module:echarts/scale/Time}
     */
    TimeScale.create = function (model) {
        return new TimeScale({useUTC: model.ecModel.get('useUTC')});
    };
 
    module.exports = TimeScale;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/scale/helper.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/scale/helper.js

Statements: 20.51% (8 / 39)      Branches: 0% (0 / 18)      Functions: 0% (0 / 4)      Lines: 20.51% (8 / 39)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91          1   1   1               1                                   1         1                   1                                                                           1    
/**
 * For testable.
 */
 
 
    var numberUtil = require('../util/number');
 
    var roundNumber = numberUtil.round;
 
    var helper = {};
 
    /**
     * @param {Array.<number>} extent Both extent[0] and extent[1] should be valid number.
     *                                Should be extent[0] < extent[1].
     * @param {number} splitNumber splitNumber should be >= 1.
     * @return {Object} {interval, intervalPrecision, niceTickExtent}
     */
    helper.intervalScaleNiceTicks = function (extent, splitNumber) {
        var result = {};
        var span = extent[1] - extent[0];
 
        var interval = result.interval = numberUtil.nice(span / splitNumber, true);
        // Tow more digital for tick.
        var precision = result.intervalPrecision = numberUtil.getPrecisionSafe(interval) + 2;
        // Niced extent inside original extent
        var niceTickExtent = result.niceTickExtent = [
            roundNumber(Math.ceil(extent[0] / interval) * interval, precision),
            roundNumber(Math.floor(extent[1] / interval) * interval, precision)
        ];
 
        helper.fixExtent(niceTickExtent, extent);
 
        return result;
    };
 
    function clamp(niceTickExtent, idx, extent) {
        niceTickExtent[idx] = Math.max(Math.min(niceTickExtent[idx], extent[1]), extent[0]);
    }
 
    // In some cases (e.g., splitNumber is 1), niceTickExtent may be out of extent.
    helper.fixExtent = function (niceTickExtent, extent) {
        !isFinite(niceTickExtent[0]) && (niceTickExtent[0] = extent[0]);
        !isFinite(niceTickExtent[1]) && (niceTickExtent[1] = extent[1]);
        clamp(niceTickExtent, 0, extent);
        clamp(niceTickExtent, 1, extent);
        if (niceTickExtent[0] > niceTickExtent[1]) {
            niceTickExtent[0] = niceTickExtent[1];
        }
    };
 
    helper.intervalScaleGetTicks = function (interval, extent, niceTickExtent, intervalPrecision) {
        var ticks = [];
 
        // If interval is 0, return [];
        if (!interval) {
            return ticks;
        }
 
        // Consider this case: using dataZoom toolbox, zoom and zoom.
        var safeLimit = 10000;
 
        if (extent[0] < niceTickExtent[0]) {
            ticks.push(extent[0]);
        }
        var tick = niceTickExtent[0];
 
        while (tick <= niceTickExtent[1]) {
            ticks.push(tick);
            // Avoid rounding error
            tick = roundNumber(tick + interval, intervalPrecision);
            if (tick === ticks[ticks.length - 1]) {
                // Consider out of safe float point, e.g.,
                // -3711126.9907707 + 2e-10 === -3711126.9907707
                break;
            }
            if (ticks.length > safeLimit) {
                return [];
            }
        }
        // Consider this case: the last item of ticks is smaller
        // than niceTickExtent[1] and niceTickExtent[1] === extent[1].
        if (extent[1] > (ticks.length ? ticks[ticks.length - 1] : niceTickExtent[1])) {
            ticks.push(extent[1]);
        }
 
        return ticks;
    };
 
    module.exports = helper;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/

Statements: 21.23% (289 / 1361)      Branches: 2.51% (22 / 875)      Functions: 8.21% (16 / 195)      Lines: 21.36% (289 / 1353)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/util/
File Statements Branches Functions Lines
KDTree.js 6.72% (8 / 119) 0% (0 / 83) 0% (0 / 7) 6.72% (8 / 119)
animation.js 14.29% (4 / 28) 0% (0 / 8) 0% (0 / 5) 14.29% (4 / 28)
clazz.js 68.27% (71 / 104) 35.71% (20 / 56) 39.13% (9 / 23) 68.27% (71 / 104)
component.js 29.33% (22 / 75) 0% (0 / 26) 18.75% (3 / 16) 29.33% (22 / 75)
format.js 26.47% (18 / 68) 2.33% (1 / 43) 8.33% (1 / 12) 26.47% (18 / 68)
graphic.js 26.48% (58 / 219) 0% (0 / 159) 2.86% (1 / 35) 26.48% (58 / 219)
layout.js 13.74% (25 / 182) 0% (0 / 146) 0% (0 / 17) 13.74% (25 / 182)
model.js 15.96% (30 / 188) 0% (0 / 173) 6.25% (2 / 32) 15.96% (30 / 188)
number.js 15.65% (23 / 147) 0% (0 / 111) 0% (0 / 20) 16.55% (23 / 139)
quickSelect.js 14.29% (5 / 35) 0% (0 / 10) 0% (0 / 4) 14.29% (5 / 35)
symbol.js 11.76% (16 / 136) 3.57% (1 / 28) 0% (0 / 17) 11.76% (16 / 136)
throttle.js 15% (9 / 60) 0% (0 / 32) 0% (0 / 7) 15% (9 / 60)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/KDTree.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/KDTree.js

Statements: 6.72% (8 / 119)      Branches: 0% (0 / 83)      Functions: 0% (0 / 7)      Lines: 6.72% (8 / 119)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248                1   1                                 1                                           1                                                             1                                                                                                               1                                                   1                                                                                                                                                                     1    
/**
 * K-Dimension Tree
 *
 * @module echarts/data/KDTree
 * @author Yi Shen(https://github.com/pissang)
 */
 
 
    var quickSelect = require('./quickSelect');
 
    function Node(axis, data) {
        this.left = null;
        this.right = null;
        this.axis = axis;
 
        this.data = data;
    }
 
    /**
     * @constructor
     * @alias module:echarts/data/KDTree
     * @param {Array} points List of points.
     * each point needs an array property to repesent the actual data
     * @param {Number} [dimension]
     *        Point dimension.
     *        Default will use the first point's length as dimensiont
     */
    var KDTree = function (points, dimension) {
        if (!points.length) {
            return;
        }
 
        if (!dimension) {
            dimension = points[0].array.length;
        }
        this.dimension = dimension;
        this.root = this._buildTree(points, 0, points.length - 1, 0);
 
        // Use one stack to avoid allocation 
        // each time searching the nearest point
        this._stack = [];
        // Again avoid allocating a new array
        // each time searching nearest N points
        this._nearstNList = [];
    };
 
    /**
     * Resursively build the tree
     */
    KDTree.prototype._buildTree = function (points, left, right, axis) {
        if (right < left) {
            return null;
        }
 
        var medianIndex = Math.floor((left + right) / 2);
        medianIndex = quickSelect(
            points, left, right, medianIndex,
            function (a, b) {
                return a.array[axis] - b.array[axis];
            }
        );
        var median = points[medianIndex];
 
        var node = new Node(axis, median);
 
        axis = (axis + 1) % this.dimension;
        if (right > left) {
            node.left = this._buildTree(points, left, medianIndex - 1, axis);
            node.right = this._buildTree(points, medianIndex + 1, right, axis);   
        }
 
        return node;
    };
 
    /**
     * Find nearest point
     * @param  {Array} target Target point
     * @param  {Function} squaredDistance Squared distance function
     * @return {Array} Nearest point
     */
    KDTree.prototype.nearest = function (target, squaredDistance) {
        var curr = this.root;
        var stack = this._stack;
        var idx = 0;
        var minDist = Infinity;
        var nearestNode = null;
        if (curr.data !== target) {
            minDist = squaredDistance(curr.data, target);
            nearestNode = curr;
        }
 
        if (target.array[curr.axis] < curr.data.array[curr.axis]) {
            // Left first
            curr.right && (stack[idx++] = curr.right);
            curr.left && (stack[idx++] = curr.left);
        }
        else {
            // Right first
            curr.left && (stack[idx++] = curr.left);
            curr.right && (stack[idx++] = curr.right);
        }
 
        while (idx--) {
            curr = stack[idx];
            var currDist = target.array[curr.axis] - curr.data.array[curr.axis];
            var isLeft = currDist < 0;
            var needsCheckOtherSide = false;
            currDist = currDist * currDist;
            // Intersecting right hyperplane with minDist hypersphere
            if (currDist < minDist) {
                currDist = squaredDistance(curr.data, target);
                if (currDist < minDist && curr.data !== target) {
                    minDist = currDist;
                    nearestNode = curr;
                }
                needsCheckOtherSide = true;
            }
            if (isLeft) {
                if (needsCheckOtherSide) {
                    curr.right && (stack[idx++] = curr.right);
                }
                // Search in the left area
                curr.left && (stack[idx++] = curr.left);
            }
            else {
                if (needsCheckOtherSide) {
                    curr.left && (stack[idx++] = curr.left);
                }
                // Search the right area
                curr.right && (stack[idx++] = curr.right);
            }
        }
 
        return nearestNode.data;
    };
 
    KDTree.prototype._addNearest = function (found, dist, node) {
        var nearestNList = this._nearstNList;
 
        // Insert to the right position
        // Sort from small to large
        for (var i = found - 1; i > 0; i--) {
            if (dist >= nearestNList[i - 1].dist) {                
                break;
            }
            else {
                nearestNList[i].dist = nearestNList[i - 1].dist;
                nearestNList[i].node = nearestNList[i - 1].node;
            }
        }
 
        nearestNList[i].dist = dist;
        nearestNList[i].node = node;
    };
 
    /**
     * Find nearest N points
     * @param  {Array} target Target point
     * @param  {number} N
     * @param  {Function} squaredDistance Squared distance function
     * @param  {Array} [output] Output nearest N points
     */
    KDTree.prototype.nearestN = function (target, N, squaredDistance, output) {
        if (N <= 0) {
            output.length = 0;
            return output;
        }
 
        var curr = this.root;
        var stack = this._stack;
        var idx = 0;
 
        var nearestNList = this._nearstNList;
        for (var i = 0; i < N; i++) {
            // Allocate
            if (!nearestNList[i]) {
                nearestNList[i] = {};
            }
            nearestNList[i].dist = 0;
            nearestNList[i].node = null;
        }
        var currDist = squaredDistance(curr.data, target);
 
        var found = 0;
        if (curr.data !== target) {
            found++;
            this._addNearest(found, currDist, curr);
        }
 
        if (target.array[curr.axis] < curr.data.array[curr.axis]) {
            // Left first
            curr.right && (stack[idx++] = curr.right);
            curr.left && (stack[idx++] = curr.left);
        }
        else {
            // Right first
            curr.left && (stack[idx++] = curr.left);
            curr.right && (stack[idx++] = curr.right);
        }
 
        while (idx--) {
            curr = stack[idx];
            var currDist = target.array[curr.axis] - curr.data.array[curr.axis];
            var isLeft = currDist < 0;
            var needsCheckOtherSide = false;
            currDist = currDist * currDist;
            // Intersecting right hyperplane with minDist hypersphere
            if (found < N || currDist < nearestNList[found - 1].dist) {
                currDist = squaredDistance(curr.data, target);
                if (
                    (found < N || currDist < nearestNList[found - 1].dist)
                    && curr.data !== target
                ) {
                    if (found < N) {
                        found++;
                    }
                    this._addNearest(found, currDist, curr);
                }
                needsCheckOtherSide = true;
            }
            if (isLeft) {
                if (needsCheckOtherSide) {
                    curr.right && (stack[idx++] = curr.right);
                }
                // Search in the left area
                curr.left && (stack[idx++] = curr.left);
            }
            else {
                if (needsCheckOtherSide) {
                    curr.left && (stack[idx++] = curr.left);
                }
                // Search the right area
                curr.right && (stack[idx++] = curr.right);
            }
        }
 
        // Copy to output
        for (var i = 0; i < found; i++) {
            output[i] = nearestNList[i].node.data;
        }
        output.length = found;
 
        return output;
    };
 
    module.exports = KDTree;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/animation.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/animation.js

Statements: 14.29% (4 / 28)      Branches: 0% (0 / 8)      Functions: 0% (0 / 5)      Lines: 14.29% (4 / 28)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102    1                                 1                                                                                                                                       1                       1    
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    /**
     * @param {number} [time=500] Time in ms
     * @param {string} [easing='linear']
     * @param {number} [delay=0]
     * @param {Function} [callback]
     *
     * @example
     *  // Animate position
     *  animation
     *      .createWrap()
     *      .add(el1, {position: [10, 10]})
     *      .add(el2, {shape: {width: 500}, style: {fill: 'red'}}, 400)
     *      .done(function () { // done })
     *      .start('cubicOut');
     */
    function createWrap() {
 
        var storage = [];
        var elExistsMap = {};
        var doneCallback;
 
        return {
 
            /**
             * Caution: a el can only be added once, otherwise 'done'
             * might not be called. This method checks this (by el.id),
             * suppresses adding and returns false when existing el found.
             *
             * @param {modele:zrender/Element} el
             * @param {Object} target
             * @param {number} [time=500]
             * @param {number} [delay=0]
             * @param {string} [easing='linear']
             * @return {boolean} Whether adding succeeded.
             *
             * @example
             *     add(el, target, time, delay, easing);
             *     add(el, target, time, easing);
             *     add(el, target, time);
             *     add(el, target);
             */
            add: function (el, target, time, delay, easing) {
                if (zrUtil.isString(delay)) {
                    easing = delay;
                    delay = 0;
                }
 
                if (elExistsMap[el.id]) {
                    return false;
                }
                elExistsMap[el.id] = 1;
 
                storage.push(
                    {el: el, target: target, time: time, delay: delay, easing: easing}
                );
 
                return true;
            },
 
            /**
             * Only execute when animation finished. Will not execute when any
             * of 'stop' or 'stopAnimation' called.
             *
             * @param {Function} callback
             */
            done: function (callback) {
                doneCallback = callback;
                return this;
            },
 
            /**
             * Will stop exist animation firstly.
             */
            start: function () {
                var count = storage.length;
 
                for (var i = 0, len = storage.length; i < len; i++) {
                    var item = storage[i];
                    item.el.animateTo(item.target, item.time, item.delay, item.easing, done);
                }
 
                return this;
 
                function done() {
                    count--;
                    if (!count) {
                        storage.length = 0;
                        elExistsMap = {};
                        doneCallback && doneCallback();
                    }
                }
            }
        };
    }
 
    module.exports = {createWrap: createWrap};
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/clazz.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/clazz.js

Statements: 68.27% (71 / 104)      Branches: 35.71% (20 / 56)      Functions: 39.13% (9 / 23)      Lines: 68.27% (71 / 104)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269    1   1   1 1 1             1                 1                 1               1 145 145 145 145 145   145           1 136                 1   5 5   141 141 20                 141 141                 141   141 141 141 141 141   141                   1         1                   1 4                   4   4 136 136 136   136 78 78 1     78   58 58 58     136     4                                   4                                   4                 4                         4           4   1 58 58 13 13   58     4 4 4 4 136 136         4           1                                   1    
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    var clazz = {};
 
    var TYPE_DELIMITER = '.';
    var IS_CONTAINER = '___EC__COMPONENT__CONTAINER___';
    var MEMBER_PRIFIX = '\0ec_\0';
 
    /**
     * Hide private class member.
     * The same behavior as `host[name] = value;` (can be right-value)
     * @public
     */
    clazz.set = function (host, name, value) {
        return (host[MEMBER_PRIFIX + name] = value);
    };
 
    /**
     * Hide private class member.
     * The same behavior as `host[name];`
     * @public
     */
    clazz.get = function (host, name) {
        return host[MEMBER_PRIFIX + name];
    };
 
    /**
     * For hidden private class member.
     * The same behavior as `host.hasOwnProperty(name);`
     * @public
     */
    clazz.hasOwn = function (host, name) {
        return host.hasOwnProperty(MEMBER_PRIFIX + name);
    };
 
    /**
     * Notice, parseClassType('') should returns {main: '', sub: ''}
     * @public
     */
    var parseClassType = clazz.parseClassType = function (componentType) {
        var ret = {main: '', sub: ''};
        Eif (componentType) {
            componentType = componentType.split(TYPE_DELIMITER);
            ret.main = componentType[0] || '';
            ret.sub = componentType[1] || '';
        }
        return ret;
    };
 
    /**
     * @public
     */
    function checkClassType(componentType) {
        zrUtil.assert(
            /^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(componentType),
            'componentType "' + componentType + '" illegal'
        );
    }
 
    /**
     * @public
     */
    clazz.enableClassExtend = function (RootClass, mandatoryMethods) {
 
        RootClass.$constructor = RootClass;
        RootClass.extend = function (proto) {
 
            Eif (__DEV__) {
                zrUtil.each(mandatoryMethods, function (method) {
                    Iif (!proto[method]) {
                        console.warn(
                            'Method `' + method + '` should be implemented'
                            + (proto.type ? ' in ' + proto.type : '') + '.'
                        );
                    }
                });
            }
 
            var superClass = this;
            var ExtendedClass = function () {
                if (!proto.$constructor) {
                    superClass.apply(this, arguments);
                }
                else {
                    proto.$constructor.apply(this, arguments);
                }
            };
 
            zrUtil.extend(ExtendedClass.prototype, proto);
 
            ExtendedClass.extend = this.extend;
            ExtendedClass.superCall = superCall;
            ExtendedClass.superApply = superApply;
            zrUtil.inherits(ExtendedClass, this);
            ExtendedClass.superClass = superClass;
 
            return ExtendedClass;
        };
    };
 
    // superCall should have class info, which can not be fetch from 'this'.
    // Consider this case:
    // class A has method f,
    // class B inherits class A, overrides method f, f call superApply('f'),
    // class C inherits class B, do not overrides method f,
    // then when method of class C is called, dead loop occured.
    function superCall(context, methodName) {
        var args = zrUtil.slice(arguments, 2);
        return this.superClass.prototype[methodName].apply(context, args);
    }
 
    function superApply(context, methodName, args) {
        return this.superClass.prototype[methodName].apply(context, args);
    }
 
    /**
     * @param {Object} entity
     * @param {Object} options
     * @param {boolean} [options.registerWhenExtend]
     * @public
     */
    clazz.enableClassManagement = function (entity, options) {
        options = options || {};
 
        /**
         * Component model classes
         * key: componentType,
         * value:
         *     componentClass, when componentType is 'xxx'
         *     or Object.<subKey, componentClass>, when componentType is 'xxx.yy'
         * @type {Object}
         */
        var storage = {};
 
        entity.registerClass = function (Clazz, componentType) {
            Eif (componentType) {
                checkClassType(componentType);
                componentType = parseClassType(componentType);
 
                if (!componentType.sub) {
                    Eif (__DEV__) {
                        if (storage[componentType.main]) {
                            console.warn(componentType.main + ' exists.');
                        }
                    }
                    storage[componentType.main] = Clazz;
                }
                else Eif (componentType.sub !== IS_CONTAINER) {
                    var container = makeContainer(componentType);
                    container[componentType.sub] = Clazz;
                }
            }
            return Clazz;
        };
 
        entity.getClass = function (componentMainType, subType, throwWhenNotFound) {
            var Clazz = storage[componentMainType];
 
            if (Clazz && Clazz[IS_CONTAINER]) {
                Clazz = subType ? Clazz[subType] : null;
            }
 
            if (throwWhenNotFound && !Clazz) {
                throw new Error(
                    !subType
                        ? componentMainType + '.' + 'type should be specified.'
                        : 'Component ' + componentMainType + '.' + (subType || '') + ' not exists. Load it first.'
                );
            }
 
            return Clazz;
        };
 
        entity.getClassesByMainType = function (componentType) {
            componentType = parseClassType(componentType);
 
            var result = [];
            var obj = storage[componentType.main];
 
            if (obj && obj[IS_CONTAINER]) {
                zrUtil.each(obj, function (o, type) {
                    type !== IS_CONTAINER && result.push(o);
                });
            }
            else {
                result.push(obj);
            }
 
            return result;
        };
 
        entity.hasClass = function (componentType) {
            // Just consider componentType.main.
            componentType = parseClassType(componentType);
            return !!storage[componentType.main];
        };
 
        /**
         * @return {Array.<string>} Like ['aa', 'bb'], but can not be ['aa.xx']
         */
        entity.getAllClassMainTypes = function () {
            var types = [];
            zrUtil.each(storage, function (obj, type) {
                types.push(type);
            });
            return types;
        };
 
        /**
         * If a main type is container and has sub types
         * @param  {string}  mainType
         * @return {boolean}
         */
        entity.hasSubTypes = function (componentType) {
            componentType = parseClassType(componentType);
            var obj = storage[componentType.main];
            return obj && obj[IS_CONTAINER];
        };
 
        entity.parseClassType = parseClassType;
 
        function makeContainer(componentType) {
            var container = storage[componentType.main];
            if (!container || !container[IS_CONTAINER]) {
                container = storage[componentType.main] = {};
                container[IS_CONTAINER] = true;
            }
            return container;
        }
 
        Eif (options.registerWhenExtend) {
            var originalExtend = entity.extend;
            Eif (originalExtend) {
                entity.extend = function (proto) {
                    var ExtendedClass = originalExtend.call(this, proto);
                    return entity.registerClass(ExtendedClass, proto.type);
                };
            }
        }
 
        return entity;
    };
 
    /**
     * @param {string|Array.<string>} properties
     */
    clazz.setReadOnly = function (obj, properties) {
        // FIXME It seems broken in IE8 simulation of IE11
        // if (!zrUtil.isArray(properties)) {
        //     properties = properties != null ? [properties] : [];
        // }
        // zrUtil.each(properties, function (prop) {
        //     var value = obj[prop];
 
        //     Object.defineProperty
        //         && Object.defineProperty(obj, prop, {
        //             value: value, writable: false
        //         });
        //     zrUtil.isArray(obj[prop])
        //         && Object.freeze
        //         && Object.freeze(obj[prop]);
        // });
    };
 
    module.exports = clazz;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/component.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/component.js

Statements: 29.33% (22 / 75)      Branches: 0% (0 / 26)      Functions: 18.75% (3 / 16)      Lines: 29.33% (22 / 75)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177    1 1   1   1   1   1             1                 1   1   1 9 9     1                     1                       1                   1                                                               1                         1                             1                                                         1             1                 1    
 
 
    var zrUtil = require('zrender/lib/core/util');
    var clazz = require('./clazz');
 
    var parseClassType = clazz.parseClassType;
 
    var base = 0;
 
    var componentUtil = {};
 
    var DELIMITER = '_';
 
    /**
     * @public
     * @param {string} type
     * @return {string}
     */
    componentUtil.getUID = function (type) {
        // Considering the case of crossing js context,
        // use Math.random to make id as unique as possible.
        return [(type || ''), base++, Math.random()].join(DELIMITER);
    };
 
    /**
     * @inner
     */
    componentUtil.enableSubTypeDefaulter = function (entity) {
 
        var subTypeDefaulters = {};
 
        entity.registerSubTypeDefaulter = function (componentType, defaulter) {
            componentType = parseClassType(componentType);
            subTypeDefaulters[componentType.main] = defaulter;
        };
 
        entity.determineSubType = function (componentType, option) {
            var type = option.type;
            if (!type) {
                var componentTypeMain = parseClassType(componentType).main;
                if (entity.hasSubTypes(componentType) && subTypeDefaulters[componentTypeMain]) {
                    type = subTypeDefaulters[componentTypeMain](option);
                }
            }
            return type;
        };
 
        return entity;
    };
 
    /**
     * Topological travel on Activity Network (Activity On Vertices).
     * Dependencies is defined in Model.prototype.dependencies, like ['xAxis', 'yAxis'].
     *
     * If 'xAxis' or 'yAxis' is absent in componentTypeList, just ignore it in topology.
     *
     * If there is circle dependencey, Error will be thrown.
     *
     */
    componentUtil.enableTopologicalTravel = function (entity, dependencyGetter) {
 
        /**
         * @public
         * @param {Array.<string>} targetNameList Target Component type list.
         *                                           Can be ['aa', 'bb', 'aa.xx']
         * @param {Array.<string>} fullNameList By which we can build dependency graph.
         * @param {Function} callback Params: componentType, dependencies.
         * @param {Object} context Scope of callback.
         */
        entity.topologicalTravel = function (targetNameList, fullNameList, callback, context) {
            if (!targetNameList.length) {
                return;
            }
 
            var result = makeDepndencyGraph(fullNameList);
            var graph = result.graph;
            var stack = result.noEntryList;
 
            var targetNameSet = {};
            zrUtil.each(targetNameList, function (name) {
                targetNameSet[name] = true;
            });
 
            while (stack.length) {
                var currComponentType = stack.pop();
                var currVertex = graph[currComponentType];
                var isInTargetNameSet = !!targetNameSet[currComponentType];
                if (isInTargetNameSet) {
                    callback.call(context, currComponentType, currVertex.originalDeps.slice());
                    delete targetNameSet[currComponentType];
                }
                zrUtil.each(
                    currVertex.successor,
                    isInTargetNameSet ? removeEdgeAndAdd : removeEdge
                );
            }
 
            zrUtil.each(targetNameSet, function () {
                throw new Error('Circle dependency may exists');
            });
 
            function removeEdge(succComponentType) {
                graph[succComponentType].entryCount--;
                if (graph[succComponentType].entryCount === 0) {
                    stack.push(succComponentType);
                }
            }
 
            // Consider this case: legend depends on series, and we call
            // chart.setOption({series: [...]}), where only series is in option.
            // If we do not have 'removeEdgeAndAdd', legendModel.mergeOption will
            // not be called, but only sereis.mergeOption is called. Thus legend
            // have no chance to update its local record about series (like which
            // name of series is available in legend).
            function removeEdgeAndAdd(succComponentType) {
                targetNameSet[succComponentType] = true;
                removeEdge(succComponentType);
            }
        };
 
        /**
         * DepndencyGraph: {Object}
         * key: conponentType,
         * value: {
         *     successor: [conponentTypes...],
         *     originalDeps: [conponentTypes...],
         *     entryCount: {number}
         * }
         */
        function makeDepndencyGraph(fullNameList) {
            var graph = {};
            var noEntryList = [];
 
            zrUtil.each(fullNameList, function (name) {
 
                var thisItem = createDependencyGraphItem(graph, name);
                var originalDeps = thisItem.originalDeps = dependencyGetter(name);
 
                var availableDeps = getAvailableDependencies(originalDeps, fullNameList);
                thisItem.entryCount = availableDeps.length;
                if (thisItem.entryCount === 0) {
                    noEntryList.push(name);
                }
 
                zrUtil.each(availableDeps, function (dependentName) {
                    if (zrUtil.indexOf(thisItem.predecessor, dependentName) < 0) {
                        thisItem.predecessor.push(dependentName);
                    }
                    var thatItem = createDependencyGraphItem(graph, dependentName);
                    if (zrUtil.indexOf(thatItem.successor, dependentName) < 0) {
                        thatItem.successor.push(name);
                    }
                });
            });
 
            return {graph: graph, noEntryList: noEntryList};
        }
 
        function createDependencyGraphItem(graph, name) {
            if (!graph[name]) {
                graph[name] = {predecessor: [], successor: []};
            }
            return graph[name];
        }
 
        function getAvailableDependencies(originalDeps, fullNameList) {
            var availableDeps = [];
            zrUtil.each(originalDeps, function (dep) {
                zrUtil.indexOf(fullNameList, dep) >= 0 && availableDeps.push(dep);
            });
            return availableDeps;
        }
    };
 
    module.exports = componentUtil;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/format.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/format.js

Statements: 26.47% (18 / 68)      Branches: 2.33% (1 / 43)      Functions: 8.33% (1 / 12)      Lines: 26.47% (18 / 68)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200    1 1 1   1             1                           1                                       1                               1                 1   1                     1                                                                       1                               1                         1                                                                               1 10     1   1      
 
 
    var zrUtil = require('zrender/lib/core/util');
    var numberUtil = require('./number');
    var textContain = require('zrender/lib/contain/text');
 
    var formatUtil = {};
 
    /**
     * 每三位默认加,格式化
     * @param {string|number} x
     * @return {string}
     */
    formatUtil.addCommas = function (x) {
        if (isNaN(x)) {
            return '-';
        }
        x = (x + '').split('.');
        return x[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,'$1,')
               + (x.length > 1 ? ('.' + x[1]) : '');
    };
 
    /**
     * @param {string} str
     * @param {boolean} [upperCaseFirst=false]
     * @return {string} str
     */
    formatUtil.toCamelCase = function (str, upperCaseFirst) {
        str = (str || '').toLowerCase().replace(/-(.)/g, function(match, group1) {
            return group1.toUpperCase();
        });
 
        if (upperCaseFirst && str) {
            str = str.charAt(0).toUpperCase() + str.slice(1);
        }
 
        return str;
    };
 
    /**
     * Normalize css liked array configuration
     * e.g.
     *  3 => [3, 3, 3, 3]
     *  [4, 2] => [4, 2, 4, 2]
     *  [4, 3, 2] => [4, 3, 2, 3]
     * @param {number|Array.<number>} val
     */
    formatUtil.normalizeCssArray = function (val) {
        var len = val.length;
        if (typeof (val) === 'number') {
            return [val, val, val, val];
        }
        else if (len === 2) {
            // vertical | horizontal
            return [val[0], val[1], val[0], val[1]];
        }
        else if (len === 3) {
            // top | horizontal | bottom
            return [val[0], val[1], val[2], val[1]];
        }
        return val;
    };
 
    var encodeHTML = formatUtil.encodeHTML = function (source) {
        return String(source)
            .replace(/&/g, '&amp;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;')
            .replace(/"/g, '&quot;')
            .replace(/'/g, '&#39;');
    };
 
    var TPL_VAR_ALIAS = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
 
    var wrapVar = function (varName, seriesIdx) {
        return '{' + varName + (seriesIdx == null ? '' : seriesIdx) + '}';
    };
 
    /**
     * Template formatter
     * @param {string} tpl
     * @param {Array.<Object>|Object} paramsList
     * @param {boolean} [encode=false]
     * @return {string}
     */
    formatUtil.formatTpl = function (tpl, paramsList, encode) {
        if (!zrUtil.isArray(paramsList)) {
            paramsList = [paramsList];
        }
        var seriesLen = paramsList.length;
        if (!seriesLen) {
            return '';
        }
 
        var $vars = paramsList[0].$vars || [];
        for (var i = 0; i < $vars.length; i++) {
            var alias = TPL_VAR_ALIAS[i];
            var val = wrapVar(alias, 0);
            tpl = tpl.replace(wrapVar(alias), encode ? encodeHTML(val) : val);
        }
        for (var seriesIdx = 0; seriesIdx < seriesLen; seriesIdx++) {
            for (var k = 0; k < $vars.length; k++) {
                var val = paramsList[seriesIdx][$vars[k]];
                tpl = tpl.replace(
                    wrapVar(TPL_VAR_ALIAS[k], seriesIdx),
                    encode ? encodeHTML(val) : val
                );
            }
        }
 
        return tpl;
    };
 
    /**
     * simple Template formatter
     *
     * @param {string} tpl
     * @param {Object} param
     * @param {boolean} [encode=false]
     * @return {string}
     */
    formatUtil.formatTplSimple = function (tpl, param, encode) {
        zrUtil.each(param, function (value, key) {
            tpl = tpl.replace(
                '{' + key + '}',
                encode ? encodeHTML(value) : value
            );
        });
        return tpl;
    };
 
 
    /**
     * @param {string} str
     * @return {string}
     * @inner
     */
    var s2d = function (str) {
        return str < 10 ? ('0' + str) : str;
    };
 
    /**
     * ISO Date format
     * @param {string} tpl
     * @param {number} value
     * @param {boolean} [isUTC=false] Default in local time.
     *           see `module:echarts/scale/Time`
     *           and `module:echarts/util/number#parseDate`.
     * @inner
     */
    formatUtil.formatTime = function (tpl, value, isUTC) {
        if (tpl === 'week'
            || tpl === 'month'
            || tpl === 'quarter'
            || tpl === 'half-year'
            || tpl === 'year'
        ) {
            tpl = 'MM-dd\nyyyy';
        }
 
        var date = numberUtil.parseDate(value);
        var utc = isUTC ? 'UTC' : '';
        var y = date['get' + utc + 'FullYear']();
        var M = date['get' + utc + 'Month']() + 1;
        var d = date['get' + utc + 'Date']();
        var h = date['get' + utc + 'Hours']();
        var m = date['get' + utc + 'Minutes']();
        var s = date['get' + utc + 'Seconds']();
 
        tpl = tpl.replace('MM', s2d(M))
            .toLowerCase()
            .replace('yyyy', y)
            .replace('yy', y % 100)
            .replace('dd', s2d(d))
            .replace('d', d)
            .replace('hh', s2d(h))
            .replace('h', h)
            .replace('mm', s2d(m))
            .replace('m', m)
            .replace('ss', s2d(s))
            .replace('s', s);
 
        return tpl;
    };
 
    /**
     * Capital first
     * @param {string} str
     * @return {string}
     */
    formatUtil.capitalFirst = function (str) {
        return str ? str.charAt(0).toUpperCase() + str.substr(1) : str;
    };
 
    formatUtil.truncateText = textContain.truncateText;
 
    module.exports = formatUtil;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/graphic.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/graphic.js

Statements: 26.48% (58 / 219)      Branches: 0% (0 / 159)      Functions: 2.86% (1 / 35)      Lines: 26.48% (58 / 219)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593      1   1 1 1 1 1 1 1 1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1         1 10           1                     1                                                             1                                                               1                                                     1                                                         1                 1       1             1                                                       1                                         1                                       1                   1                         1                           1                       1                       1               1                                           1                                                   1                           1                                                                                                           1                       1                     1                                       1                                 1                                               1         1                 1                                                         1      
'use strict';
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    var pathTool = require('zrender/lib/tool/path');
    var round = Math.round;
    var Path = require('zrender/lib/graphic/Path');
    var colorTool = require('zrender/lib/tool/color');
    var matrix = require('zrender/lib/core/matrix');
    var vector = require('zrender/lib/core/vector');
    var Transformable = require('zrender/lib/mixin/Transformable');
    var BoundingRect = require('zrender/lib/core/BoundingRect');
 
    var graphic = {};
 
    graphic.Group = require('zrender/lib/container/Group');
 
    graphic.Image = require('zrender/lib/graphic/Image');
 
    graphic.Text = require('zrender/lib/graphic/Text');
 
    graphic.Circle = require('zrender/lib/graphic/shape/Circle');
 
    graphic.Sector = require('zrender/lib/graphic/shape/Sector');
 
    graphic.Ring = require('zrender/lib/graphic/shape/Ring');
 
    graphic.Polygon = require('zrender/lib/graphic/shape/Polygon');
 
    graphic.Polyline = require('zrender/lib/graphic/shape/Polyline');
 
    graphic.Rect = require('zrender/lib/graphic/shape/Rect');
 
    graphic.Line = require('zrender/lib/graphic/shape/Line');
 
    graphic.BezierCurve = require('zrender/lib/graphic/shape/BezierCurve');
 
    graphic.Arc = require('zrender/lib/graphic/shape/Arc');
 
    graphic.CompoundPath = require('zrender/lib/graphic/CompoundPath');
 
    graphic.LinearGradient = require('zrender/lib/graphic/LinearGradient');
 
    graphic.RadialGradient = require('zrender/lib/graphic/RadialGradient');
 
    graphic.BoundingRect = BoundingRect;
 
    /**
     * Extend shape with parameters
     */
    graphic.extendShape = function (opts) {
        return Path.extend(opts);
    };
 
    /**
     * Extend path
     */
    graphic.extendPath = function (pathData, opts) {
        return pathTool.extendFromString(pathData, opts);
    };
 
    /**
     * Create a path element from path data string
     * @param {string} pathData
     * @param {Object} opts
     * @param {module:zrender/core/BoundingRect} rect
     * @param {string} [layout=cover] 'center' or 'cover'
     */
    graphic.makePath = function (pathData, opts, rect, layout) {
        var path = pathTool.createFromString(pathData, opts);
        var boundingRect = path.getBoundingRect();
        if (rect) {
            var aspect = boundingRect.width / boundingRect.height;
 
            if (layout === 'center') {
                // Set rect to center, keep width / height ratio.
                var width = rect.height * aspect;
                var height;
                if (width <= rect.width) {
                    height = rect.height;
                }
                else {
                    width = rect.width;
                    height = width / aspect;
                }
                var cx = rect.x + rect.width / 2;
                var cy = rect.y + rect.height / 2;
 
                rect.x = cx - width / 2;
                rect.y = cy - height / 2;
                rect.width = width;
                rect.height = height;
            }
 
            graphic.resizePath(path, rect);
        }
        return path;
    };
 
    graphic.mergePath = pathTool.mergePath,
 
    /**
     * Resize a path to fit the rect
     * @param {module:zrender/graphic/Path} path
     * @param {Object} rect
     */
    graphic.resizePath = function (path, rect) {
        if (!path.applyTransform) {
            return;
        }
 
        var pathRect = path.getBoundingRect();
 
        var m = pathRect.calculateTransform(rect);
 
        path.applyTransform(m);
    };
 
    /**
     * Sub pixel optimize line for canvas
     *
     * @param {Object} param
     * @param {Object} [param.shape]
     * @param {number} [param.shape.x1]
     * @param {number} [param.shape.y1]
     * @param {number} [param.shape.x2]
     * @param {number} [param.shape.y2]
     * @param {Object} [param.style]
     * @param {number} [param.style.lineWidth]
     * @return {Object} Modified param
     */
    graphic.subPixelOptimizeLine = function (param) {
        var subPixelOptimize = graphic.subPixelOptimize;
        var shape = param.shape;
        var lineWidth = param.style.lineWidth;
 
        if (round(shape.x1 * 2) === round(shape.x2 * 2)) {
            shape.x1 = shape.x2 = subPixelOptimize(shape.x1, lineWidth, true);
        }
        if (round(shape.y1 * 2) === round(shape.y2 * 2)) {
            shape.y1 = shape.y2 = subPixelOptimize(shape.y1, lineWidth, true);
        }
        return param;
    };
 
    /**
     * Sub pixel optimize rect for canvas
     *
     * @param {Object} param
     * @param {Object} [param.shape]
     * @param {number} [param.shape.x]
     * @param {number} [param.shape.y]
     * @param {number} [param.shape.width]
     * @param {number} [param.shape.height]
     * @param {Object} [param.style]
     * @param {number} [param.style.lineWidth]
     * @return {Object} Modified param
     */
    graphic.subPixelOptimizeRect = function (param) {
        var subPixelOptimize = graphic.subPixelOptimize;
        var shape = param.shape;
        var lineWidth = param.style.lineWidth;
        var originX = shape.x;
        var originY = shape.y;
        var originWidth = shape.width;
        var originHeight = shape.height;
        shape.x = subPixelOptimize(shape.x, lineWidth, true);
        shape.y = subPixelOptimize(shape.y, lineWidth, true);
        shape.width = Math.max(
            subPixelOptimize(originX + originWidth, lineWidth, false) - shape.x,
            originWidth === 0 ? 0 : 1
        );
        shape.height = Math.max(
            subPixelOptimize(originY + originHeight, lineWidth, false) - shape.y,
            originHeight === 0 ? 0 : 1
        );
        return param;
    };
 
    /**
     * Sub pixel optimize for canvas
     *
     * @param {number} position Coordinate, such as x, y
     * @param {number} lineWidth Should be nonnegative integer.
     * @param {boolean=} positiveOrNegative Default false (negative).
     * @return {number} Optimized position.
     */
    graphic.subPixelOptimize = function (position, lineWidth, positiveOrNegative) {
        // Assure that (position + lineWidth / 2) is near integer edge,
        // otherwise line will be fuzzy in canvas.
        var doubledPosition = round(position * 2);
        return (doubledPosition + round(lineWidth)) % 2 === 0
            ? doubledPosition / 2
            : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2;
    };
 
    function hasFillOrStroke(fillOrStroke) {
        return fillOrStroke != null && fillOrStroke != 'none';
    }
 
    function liftColor(color) {
        return typeof color === 'string' ? colorTool.lift(color, -0.1) : color;
    }
 
    /**
     * @private
     */
    function cacheElementStl(el) {
        if (el.__hoverStlDirty) {
            var stroke = el.style.stroke;
            var fill = el.style.fill;
 
            // Create hoverStyle on mouseover
            var hoverStyle = el.__hoverStl;
            hoverStyle.fill = hoverStyle.fill
                || (hasFillOrStroke(fill) ? liftColor(fill) : null);
            hoverStyle.stroke = hoverStyle.stroke
                || (hasFillOrStroke(stroke) ? liftColor(stroke) : null);
 
            var normalStyle = {};
            for (var name in hoverStyle) {
                if (hoverStyle.hasOwnProperty(name)) {
                    normalStyle[name] = el.style[name];
                }
            }
 
            el.__normalStl = normalStyle;
 
            el.__hoverStlDirty = false;
        }
    }
 
    /**
     * @private
     */
    function doSingleEnterHover(el) {
        if (el.__isHover) {
            return;
        }
 
        cacheElementStl(el);
 
        if (el.useHoverLayer) {
            el.__zr && el.__zr.addHover(el, el.__hoverStl);
        }
        else {
            el.setStyle(el.__hoverStl);
            el.z2 += 1;
        }
 
        el.__isHover = true;
    }
 
    /**
     * @inner
     */
    function doSingleLeaveHover(el) {
        if (!el.__isHover) {
            return;
        }
 
        var normalStl = el.__normalStl;
        if (el.useHoverLayer) {
            el.__zr && el.__zr.removeHover(el);
        }
        else {
            normalStl && el.setStyle(normalStl);
            el.z2 -= 1;
        }
 
        el.__isHover = false;
    }
 
    /**
     * @inner
     */
    function doEnterHover(el) {
        el.type === 'group'
            ? el.traverse(function (child) {
                if (child.type !== 'group') {
                    doSingleEnterHover(child);
                }
            })
            : doSingleEnterHover(el);
    }
 
    function doLeaveHover(el) {
        el.type === 'group'
            ? el.traverse(function (child) {
                if (child.type !== 'group') {
                    doSingleLeaveHover(child);
                }
            })
            : doSingleLeaveHover(el);
    }
 
    /**
     * @inner
     */
    function setElementHoverStl(el, hoverStl) {
        // If element has sepcified hoverStyle, then use it instead of given hoverStyle
        // Often used when item group has a label element and it's hoverStyle is different
        el.__hoverStl = el.hoverStyle || hoverStl || {};
        el.__hoverStlDirty = true;
 
        if (el.__isHover) {
            cacheElementStl(el);
        }
    }
 
    /**
     * @inner
     */
    function onElementMouseOver(e) {
        if (this.__hoverSilentOnTouch && e.zrByTouch) {
            return;
        }
 
        // Only if element is not in emphasis status
        !this.__isEmphasis && doEnterHover(this);
    }
 
    /**
     * @inner
     */
    function onElementMouseOut(e) {
        if (this.__hoverSilentOnTouch && e.zrByTouch) {
            return;
        }
 
        // Only if element is not in emphasis status
        !this.__isEmphasis && doLeaveHover(this);
    }
 
    /**
     * @inner
     */
    function enterEmphasis() {
        this.__isEmphasis = true;
        doEnterHover(this);
    }
 
    /**
     * @inner
     */
    function leaveEmphasis() {
        this.__isEmphasis = false;
        doLeaveHover(this);
    }
 
    /**
     * Set hover style of element.
     * This method can be called repeatly without side-effects.
     * @param {module:zrender/Element} el
     * @param {Object} [hoverStyle]
     * @param {Object} [opt]
     * @param {boolean} [opt.hoverSilentOnTouch=false]
     *        In touch device, mouseover event will be trigger on touchstart event
     *        (see module:zrender/dom/HandlerProxy). By this mechanism, we can
     *        conviniently use hoverStyle when tap on touch screen without additional
     *        code for compatibility.
     *        But if the chart/component has select feature, which usually also use
     *        hoverStyle, there might be conflict between 'select-highlight' and
     *        'hover-highlight' especially when roam is enabled (see geo for example).
     *        In this case, hoverSilentOnTouch should be used to disable hover-highlight
     *        on touch device.
     */
    graphic.setHoverStyle = function (el, hoverStyle, opt) {
        el.__hoverSilentOnTouch = opt && opt.hoverSilentOnTouch;
 
        el.type === 'group'
            ? el.traverse(function (child) {
                if (child.type !== 'group') {
                    setElementHoverStl(child, hoverStyle);
                }
            })
            : setElementHoverStl(el, hoverStyle);
 
        // Duplicated function will be auto-ignored, see Eventful.js.
        el.on('mouseover', onElementMouseOver)
          .on('mouseout', onElementMouseOut);
 
        // Emphasis, normal can be triggered manually
        el.on('emphasis', enterEmphasis)
          .on('normal', leaveEmphasis);
    };
 
    /**
     * Set text option in the style
     * @param {Object} textStyle
     * @param {module:echarts/model/Model} labelModel
     * @param {string} color
     */
    graphic.setText = function (textStyle, labelModel, color) {
        var labelPosition = labelModel.getShallow('position') || 'inside';
        var labelOffset = labelModel.getShallow('offset');
        var labelColor = labelPosition.indexOf('inside') >= 0 ? 'white' : color;
        var textStyleModel = labelModel.getModel('textStyle');
        zrUtil.extend(textStyle, {
            textDistance: labelModel.getShallow('distance') || 5,
            textFont: textStyleModel.getFont(),
            textPosition: labelPosition,
            textOffset: labelOffset,
            textFill: textStyleModel.getTextColor() || labelColor
        });
    };
 
    function animateOrSetProps(isUpdate, el, props, animatableModel, dataIndex, cb) {
        if (typeof dataIndex === 'function') {
            cb = dataIndex;
            dataIndex = null;
        }
        // Do not check 'animation' property directly here. Consider this case:
        // animation model is an `itemModel`, whose does not have `isAnimationEnabled`
        // but its parent model (`seriesModel`) does.
        var animationEnabled = animatableModel && animatableModel.isAnimationEnabled();
 
        if (animationEnabled) {
            var postfix = isUpdate ? 'Update' : '';
            var duration = animatableModel.getShallow('animationDuration' + postfix);
            var animationEasing = animatableModel.getShallow('animationEasing' + postfix);
            var animationDelay = animatableModel.getShallow('animationDelay' + postfix);
            if (typeof animationDelay === 'function') {
                animationDelay = animationDelay(
                    dataIndex,
                    animatableModel.getAnimationDelayParams
                        ? animatableModel.getAnimationDelayParams(el, dataIndex)
                        : null
                );
            }
            if (typeof duration === 'function') {
                duration = duration(dataIndex);
            }
 
            duration > 0
                ? el.animateTo(props, duration, animationDelay || 0, animationEasing, cb)
                : (el.stopAnimation(), el.attr(props), cb && cb());
        }
        else {
            el.stopAnimation();
            el.attr(props);
            cb && cb();
        }
    }
 
    /**
     * Update graphic element properties with or without animation according to the configuration in series
     * @param {module:zrender/Element} el
     * @param {Object} props
     * @param {module:echarts/model/Model} [animatableModel]
     * @param {number} [dataIndex]
     * @param {Function} [cb]
     * @example
     *     graphic.updateProps(el, {
     *         position: [100, 100]
     *     }, seriesModel, dataIndex, function () { console.log('Animation done!'); });
     *     // Or
     *     graphic.updateProps(el, {
     *         position: [100, 100]
     *     }, seriesModel, function () { console.log('Animation done!'); });
     */
    graphic.updateProps = function (el, props, animatableModel, dataIndex, cb) {
        animateOrSetProps(true, el, props, animatableModel, dataIndex, cb);
    };
 
    /**
     * Init graphic element properties with or without animation according to the configuration in series
     * @param {module:zrender/Element} el
     * @param {Object} props
     * @param {module:echarts/model/Model} [animatableModel]
     * @param {number} [dataIndex]
     * @param {Function} cb
     */
    graphic.initProps = function (el, props, animatableModel, dataIndex, cb) {
        animateOrSetProps(false, el, props, animatableModel, dataIndex, cb);
    };
 
    /**
     * Get transform matrix of target (param target),
     * in coordinate of its ancestor (param ancestor)
     *
     * @param {module:zrender/mixin/Transformable} target
     * @param {module:zrender/mixin/Transformable} [ancestor]
     */
    graphic.getTransform = function (target, ancestor) {
        var mat = matrix.identity([]);
 
        while (target && target !== ancestor) {
            matrix.mul(mat, target.getLocalTransform(), mat);
            target = target.parent;
        }
 
        return mat;
    };
 
    /**
     * Apply transform to an vertex.
     * @param {Array.<number>} target [x, y]
     * @param {Array.<number>|TypedArray.<number>|Object} transform Can be:
     *      + Transform matrix: like [1, 0, 0, 1, 0, 0]
     *      + {position, rotation, scale}, the same as `zrender/Transformable`.
     * @param {boolean=} invert Whether use invert matrix.
     * @return {Array.<number>} [x, y]
     */
    graphic.applyTransform = function (target, transform, invert) {
        if (transform && !zrUtil.isArrayLike(transform)) {
            transform = Transformable.getLocalTransform(transform);
        }
 
        if (invert) {
            transform = matrix.invert([], transform);
        }
        return vector.applyTransform([], target, transform);
    };
 
    /**
     * @param {string} direction 'left' 'right' 'top' 'bottom'
     * @param {Array.<number>} transform Transform matrix: like [1, 0, 0, 1, 0, 0]
     * @param {boolean=} invert Whether use invert matrix.
     * @return {string} Transformed direction. 'left' 'right' 'top' 'bottom'
     */
    graphic.transformDirection = function (direction, transform, invert) {
 
        // Pick a base, ensure that transform result will not be (0, 0).
        var hBase = (transform[4] === 0 || transform[5] === 0 || transform[0] === 0)
            ? 1 : Math.abs(2 * transform[4] / transform[0]);
        var vBase = (transform[4] === 0 || transform[5] === 0 || transform[2] === 0)
            ? 1 : Math.abs(2 * transform[4] / transform[2]);
 
        var vertex = [
            direction === 'left' ? -hBase : direction === 'right' ? hBase : 0,
            direction === 'top' ? -vBase : direction === 'bottom' ? vBase : 0
        ];
 
        vertex = graphic.applyTransform(vertex, transform, invert);
 
        return Math.abs(vertex[0]) > Math.abs(vertex[1])
            ? (vertex[0] > 0 ? 'right' : 'left')
            : (vertex[1] > 0 ? 'bottom' : 'top');
    };
 
    /**
     * Apply group transition animation from g1 to g2.
     * If no animatableModel, no animation.
     */
    graphic.groupTransition = function (g1, g2, animatableModel, cb) {
        if (!g1 || !g2) {
            return;
        }
 
        function getElMap(g) {
            var elMap = {};
            g.traverse(function (el) {
                if (!el.isGroup && el.anid) {
                    elMap[el.anid] = el;
                }
            });
            return elMap;
        }
        function getAnimatableProps(el) {
            var obj = {
                position: vector.clone(el.position),
                rotation: el.rotation
            };
            if (el.shape) {
                obj.shape = zrUtil.extend({}, el.shape);
            }
            return obj;
        }
        var elMap1 = getElMap(g1);
 
        g2.traverse(function (el) {
            if (!el.isGroup && el.anid) {
                var oldEl = elMap1[el.anid];
                if (oldEl) {
                    var newProp = getAnimatableProps(el);
                    el.attr(getAnimatableProps(oldEl));
                    graphic.updateProps(el, newProp, animatableModel, el.dataIndex);
                }
                // else {
                //     if (el.previousProps) {
                //         graphic.updateProps
                //     }
                // }
            }
        });
    };
 
    module.exports = graphic;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/layout.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/layout.js

Statements: 13.74% (25 / 182)      Branches: 0% (0 / 146)      Functions: 0% (0 / 17)      Lines: 13.74% (25 / 182)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483        1 1 1 1 1 1   1         1             1         1                                                                                                                                     1                 1                 1                                 1                                                                           1                                                                                                                                                                                                                                                                   1                                                                                                 1                                                         1                       1                                                                                                             1       1       1                       1                 1             1      
'use strict';
// Layout helpers for each component positioning
 
 
    var zrUtil = require('zrender/lib/core/util');
    var BoundingRect = require('zrender/lib/core/BoundingRect');
    var numberUtil = require('./number');
    var formatUtil = require('./format');
    var parsePercent = numberUtil.parsePercent;
    var each = zrUtil.each;
 
    var layout = {};
 
    /**
     * @public
     */
    var LOCATION_PARAMS = layout.LOCATION_PARAMS = [
        'left', 'right', 'top', 'bottom', 'width', 'height'
    ];
 
    /**
     * @public
     */
    var HV_NAMES = layout.HV_NAMES = [
        ['width', 'left', 'right'],
        ['height', 'top', 'bottom']
    ];
 
    function boxLayout(orient, group, gap, maxWidth, maxHeight) {
        var x = 0;
        var y = 0;
        if (maxWidth == null) {
            maxWidth = Infinity;
        }
        if (maxHeight == null) {
            maxHeight = Infinity;
        }
        var currentLineMaxSize = 0;
        group.eachChild(function (child, idx) {
            var position = child.position;
            var rect = child.getBoundingRect();
            var nextChild = group.childAt(idx + 1);
            var nextChildRect = nextChild && nextChild.getBoundingRect();
            var nextX;
            var nextY;
            if (orient === 'horizontal') {
                var moveX = rect.width + (nextChildRect ? (-nextChildRect.x + rect.x) : 0);
                nextX = x + moveX;
                // Wrap when width exceeds maxWidth or meet a `newline` group
                if (nextX > maxWidth || child.newline) {
                    x = 0;
                    nextX = moveX;
                    y += currentLineMaxSize + gap;
                    currentLineMaxSize = rect.height;
                }
                else {
                    currentLineMaxSize = Math.max(currentLineMaxSize, rect.height);
                }
            }
            else {
                var moveY = rect.height + (nextChildRect ? (-nextChildRect.y + rect.y) : 0);
                nextY = y + moveY;
                // Wrap when width exceeds maxHeight or meet a `newline` group
                if (nextY > maxHeight || child.newline) {
                    x += currentLineMaxSize + gap;
                    y = 0;
                    nextY = moveY;
                    currentLineMaxSize = rect.width;
                }
                else {
                    currentLineMaxSize = Math.max(currentLineMaxSize, rect.width);
                }
            }
 
            if (child.newline) {
                return;
            }
 
            position[0] = x;
            position[1] = y;
 
            orient === 'horizontal'
                ? (x = nextX + gap)
                : (y = nextY + gap);
        });
    }
 
    /**
     * VBox or HBox layouting
     * @param {string} orient
     * @param {module:zrender/container/Group} group
     * @param {number} gap
     * @param {number} [width=Infinity]
     * @param {number} [height=Infinity]
     */
    layout.box = boxLayout;
 
    /**
     * VBox layouting
     * @param {module:zrender/container/Group} group
     * @param {number} gap
     * @param {number} [width=Infinity]
     * @param {number} [height=Infinity]
     */
    layout.vbox = zrUtil.curry(boxLayout, 'vertical');
 
    /**
     * HBox layouting
     * @param {module:zrender/container/Group} group
     * @param {number} gap
     * @param {number} [width=Infinity]
     * @param {number} [height=Infinity]
     */
    layout.hbox = zrUtil.curry(boxLayout, 'horizontal');
 
    /**
     * If x or x2 is not specified or 'center' 'left' 'right',
     * the width would be as long as possible.
     * If y or y2 is not specified or 'middle' 'top' 'bottom',
     * the height would be as long as possible.
     *
     * @param {Object} positionInfo
     * @param {number|string} [positionInfo.x]
     * @param {number|string} [positionInfo.y]
     * @param {number|string} [positionInfo.x2]
     * @param {number|string} [positionInfo.y2]
     * @param {Object} containerRect
     * @param {string|number} margin
     * @return {Object} {width, height}
     */
    layout.getAvailableSize = function (positionInfo, containerRect, margin) {
        var containerWidth = containerRect.width;
        var containerHeight = containerRect.height;
 
        var x = parsePercent(positionInfo.x, containerWidth);
        var y = parsePercent(positionInfo.y, containerHeight);
        var x2 = parsePercent(positionInfo.x2, containerWidth);
        var y2 = parsePercent(positionInfo.y2, containerHeight);
 
        (isNaN(x) || isNaN(parseFloat(positionInfo.x))) && (x = 0);
        (isNaN(x2) || isNaN(parseFloat(positionInfo.x2))) && (x2 = containerWidth);
        (isNaN(y) || isNaN(parseFloat(positionInfo.y))) && (y = 0);
        (isNaN(y2) || isNaN(parseFloat(positionInfo.y2))) && (y2 = containerHeight);
 
        margin = formatUtil.normalizeCssArray(margin || 0);
 
        return {
            width: Math.max(x2 - x - margin[1] - margin[3], 0),
            height: Math.max(y2 - y - margin[0] - margin[2], 0)
        };
    };
 
    /**
     * Parse position info.
     *
     * @param {Object} positionInfo
     * @param {number|string} [positionInfo.left]
     * @param {number|string} [positionInfo.top]
     * @param {number|string} [positionInfo.right]
     * @param {number|string} [positionInfo.bottom]
     * @param {number|string} [positionInfo.width]
     * @param {number|string} [positionInfo.height]
     * @param {number|string} [positionInfo.aspect] Aspect is width / height
     * @param {Object} containerRect
     * @param {string|number} [margin]
     *
     * @return {module:zrender/core/BoundingRect}
     */
    layout.getLayoutRect = function (
        positionInfo, containerRect, margin
    ) {
        margin = formatUtil.normalizeCssArray(margin || 0);
 
        var containerWidth = containerRect.width;
        var containerHeight = containerRect.height;
 
        var left = parsePercent(positionInfo.left, containerWidth);
        var top = parsePercent(positionInfo.top, containerHeight);
        var right = parsePercent(positionInfo.right, containerWidth);
        var bottom = parsePercent(positionInfo.bottom, containerHeight);
        var width = parsePercent(positionInfo.width, containerWidth);
        var height = parsePercent(positionInfo.height, containerHeight);
 
        var verticalMargin = margin[2] + margin[0];
        var horizontalMargin = margin[1] + margin[3];
        var aspect = positionInfo.aspect;
 
        // If width is not specified, calculate width from left and right
        if (isNaN(width)) {
            width = containerWidth - right - horizontalMargin - left;
        }
        if (isNaN(height)) {
            height = containerHeight - bottom - verticalMargin - top;
        }
 
        // If width and height are not given
        // 1. Graph should not exceeds the container
        // 2. Aspect must be keeped
        // 3. Graph should take the space as more as possible
        if (isNaN(width) && isNaN(height)) {
            if (aspect > containerWidth / containerHeight) {
                width = containerWidth * 0.8;
            }
            else {
                height = containerHeight * 0.8;
            }
        }
 
        if (aspect != null) {
            // Calculate width or height with given aspect
            if (isNaN(width)) {
                width = aspect * height;
            }
            if (isNaN(height)) {
                height = width / aspect;
            }
        }
 
        // If left is not specified, calculate left from right and width
        if (isNaN(left)) {
            left = containerWidth - right - width - horizontalMargin;
        }
        if (isNaN(top)) {
            top = containerHeight - bottom - height - verticalMargin;
        }
 
        // Align left and top
        switch (positionInfo.left || positionInfo.right) {
            case 'center':
                left = containerWidth / 2 - width / 2 - margin[3];
                break;
            case 'right':
                left = containerWidth - width - horizontalMargin;
                break;
        }
        switch (positionInfo.top || positionInfo.bottom) {
            case 'middle':
            case 'center':
                top = containerHeight / 2 - height / 2 - margin[0];
                break;
            case 'bottom':
                top = containerHeight - height - verticalMargin;
                break;
        }
        // If something is wrong and left, top, width, height are calculated as NaN
        left = left || 0;
        top = top || 0;
        if (isNaN(width)) {
            // Width may be NaN if only one value is given except width
            width = containerWidth - left - (right || 0);
        }
        if (isNaN(height)) {
            // Height may be NaN if only one value is given except height
            height = containerHeight - top - (bottom || 0);
        }
 
        var rect = new BoundingRect(left + margin[3], top + margin[0], width, height);
        rect.margin = margin;
        return rect;
    };
 
 
    /**
     * Position a zr element in viewport
     *  Group position is specified by either
     *  {left, top}, {right, bottom}
     *  If all properties exists, right and bottom will be igonred.
     *
     * Logic:
     *     1. Scale (against origin point in parent coord)
     *     2. Rotate (against origin point in parent coord)
     *     3. Traslate (with el.position by this method)
     * So this method only fixes the last step 'Traslate', which does not affect
     * scaling and rotating.
     *
     * If be called repeatly with the same input el, the same result will be gotten.
     *
     * @param {module:zrender/Element} el Should have `getBoundingRect` method.
     * @param {Object} positionInfo
     * @param {number|string} [positionInfo.left]
     * @param {number|string} [positionInfo.top]
     * @param {number|string} [positionInfo.right]
     * @param {number|string} [positionInfo.bottom]
     * @param {Object} containerRect
     * @param {string|number} margin
     * @param {Object} [opt]
     * @param {Array.<number>} [opt.hv=[1,1]] Only horizontal or only vertical.
     * @param {Array.<number>} [opt.boundingMode='all']
     *        Specify how to calculate boundingRect when locating.
     *        'all': Position the boundingRect that is transformed and uioned
     *               both itself and its descendants.
     *               This mode simplies confine the elements in the bounding
     *               of their container (e.g., using 'right: 0').
     *        'raw': Position the boundingRect that is not transformed and only itself.
     *               This mode is useful when you want a element can overflow its
     *               container. (Consider a rotated circle needs to be located in a corner.)
     *               In this mode positionInfo.width/height can only be number.
     */
    layout.positionElement = function (el, positionInfo, containerRect, margin, opt) {
        var h = !opt || !opt.hv || opt.hv[0];
        var v = !opt || !opt.hv || opt.hv[1];
        var boundingMode = opt && opt.boundingMode || 'all';
 
        if (!h && !v) {
            return;
        }
 
        var rect;
        if (boundingMode === 'raw') {
            rect = el.type === 'group'
                ? new BoundingRect(0, 0, +positionInfo.width || 0, +positionInfo.height || 0)
                : el.getBoundingRect();
        }
        else {
            rect = el.getBoundingRect();
            if (el.needLocalTransform()) {
                var transform = el.getLocalTransform();
                // Notice: raw rect may be inner object of el,
                // which should not be modified.
                rect = rect.clone();
                rect.applyTransform(transform);
            }
        }
 
        positionInfo = layout.getLayoutRect(
            zrUtil.defaults(
                {width: rect.width, height: rect.height},
                positionInfo
            ),
            containerRect,
            margin
        );
 
        // Because 'tranlate' is the last step in transform
        // (see zrender/core/Transformable#getLocalTransfrom),
        // we can just only modify el.position to get final result.
        var elPos = el.position;
        var dx = h ? positionInfo.x - rect.x : 0;
        var dy = v ? positionInfo.y - rect.y : 0;
 
        el.attr('position', boundingMode === 'raw' ? [dx, dy] : [elPos[0] + dx, elPos[1] + dy]);
    };
 
    /**
     * @param {Object} option Contains some of the properties in HV_NAMES.
     * @param {number} hvIdx 0: horizontal; 1: vertical.
     */
    layout.sizeCalculable = function (option, hvIdx) {
        return option[HV_NAMES[hvIdx][0]] != null
            || (option[HV_NAMES[hvIdx][1]] != null && option[HV_NAMES[hvIdx][2]] != null);
    };
 
    /**
     * Consider Case:
     * When defulat option has {left: 0, width: 100}, and we set {right: 0}
     * through setOption or media query, using normal zrUtil.merge will cause
     * {right: 0} does not take effect.
     *
     * @example
     * ComponentModel.extend({
     *     init: function () {
     *         ...
     *         var inputPositionParams = layout.getLayoutParams(option);
     *         this.mergeOption(inputPositionParams);
     *     },
     *     mergeOption: function (newOption) {
     *         newOption && zrUtil.merge(thisOption, newOption, true);
     *         layout.mergeLayoutParam(thisOption, newOption);
     *     }
     * });
     *
     * @param {Object} targetOption
     * @param {Object} newOption
     * @param {Object|string} [opt]
     * @param {boolean|Array.<boolean>} [opt.ignoreSize=false] Some component must has width and height.
     */
    layout.mergeLayoutParam = function (targetOption, newOption, opt) {
        !zrUtil.isObject(opt) && (opt = {});
 
        var ignoreSize = opt.ignoreSize;
        !zrUtil.isArray(ignoreSize) && (ignoreSize = [ignoreSize, ignoreSize]);
 
        var hResult = merge(HV_NAMES[0], 0);
        var vResult = merge(HV_NAMES[1], 1);
 
        copy(HV_NAMES[0], targetOption, hResult);
        copy(HV_NAMES[1], targetOption, vResult);
 
        function merge(names, hvIdx) {
            var newParams = {};
            var newValueCount = 0;
            var merged = {};
            var mergedValueCount = 0;
            var enoughParamNumber = 2;
 
            each(names, function (name) {
                merged[name] = targetOption[name];
            });
            each(names, function (name) {
                // Consider case: newOption.width is null, which is
                // set by user for removing width setting.
                hasProp(newOption, name) && (newParams[name] = merged[name] = newOption[name]);
                hasValue(newParams, name) && newValueCount++;
                hasValue(merged, name) && mergedValueCount++;
            });
 
            if (ignoreSize[hvIdx]) {
                // Only one of left/right is premitted to exist.
                if (hasValue(newOption, names[1])) {
                    merged[names[2]] = null;
                }
                else if (hasValue(newOption, names[2])) {
                    merged[names[1]] = null;
                }
                return merged;
            }
 
            // Case: newOption: {width: ..., right: ...},
            // or targetOption: {right: ...} and newOption: {width: ...},
            // There is no conflict when merged only has params count
            // little than enoughParamNumber.
            if (mergedValueCount === enoughParamNumber || !newValueCount) {
                return merged;
            }
            // Case: newOption: {width: ..., right: ...},
            // Than we can make sure user only want those two, and ignore
            // all origin params in targetOption.
            else if (newValueCount >= enoughParamNumber) {
                return newParams;
            }
            else {
                // Chose another param from targetOption by priority.
                for (var i = 0; i < names.length; i++) {
                    var name = names[i];
                    if (!hasProp(newParams, name) && hasProp(targetOption, name)) {
                        newParams[name] = targetOption[name];
                        break;
                    }
                }
                return newParams;
            }
        }
 
        function hasProp(obj, name) {
            return obj.hasOwnProperty(name);
        }
 
        function hasValue(obj, name) {
            return obj[name] != null && obj[name] !== 'auto';
        }
 
        function copy(names, target, source) {
            each(names, function (name) {
                target[name] = source[name];
            });
        }
    };
 
    /**
     * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.
     * @param {Object} source
     * @return {Object} Result contains those props.
     */
    layout.getLayoutParams = function (source) {
        return layout.copyLayoutParams({}, source);
    };
 
    /**
     * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.
     * @param {Object} source
     * @return {Object} Result contains those props.
     */
    layout.copyLayoutParams = function (target, source) {
        source && target && each(LOCATION_PARAMS, function (name) {
            source.hasOwnProperty(name) && (target[name] = source[name]);
        });
        return target;
    };
 
    module.exports = layout;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/model.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/model.js

Statements: 15.96% (30 / 188)      Branches: 0% (0 / 173)      Functions: 6.25% (2 / 32)      Lines: 15.96% (30 / 188)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607    1 1 1 1 1 1   1             1                                                   1                             1               1                   1                       1                                                               1                             1                                                                                                                                                                                               1                                                                                                                                                                                       1                                                                                                                                                               1                           1                 1                                     1                                             1                                                                   1 1 1 3 3                                                                                 1                                                                                                         1       1      
 
 
    var formatUtil = require('./format');
    var nubmerUtil = require('./number');
    var Model = require('../model/Model');
    var zrUtil = require('zrender/lib/core/util');
    var each = zrUtil.each;
    var isObject = zrUtil.isObject;
 
    var modelUtil = {};
 
    /**
     * If value is not array, then translate it to array.
     * @param  {*} value
     * @return {Array} [value] or value
     */
    modelUtil.normalizeToArray = function (value) {
        return value instanceof Array
            ? value
            : value == null
            ? []
            : [value];
    };
 
    /**
     * Sync default option between normal and emphasis like `position` and `show`
     * In case some one will write code like
     *     label: {
     *         normal: {
     *             show: false,
     *             position: 'outside',
     *             textStyle: {
     *                 fontSize: 18
     *             }
     *         },
     *         emphasis: {
     *             show: true
     *         }
     *     }
     * @param {Object} opt
     * @param {Array.<string>} subOpts
     */
     modelUtil.defaultEmphasis = function (opt, subOpts) {
        if (opt) {
            var emphasisOpt = opt.emphasis = opt.emphasis || {};
            var normalOpt = opt.normal = opt.normal || {};
 
            // Default emphasis option from normal
            each(subOpts, function (subOptName) {
                var val = zrUtil.retrieve(emphasisOpt[subOptName], normalOpt[subOptName]);
                if (val != null) {
                    emphasisOpt[subOptName] = val;
                }
            });
        }
    };
 
    modelUtil.LABEL_OPTIONS = ['position', 'offset', 'show', 'textStyle', 'distance', 'formatter'];
 
    /**
     * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}]
     * This helper method retieves value from data.
     * @param {string|number|Date|Array|Object} dataItem
     * @return {number|string|Date|Array.<number|string|Date>}
     */
    modelUtil.getDataItemValue = function (dataItem) {
        // Performance sensitive.
        return dataItem && (dataItem.value == null ? dataItem : dataItem.value);
    };
 
    /**
     * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}]
     * This helper method determine if dataItem has extra option besides value
     * @param {string|number|Date|Array|Object} dataItem
     */
    modelUtil.isDataItemOption = function (dataItem) {
        return isObject(dataItem)
            && !(dataItem instanceof Array);
            // // markLine data can be array
            // && !(dataItem[0] && isObject(dataItem[0]) && !(dataItem[0] instanceof Array));
    };
 
    /**
     * This helper method convert value in data.
     * @param {string|number|Date} value
     * @param {Object|string} [dimInfo] If string (like 'x'), dimType defaults 'number'.
     */
    modelUtil.converDataValue = function (value, dimInfo) {
        // Performance sensitive.
        var dimType = dimInfo && dimInfo.type;
        if (dimType === 'ordinal') {
            return value;
        }
 
        if (dimType === 'time'
            // spead up when using timestamp
            && typeof value !== 'number'
            && value != null
            && value !== '-'
        ) {
            value = +nubmerUtil.parseDate(value);
        }
 
        // dimType defaults 'number'.
        // If dimType is not ordinal and value is null or undefined or NaN or '-',
        // parse to NaN.
        return (value == null || value === '')
            ? NaN : +value; // If string (like '-'), using '+' parse to NaN
    };
 
    /**
     * Create a model proxy to be used in tooltip for edge data, markLine data, markPoint data.
     * @param {module:echarts/data/List} data
     * @param {Object} opt
     * @param {string} [opt.seriesIndex]
     * @param {Object} [opt.name]
     * @param {Object} [opt.mainType]
     * @param {Object} [opt.subType]
     */
    modelUtil.createDataFormatModel = function (data, opt) {
        var model = new Model();
        zrUtil.mixin(model, modelUtil.dataFormatMixin);
        model.seriesIndex = opt.seriesIndex;
        model.name = opt.name || '';
        model.mainType = opt.mainType;
        model.subType = opt.subType;
 
        model.getData = function () {
            return data;
        };
        return model;
    };
 
    // PENDING A little ugly
    modelUtil.dataFormatMixin = {
        /**
         * Get params for formatter
         * @param {number} dataIndex
         * @param {string} [dataType]
         * @return {Object}
         */
        getDataParams: function (dataIndex, dataType) {
            var data = this.getData(dataType);
            var rawValue = this.getRawValue(dataIndex, dataType);
            var rawDataIndex = data.getRawIndex(dataIndex);
            var name = data.getName(dataIndex, true);
            var itemOpt = data.getRawDataItem(dataIndex);
 
            return {
                componentType: this.mainType,
                componentSubType: this.subType,
                seriesType: this.mainType === 'series' ? this.subType : null,
                seriesIndex: this.seriesIndex,
                seriesId: this.id,
                seriesName: this.name,
                name: name,
                dataIndex: rawDataIndex,
                data: itemOpt,
                dataType: dataType,
                value: rawValue,
                color: data.getItemVisual(dataIndex, 'color'),
 
                // Param name list for mapping `a`, `b`, `c`, `d`, `e`
                $vars: ['seriesName', 'name', 'value']
            };
        },
 
        /**
         * Format label
         * @param {number} dataIndex
         * @param {string} [status='normal'] 'normal' or 'emphasis'
         * @param {string} [dataType]
         * @param {number} [dimIndex]
         * @return {string}
         */
        getFormattedLabel: function (dataIndex, status, dataType, dimIndex) {
            status = status || 'normal';
            var data = this.getData(dataType);
            var itemModel = data.getItemModel(dataIndex);
 
            var params = this.getDataParams(dataIndex, dataType);
            if (dimIndex != null && (params.value instanceof Array)) {
                params.value = params.value[dimIndex];
            }
 
            var formatter = itemModel.get(['label', status, 'formatter']);
 
            if (typeof formatter === 'function') {
                params.status = status;
                return formatter(params);
            }
            else if (typeof formatter === 'string') {
                return formatUtil.formatTpl(formatter, params);
            }
        },
 
        /**
         * Get raw value in option
         * @param {number} idx
         * @param {string} [dataType]
         * @return {Object}
         */
        getRawValue: function (idx, dataType) {
            var data = this.getData(dataType);
            var dataItem = data.getRawDataItem(idx);
            if (dataItem != null) {
                return (isObject(dataItem) && !(dataItem instanceof Array))
                    ? dataItem.value : dataItem;
            }
        },
 
        /**
         * Should be implemented.
         * @param {number} dataIndex
         * @param {boolean} [multipleSeries=false]
         * @param {number} [dataType]
         * @return {string} tooltip string
         */
        formatTooltip: zrUtil.noop
    };
 
    /**
     * Mapping to exists for merge.
     *
     * @public
     * @param {Array.<Object>|Array.<module:echarts/model/Component>} exists
     * @param {Object|Array.<Object>} newCptOptions
     * @return {Array.<Object>} Result, like [{exist: ..., option: ...}, {}],
     *                          index of which is the same as exists.
     */
    modelUtil.mappingToExists = function (exists, newCptOptions) {
        // Mapping by the order by original option (but not order of
        // new option) in merge mode. Because we should ensure
        // some specified index (like xAxisIndex) is consistent with
        // original option, which is easy to understand, espatially in
        // media query. And in most case, merge option is used to
        // update partial option but not be expected to change order.
        newCptOptions = (newCptOptions || []).slice();
 
        var result = zrUtil.map(exists || [], function (obj, index) {
            return {exist: obj};
        });
 
        // Mapping by id or name if specified.
        each(newCptOptions, function (cptOption, index) {
            if (!isObject(cptOption)) {
                return;
            }
 
            // id has highest priority.
            for (var i = 0; i < result.length; i++) {
                if (!result[i].option // Consider name: two map to one.
                    && cptOption.id != null
                    && result[i].exist.id === cptOption.id + ''
                ) {
                    result[i].option = cptOption;
                    newCptOptions[index] = null;
                    return;
                }
            }
 
            for (var i = 0; i < result.length; i++) {
                var exist = result[i].exist;
                if (!result[i].option // Consider name: two map to one.
                    // Can not match when both ids exist but different.
                    && (exist.id == null || cptOption.id == null)
                    && cptOption.name != null
                    && !modelUtil.isIdInner(cptOption)
                    && !modelUtil.isIdInner(exist)
                    && exist.name === cptOption.name + ''
                ) {
                    result[i].option = cptOption;
                    newCptOptions[index] = null;
                    return;
                }
            }
        });
 
        // Otherwise mapping by index.
        each(newCptOptions, function (cptOption, index) {
            if (!isObject(cptOption)) {
                return;
            }
 
            var i = 0;
            for (; i < result.length; i++) {
                var exist = result[i].exist;
                if (!result[i].option
                    // Existing model that already has id should be able to
                    // mapped to (because after mapping performed model may
                    // be assigned with a id, whish should not affect next
                    // mapping), except those has inner id.
                    && !modelUtil.isIdInner(exist)
                    // Caution:
                    // Do not overwrite id. But name can be overwritten,
                    // because axis use name as 'show label text'.
                    // 'exist' always has id and name and we dont
                    // need to check it.
                    && cptOption.id == null
                ) {
                    result[i].option = cptOption;
                    break;
                }
            }
 
            if (i >= result.length) {
                result.push({option: cptOption});
            }
        });
 
        return result;
    };
 
    /**
     * Make id and name for mapping result (result of mappingToExists)
     * into `keyInfo` field.
     *
     * @public
     * @param {Array.<Object>} Result, like [{exist: ..., option: ...}, {}],
     *                          which order is the same as exists.
     * @return {Array.<Object>} The input.
     */
    modelUtil.makeIdAndName = function (mapResult) {
        // We use this id to hash component models and view instances
        // in echarts. id can be specified by user, or auto generated.
 
        // The id generation rule ensures new view instance are able
        // to mapped to old instance when setOption are called in
        // no-merge mode. So we generate model id by name and plus
        // type in view id.
 
        // name can be duplicated among components, which is convenient
        // to specify multi components (like series) by one name.
 
        // Ensure that each id is distinct.
        var idMap = {};
 
        each(mapResult, function (item, index) {
            var existCpt = item.exist;
            existCpt && (idMap[existCpt.id] = item);
        });
 
        each(mapResult, function (item, index) {
            var opt = item.option;
 
            zrUtil.assert(
                !opt || opt.id == null || !idMap[opt.id] || idMap[opt.id] === item,
                'id duplicates: ' + (opt && opt.id)
            );
 
            opt && opt.id != null && (idMap[opt.id] = item);
            !item.keyInfo && (item.keyInfo = {});
        });
 
        // Make name and id.
        each(mapResult, function (item, index) {
            var existCpt = item.exist;
            var opt = item.option;
            var keyInfo = item.keyInfo;
 
            if (!isObject(opt)) {
                return;
            }
 
            // name can be overwitten. Consider case: axis.name = '20km'.
            // But id generated by name will not be changed, which affect
            // only in that case: setOption with 'not merge mode' and view
            // instance will be recreated, which can be accepted.
            keyInfo.name = opt.name != null
                ? opt.name + ''
                : existCpt
                ? existCpt.name
                : '\0-'; // name may be displayed on screen, so use '-'.
 
            if (existCpt) {
                keyInfo.id = existCpt.id;
            }
            else if (opt.id != null) {
                keyInfo.id = opt.id + '';
            }
            else {
                // Consider this situatoin:
                //  optionA: [{name: 'a'}, {name: 'a'}, {..}]
                //  optionB [{..}, {name: 'a'}, {name: 'a'}]
                // Series with the same name between optionA and optionB
                // should be mapped.
                var idNum = 0;
                do {
                    keyInfo.id = '\0' + keyInfo.name + '\0' + idNum++;
                }
                while (idMap[keyInfo.id]);
            }
 
            idMap[keyInfo.id] = item;
        });
    };
 
    /**
     * @public
     * @param {Object} cptOption
     * @return {boolean}
     */
    modelUtil.isIdInner = function (cptOption) {
        return isObject(cptOption)
            && cptOption.id
            && (cptOption.id + '').indexOf('\0_ec_\0') === 0;
    };
 
    /**
     * A helper for removing duplicate items between batchA and batchB,
     * and in themselves, and categorize by series.
     *
     * @param {Array.<Object>} batchA Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...]
     * @param {Array.<Object>} batchB Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...]
     * @return {Array.<Array.<Object>, Array.<Object>>} result: [resultBatchA, resultBatchB]
     */
    modelUtil.compressBatches = function (batchA, batchB) {
        var mapA = {};
        var mapB = {};
 
        makeMap(batchA || [], mapA);
        makeMap(batchB || [], mapB, mapA);
 
        return [mapToArray(mapA), mapToArray(mapB)];
 
        function makeMap(sourceBatch, map, otherMap) {
            for (var i = 0, len = sourceBatch.length; i < len; i++) {
                var seriesId = sourceBatch[i].seriesId;
                var dataIndices = modelUtil.normalizeToArray(sourceBatch[i].dataIndex);
                var otherDataIndices = otherMap && otherMap[seriesId];
 
                for (var j = 0, lenj = dataIndices.length; j < lenj; j++) {
                    var dataIndex = dataIndices[j];
 
                    if (otherDataIndices && otherDataIndices[dataIndex]) {
                        otherDataIndices[dataIndex] = null;
                    }
                    else {
                        (map[seriesId] || (map[seriesId] = {}))[dataIndex] = 1;
                    }
                }
            }
        }
 
        function mapToArray(map, isData) {
            var result = [];
            for (var i in map) {
                if (map.hasOwnProperty(i) && map[i] != null) {
                    if (isData) {
                        result.push(+i);
                    }
                    else {
                        var dataIndices = mapToArray(map[i], true);
                        dataIndices.length && result.push({seriesId: i, dataIndex: dataIndices});
                    }
                }
            }
            return result;
        }
    };
 
    /**
     * @param {module:echarts/data/List} data
     * @param {Object} payload Contains dataIndex (means rawIndex) / dataIndexInside / name
     *                         each of which can be Array or primary type.
     * @return {number|Array.<number>} dataIndex If not found, return undefined/null.
     */
    modelUtil.queryDataIndex = function (data, payload) {
        if (payload.dataIndexInside != null) {
            return payload.dataIndexInside;
        }
        else if (payload.dataIndex != null) {
            return zrUtil.isArray(payload.dataIndex)
                ? zrUtil.map(payload.dataIndex, function (value) {
                    return data.indexOfRawIndex(value);
                })
                : data.indexOfRawIndex(payload.dataIndex);
        }
        else if (payload.name != null) {
            return zrUtil.isArray(payload.name)
                ? zrUtil.map(payload.name, function (value) {
                    return data.indexOfName(value);
                })
                : data.indexOfName(payload.name);
        }
    };
 
    /**
     * Enable property storage to any host object.
     * Notice: Serialization is not supported.
     *
     * For example:
     * var get = modelUitl.makeGetter();
     *
     * function some(hostObj) {
     *      get(hostObj)._someProperty = 1212;
     *      ...
     * }
     *
     * @return {Function}
     */
    modelUtil.makeGetter = (function () {
        var index = 0;
        return function () {
            var key = '\0__ec_prop_getter_' + index++;
            return function (hostObj) {
                return hostObj[key] || (hostObj[key] = {});
            };
        };
    })();
 
    /**
     * @param {module:echarts/model/Global} ecModel
     * @param {string|Object} finder
     *        If string, e.g., 'geo', means {geoIndex: 0}.
     *        If Object, could contain some of these properties below:
     *        {
     *            seriesIndex, seriesId, seriesName,
     *            geoIndex, geoId, geoName,
     *            bmapIndex, bmapId, bmapName,
     *            xAxisIndex, xAxisId, xAxisName,
     *            yAxisIndex, yAxisId, yAxisName,
     *            gridIndex, gridId, gridName,
     *            ... (can be extended)
     *        }
     *        Each properties can be number|string|Array.<number>|Array.<string>
     *        For example, a finder could be
     *        {
     *            seriesIndex: 3,
     *            geoId: ['aa', 'cc'],
     *            gridName: ['xx', 'rr']
     *        }
     *        xxxIndex can be set as 'all' (means all xxx) or 'none' (means not specify)
     *        If nothing or null/undefined specified, return nothing.
     * @param {Object} [opt]
     * @param {string} [opt.defaultMainType]
     * @param {Array.<string>} [opt.includeMainTypes]
     * @return {Object} result like:
     *        {
     *            seriesModels: [seriesModel1, seriesModel2],
     *            seriesModel: seriesModel1, // The first model
     *            geoModels: [geoModel1, geoModel2],
     *            geoModel: geoModel1, // The first model
     *            ...
     *        }
     */
    modelUtil.parseFinder = function (ecModel, finder, opt) {
        if (zrUtil.isString(finder)) {
            var obj = {};
            obj[finder + 'Index'] = 0;
            finder = obj;
        }
 
        var defaultMainType = opt && opt.defaultMainType;
        if (defaultMainType
            && !has(finder, defaultMainType + 'Index')
            && !has(finder, defaultMainType + 'Id')
            && !has(finder, defaultMainType + 'Name')
        ) {
            finder[defaultMainType + 'Index'] = 0;
        }
 
        var result = {};
 
        each(finder, function (value, key) {
            var value = finder[key];
 
            // Exclude 'dataIndex' and other illgal keys.
            if (key === 'dataIndex' || key === 'dataIndexInside') {
                result[key] = value;
                return;
            }
 
            var parsedKey = key.match(/^(\w+)(Index|Id|Name)$/) || [];
            var mainType = parsedKey[1];
            var queryType = (parsedKey[2] || '').toLowerCase();
 
            if (!mainType
                || !queryType
                || value == null
                || (queryType === 'index' && value === 'none')
                || (opt && opt.includeMainTypes && zrUtil.indexOf(opt.includeMainTypes, mainType) < 0)
            ) {
                return;
            }
 
            var queryParam = {mainType: mainType};
            if (queryType !== 'index' || value !== 'all') {
                queryParam[queryType] = value;
            }
 
            var models = ecModel.queryComponents(queryParam);
            result[mainType + 'Models'] = models;
            result[mainType + 'Model'] = models[0];
        });
 
        return result;
    };
 
    function has(obj, prop) {
        return obj && obj.hasOwnProperty(prop);
    }
 
    module.exports = modelUtil;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/number.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/number.js

Statements: 15.65% (23 / 147)      Branches: 0% (0 / 111)      Functions: 0% (0 / 20)      Lines: 16.55% (23 / 139)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405              1   1   1                         1                                                                                                         1                                                                     1                   1                     1                                           1                                           1                     1             1                 1       1         1                                     1                                                                                                 1       1                             1                                                                                               1                                                           1                                       1       1    
/**
 * 数值处理模块
 * @module echarts/util/number
 */
 
 
 
    var number = {};
 
    var RADIAN_EPSILON = 1e-4;
 
    function _trim(str) {
        return str.replace(/^\s+/, '').replace(/\s+$/, '');
    }
 
    /**
     * Linear mapping a value from domain to range
     * @memberOf module:echarts/util/number
     * @param  {(number|Array.<number>)} val
     * @param  {Array.<number>} domain Domain extent domain[0] can be bigger than domain[1]
     * @param  {Array.<number>} range  Range extent range[0] can be bigger than range[1]
     * @param  {boolean} clamp
     * @return {(number|Array.<number>}
     */
    number.linearMap = function (val, domain, range, clamp) {
        var subDomain = domain[1] - domain[0];
        var subRange = range[1] - range[0];
 
        if (subDomain === 0) {
            return subRange === 0
                ? range[0]
                : (range[0] + range[1]) / 2;
        }
 
        // Avoid accuracy problem in edge, such as
        // 146.39 - 62.83 === 83.55999999999999.
        // See echarts/test/ut/spec/util/number.js#linearMap#accuracyError
        // It is a little verbose for efficiency considering this method
        // is a hotspot.
        if (clamp) {
            if (subDomain > 0) {
                if (val <= domain[0]) {
                    return range[0];
                }
                else if (val >= domain[1]) {
                    return range[1];
                }
            }
            else {
                if (val >= domain[0]) {
                    return range[0];
                }
                else if (val <= domain[1]) {
                    return range[1];
                }
            }
        }
        else {
            if (val === domain[0]) {
                return range[0];
            }
            if (val === domain[1]) {
                return range[1];
            }
        }
 
        return (val - domain[0]) / subDomain * subRange + range[0];
    };
 
    /**
     * Convert a percent string to absolute number.
     * Returns NaN if percent is not a valid string or number
     * @memberOf module:echarts/util/number
     * @param {string|number} percent
     * @param {number} all
     * @return {number}
     */
    number.parsePercent = function(percent, all) {
        switch (percent) {
            case 'center':
            case 'middle':
                percent = '50%';
                break;
            case 'left':
            case 'top':
                percent = '0%';
                break;
            case 'right':
            case 'bottom':
                percent = '100%';
                break;
        }
        if (typeof percent === 'string') {
            if (_trim(percent).match(/%$/)) {
                return parseFloat(percent) / 100 * all;
            }
 
            return parseFloat(percent);
        }
 
        return percent == null ? NaN : +percent;
    };
 
    /**
     * (1) Fix rounding error of float numbers.
     * (2) Support return string to avoid scientific notation like '3.5e-7'.
     *
     * @param {number} x
     * @param {number} [precision]
     * @param {boolean} [returnStr]
     * @return {number|string}
     */
    number.round = function (x, precision, returnStr) {
        if (precision == null) {
            precision = 10;
        }
        // Avoid range error
        precision = Math.min(Math.max(0, precision), 20);
        x = (+x).toFixed(precision);
        return returnStr ? x : +x;
    };
 
    number.asc = function (arr) {
        arr.sort(function (a, b) {
            return a - b;
        });
        return arr;
    };
 
    /**
     * Get precision
     * @param {number} val
     */
    number.getPrecision = function (val) {
        val = +val;
        if (isNaN(val)) {
            return 0;
        }
        // It is much faster than methods converting number to string as follows
        //      var tmp = val.toString();
        //      return tmp.length - 1 - tmp.indexOf('.');
        // especially when precision is low
        var e = 1;
        var count = 0;
        while (Math.round(val * e) / e !== val) {
            e *= 10;
            count++;
        }
        return count;
    };
 
    /**
     * @param {string|number} val
     * @return {number}
     */
    number.getPrecisionSafe = function (val) {
        var str = val.toString();
 
        // Consider scientific notation: '3.4e-12' '3.4e+12'
        var eIndex = str.indexOf('e');
        if (eIndex > 0) {
            var precision = +str.slice(eIndex + 1);
            return precision < 0 ? -precision : 0;
        }
        else {
            var dotIndex = str.indexOf('.');
            return dotIndex < 0 ? 0 : str.length - 1 - dotIndex;
        }
    };
 
    /**
     * Minimal dicernible data precisioin according to a single pixel.
     *
     * @param {Array.<number>} dataExtent
     * @param {Array.<number>} pixelExtent
     * @return {number} precision
     */
    number.getPixelPrecision = function (dataExtent, pixelExtent) {
        var log = Math.log;
        var LN10 = Math.LN10;
        var dataQuantity = Math.floor(log(dataExtent[1] - dataExtent[0]) / LN10);
        var sizeQuantity = Math.round(log(Math.abs(pixelExtent[1] - pixelExtent[0])) / LN10);
        // toFixed() digits argument must be between 0 and 20.
        var precision = Math.min(Math.max(-dataQuantity + sizeQuantity, 0), 20);
        return !isFinite(precision) ? 20 : precision;
    };
 
    // Number.MAX_SAFE_INTEGER, ie do not support.
    number.MAX_SAFE_INTEGER = 9007199254740991;
 
    /**
     * To 0 - 2 * PI, considering negative radian.
     * @param {number} radian
     * @return {number}
     */
    number.remRadian = function (radian) {
        var pi2 = Math.PI * 2;
        return (radian % pi2 + pi2) % pi2;
    };
 
    /**
     * @param {type} radian
     * @return {boolean}
     */
    number.isRadianAroundZero = function (val) {
        return val > -RADIAN_EPSILON && val < RADIAN_EPSILON;
    };
 
    var TIME_REG = /^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d\d)(?::(\d\d)(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/; // jshint ignore:line
 
    /**
     * @return {number} in minutes
     */
    number.getTimezoneOffset = function () {
        return (new Date()).getTimezoneOffset();
    };
 
    /**
     * @param {string|Date|number} value These values can be accepted:
     *   + An instance of Date, represent a time in its own time zone.
     *   + Or string in a subset of ISO 8601, only including:
     *     + only year, month, date: '2012-03', '2012-03-01', '2012-03-01 05', '2012-03-01 05:06',
     *     + separated with T or space: '2012-03-01T12:22:33.123', '2012-03-01 12:22:33.123',
     *     + time zone: '2012-03-01T12:22:33Z', '2012-03-01T12:22:33+8000', '2012-03-01T12:22:33-05:00',
     *     all of which will be treated as local time if time zone is not specified
     *     (see <https://momentjs.com/>).
     *   + Or other string format, including (all of which will be treated as loacal time):
     *     '2012', '2012-3-1', '2012/3/1', '2012/03/01',
     *     '2009/6/12 2:00', '2009/6/12 2:05:08', '2009/6/12 2:05:08.123'
     *   + a timestamp, which represent a time in UTC.
     * @return {Date} date
     */
    number.parseDate = function (value) {
        if (value instanceof Date) {
            return value;
        }
        else if (typeof value === 'string') {
            // Different browsers parse date in different way, so we parse it manually.
            // Some other issues:
            // new Date('1970-01-01') is UTC,
            // new Date('1970/01/01') and new Date('1970-1-01') is local.
            // See issue #3623
            var match = TIME_REG.exec(value);
 
            if (!match) {
                // return Invalid Date.
                return new Date(NaN);
            }
 
            var timezoneOffset = number.getTimezoneOffset();
            var timeOffset = !match[8]
                ? 0
                : match[8].toUpperCase() === 'Z'
                ? timezoneOffset
                : +match[8].slice(0, 3) * 60 + timezoneOffset;
 
            // match[n] can only be string or undefined.
            // But take care of '12' + 1 => '121'.
            return new Date(
                +match[1],
                +(match[2] || 1) - 1,
                +match[3] || 1,
                +match[4] || 0,
                +(match[5] || 0) - timeOffset,
                +match[6] || 0,
                +match[7] || 0
            );
        }
        else if (value == null) {
            return new Date(NaN);
        }
 
        return new Date(Math.round(value));
    };
 
    /**
     * Quantity of a number. e.g. 0.1, 1, 10, 100
     *
     * @param  {number} val
     * @return {number}
     */
    number.quantity = function (val) {
        return Math.pow(10, quantityExponent(val));
    };
 
    function quantityExponent(val) {
        return Math.floor(Math.log(val) / Math.LN10);
    }
 
    /**
     * find a “nice” number approximately equal to x. Round the number if round = true,
     * take ceiling if round = false. The primary observation is that the “nicest”
     * numbers in decimal are 1, 2, and 5, and all power-of-ten multiples of these numbers.
     *
     * See "Nice Numbers for Graph Labels" of Graphic Gems.
     *
     * @param  {number} val Non-negative value.
     * @param  {boolean} round
     * @return {number}
     */
    number.nice = function (val, round) {
        var exponent = quantityExponent(val);
        var exp10 = Math.pow(10, exponent);
        var f = val / exp10; // 1 <= f < 10
        var nf;
        if (round) {
            if (f < 1.5) { nf = 1; }
            else if (f < 2.5) { nf = 2; }
            else if (f < 4) { nf = 3; }
            else if (f < 7) { nf = 5; }
            else { nf = 10; }
        }
        else {
            if (f < 1) { nf = 1; }
            else if (f < 2) { nf = 2; }
            else if (f < 3) { nf = 3; }
            else if (f < 5) { nf = 5; }
            else { nf = 10; }
        }
        val = nf * exp10;
 
        // Fix 3 * 0.1 === 0.30000000000000004 issue (see IEEE 754).
        // 20 is the uppper bound of toFixed.
        return exponent >= -20 ? +val.toFixed(exponent < 0 ? -exponent : 0) : val;
    };
 
    /**
     * Order intervals asc, and split them when overlap.
     * expect(numberUtil.reformIntervals([
     *     {interval: [18, 62], close: [1, 1]},
     *     {interval: [-Infinity, -70], close: [0, 0]},
     *     {interval: [-70, -26], close: [1, 1]},
     *     {interval: [-26, 18], close: [1, 1]},
     *     {interval: [62, 150], close: [1, 1]},
     *     {interval: [106, 150], close: [1, 1]},
     *     {interval: [150, Infinity], close: [0, 0]}
     * ])).toEqual([
     *     {interval: [-Infinity, -70], close: [0, 0]},
     *     {interval: [-70, -26], close: [1, 1]},
     *     {interval: [-26, 18], close: [0, 1]},
     *     {interval: [18, 62], close: [0, 1]},
     *     {interval: [62, 150], close: [0, 1]},
     *     {interval: [150, Infinity], close: [0, 0]}
     * ]);
     * @param {Array.<Object>} list, where `close` mean open or close
     *        of the interval, and Infinity can be used.
     * @return {Array.<Object>} The origin list, which has been reformed.
     */
    number.reformIntervals = function (list) {
        list.sort(function (a, b) {
            return littleThan(a, b, 0) ? -1 : 1;
        });
 
        var curr = -Infinity;
        var currClose = 1;
        for (var i = 0; i < list.length;) {
            var interval = list[i].interval;
            var close = list[i].close;
 
            for (var lg = 0; lg < 2; lg++) {
                if (interval[lg] <= curr) {
                    interval[lg] = curr;
                    close[lg] = !lg ? 1 - currClose : 1;
                }
                curr = interval[lg];
                currClose = close[lg];
            }
 
            if (interval[0] === interval[1] && close[0] * close[1] !== 1) {
                list.splice(i, 1);
            }
            else {
                i++;
            }
        }
 
        return list;
 
        function littleThan(a, b, lg) {
            return a.interval[lg] < b.interval[lg]
                || (
                    a.interval[lg] === b.interval[lg]
                    && (
                        (a.close[lg] - b.close[lg] === (!lg ? 1 : -1))
                        || (!lg && littleThan(a, b, 1))
                    )
                );
        }
    };
 
    /**
     * parseFloat NaNs numeric-cast false positives (null|true|false|"")
     * ...but misinterprets leading-number strings, particularly hex literals ("0x...")
     * subtraction forces infinities to NaN
     *
     * @param {*} v
     * @return {boolean}
     */
    number.isNumeric = function (v) {
        return v - parseFloat(v) >= 0;
    };
 
    module.exports = number;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/quickSelect.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/quickSelect.js

Statements: 14.29% (5 / 35)      Branches: 0% (0 / 10)      Functions: 0% (0 / 4)      Lines: 14.29% (5 / 35)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84                    1       1           1                                                                                           1                             1    
/**
 * Quick select n-th element in an array.
 *
 * Note: it will change the elements placement in array.
 *
 * @module echarts/core/quickSelect
 * @author Yi Shen(https://github.com/pissang)
 */
 
 
    function defaultCompareFunc(a, b) {
        return a - b;
    }
 
    function swapElement(arr, idx0, idx1) {
        var tmp = arr[idx0];
        arr[idx0] = arr[idx1];
        arr[idx1] = tmp;
    }
 
    function select(arr, left, right, nth, compareFunc) {
        var pivotIdx = left;
        var pivotValue;
        while (right > left) {
            pivotIdx = Math.round((right + left) / 2);
            pivotValue = arr[pivotIdx];
            // Swap pivot to the end
            swapElement(arr, pivotIdx, right);
            pivotIdx = left;
            for (var i = left; i <= right - 1; i++) {
                if (compareFunc(pivotValue, arr[i]) >= 0) {
                    swapElement(arr, i, pivotIdx);
                    pivotIdx++;
                }
            }
            swapElement(arr, right, pivotIdx);
 
            if (pivotIdx === nth) {
                return pivotIdx;
            }
            else if (pivotIdx < nth) {
                left = pivotIdx + 1;
            }
            else {
                right = pivotIdx - 1;
            }
        }
        // Left == right
        return left;
    }
 
    /**
     * @alias module:echarts/core/quickSelect
     * @param {Array} arr
     * @param {number} [left]
     * @param {number} [right]
     * @param {number} nth
     * @param {Function} [compareFunc]
     * @example
     *     var quickSelect = require('echarts/core/quickSelect');
     *     var arr = [5, 2, 1, 4, 3]
     *     quickSelect(arr, 3);
     *     quickSelect(arr, 0, 3, 1, function (a, b) {return a - b});
     *
     * @return {number}
     */
    function quickSelect(arr, left, right, nth, compareFunc) {
        if (arguments.length <= 3) {
            nth = left;
            if (arguments.length == 2) {
                compareFunc = defaultCompareFunc;
            }
            else {
                compareFunc = right;
            }
            left = 0;
            right = arr.length - 1;
        }
        return select(arr, left, right, nth, compareFunc);
    }
 
    module.exports = quickSelect;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/symbol.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/symbol.js

Statements: 11.76% (16 / 136)      Branches: 3.57% (1 / 28)      Functions: 0% (0 / 17)      Lines: 11.76% (16 / 136)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358        1 1           1                                             1                                                 1                                                                                                           1                                                           1                                       1                                                                                                                                         1 1 9 9       1                                                                                 1                                       1                                                                                                             1    
'use strict';
// Symbol factory
 
 
    var graphic = require('./graphic');
    var BoundingRect = require('zrender/lib/core/BoundingRect');
 
    /**
     * Triangle shape
     * @inner
     */
    var Triangle = graphic.extendShape({
        type: 'triangle',
        shape: {
            cx: 0,
            cy: 0,
            width: 0,
            height: 0
        },
        buildPath: function (path, shape) {
            var cx = shape.cx;
            var cy = shape.cy;
            var width = shape.width / 2;
            var height = shape.height / 2;
            path.moveTo(cx, cy - height);
            path.lineTo(cx + width, cy + height);
            path.lineTo(cx - width, cy + height);
            path.closePath();
        }
    });
    /**
     * Diamond shape
     * @inner
     */
    var Diamond = graphic.extendShape({
        type: 'diamond',
        shape: {
            cx: 0,
            cy: 0,
            width: 0,
            height: 0
        },
        buildPath: function (path, shape) {
            var cx = shape.cx;
            var cy = shape.cy;
            var width = shape.width / 2;
            var height = shape.height / 2;
            path.moveTo(cx, cy - height);
            path.lineTo(cx + width, cy);
            path.lineTo(cx, cy + height);
            path.lineTo(cx - width, cy);
            path.closePath();
        }
    });
 
    /**
     * Pin shape
     * @inner
     */
    var Pin = graphic.extendShape({
        type: 'pin',
        shape: {
            // x, y on the cusp
            x: 0,
            y: 0,
            width: 0,
            height: 0
        },
 
        buildPath: function (path, shape) {
            var x = shape.x;
            var y = shape.y;
            var w = shape.width / 5 * 3;
            // Height must be larger than width
            var h = Math.max(w, shape.height);
            var r = w / 2;
 
            // Dist on y with tangent point and circle center
            var dy = r * r / (h - r);
            var cy = y - h + r + dy;
            var angle = Math.asin(dy / r);
            // Dist on x with tangent point and circle center
            var dx = Math.cos(angle) * r;
 
            var tanX = Math.sin(angle);
            var tanY = Math.cos(angle);
 
            path.arc(
                x, cy, r,
                Math.PI - angle,
                Math.PI * 2 + angle
            );
 
            var cpLen = r * 0.6;
            var cpLen2 = r * 0.7;
            path.bezierCurveTo(
                x + dx - tanX * cpLen, cy + dy + tanY * cpLen,
                x, y - cpLen2,
                x, y
            );
            path.bezierCurveTo(
                x, y - cpLen2,
                x - dx + tanX * cpLen, cy + dy + tanY * cpLen,
                x - dx, cy + dy
            );
            path.closePath();
        }
    });
 
    /**
     * Arrow shape
     * @inner
     */
    var Arrow = graphic.extendShape({
 
        type: 'arrow',
 
        shape: {
            x: 0,
            y: 0,
            width: 0,
            height: 0
        },
 
        buildPath: function (ctx, shape) {
            var height = shape.height;
            var width = shape.width;
            var x = shape.x;
            var y = shape.y;
            var dx = width / 3 * 2;
            ctx.moveTo(x, y);
            ctx.lineTo(x + dx, y + height);
            ctx.lineTo(x, y + height / 4 * 3);
            ctx.lineTo(x - dx, y + height);
            ctx.lineTo(x, y);
            ctx.closePath();
        }
    });
 
    /**
     * Map of path contructors
     * @type {Object.<string, module:zrender/graphic/Path>}
     */
    var symbolCtors = {
        line: graphic.Line,
 
        rect: graphic.Rect,
 
        roundRect: graphic.Rect,
 
        square: graphic.Rect,
 
        circle: graphic.Circle,
 
        diamond: Diamond,
 
        pin: Pin,
 
        arrow: Arrow,
 
        triangle: Triangle
    };
 
    var symbolShapeMakers = {
 
        line: function (x, y, w, h, shape) {
            // FIXME
            shape.x1 = x;
            shape.y1 = y + h / 2;
            shape.x2 = x + w;
            shape.y2 = y + h / 2;
        },
 
        rect: function (x, y, w, h, shape) {
            shape.x = x;
            shape.y = y;
            shape.width = w;
            shape.height = h;
        },
 
        roundRect: function (x, y, w, h, shape) {
            shape.x = x;
            shape.y = y;
            shape.width = w;
            shape.height = h;
            shape.r = Math.min(w, h) / 4;
        },
 
        square: function (x, y, w, h, shape) {
            var size = Math.min(w, h);
            shape.x = x;
            shape.y = y;
            shape.width = size;
            shape.height = size;
        },
 
        circle: function (x, y, w, h, shape) {
            // Put circle in the center of square
            shape.cx = x + w / 2;
            shape.cy = y + h / 2;
            shape.r = Math.min(w, h) / 2;
        },
 
        diamond: function (x, y, w, h, shape) {
            shape.cx = x + w / 2;
            shape.cy = y + h / 2;
            shape.width = w;
            shape.height = h;
        },
 
        pin: function (x, y, w, h, shape) {
            shape.x = x + w / 2;
            shape.y = y + h / 2;
            shape.width = w;
            shape.height = h;
        },
 
        arrow: function (x, y, w, h, shape) {
            shape.x = x + w / 2;
            shape.y = y + h / 2;
            shape.width = w;
            shape.height = h;
        },
 
        triangle: function (x, y, w, h, shape) {
            shape.cx = x + w / 2;
            shape.cy = y + h / 2;
            shape.width = w;
            shape.height = h;
        }
    };
 
    var symbolBuildProxies = {};
    for (var name in symbolCtors) {
        Eif (symbolCtors.hasOwnProperty(name)) {
            symbolBuildProxies[name] = new symbolCtors[name]();
        }
    }
 
    var Symbol = graphic.extendShape({
 
        type: 'symbol',
 
        shape: {
            symbolType: '',
            x: 0,
            y: 0,
            width: 0,
            height: 0
        },
 
        beforeBrush: function () {
            var style = this.style;
            var shape = this.shape;
            // FIXME
            if (shape.symbolType === 'pin' && style.textPosition === 'inside') {
                style.textPosition = ['50%', '40%'];
                style.textAlign = 'center';
                style.textVerticalAlign = 'middle';
            }
        },
 
        buildPath: function (ctx, shape, inBundle) {
            var symbolType = shape.symbolType;
            var proxySymbol = symbolBuildProxies[symbolType];
            if (shape.symbolType !== 'none') {
                if (!proxySymbol) {
                    // Default rect
                    symbolType = 'rect';
                    proxySymbol = symbolBuildProxies[symbolType];
                }
                symbolShapeMakers[symbolType](
                    shape.x, shape.y, shape.width, shape.height, proxySymbol.shape
                );
                proxySymbol.buildPath(ctx, proxySymbol.shape, inBundle);
            }
        }
    });
 
    // Provide setColor helper method to avoid determine if set the fill or stroke outside
    var symbolPathSetColor = function (color) {
        if (this.type !== 'image') {
            var symbolStyle = this.style;
            var symbolShape = this.shape;
            if (symbolShape && symbolShape.symbolType === 'line') {
                symbolStyle.stroke = color;
            }
            else if (this.__isEmptyBrush) {
                symbolStyle.stroke = color;
                symbolStyle.fill = '#fff';
            }
            else {
                // FIXME 判断图形默认是填充还是描边,使用 onlyStroke ?
                symbolStyle.fill && (symbolStyle.fill = color);
                symbolStyle.stroke && (symbolStyle.stroke = color);
            }
            this.dirty(false);
        }
    };
 
    var symbolUtil = {
        /**
         * Create a symbol element with given symbol configuration: shape, x, y, width, height, color
         * @param {string} symbolType
         * @param {number} x
         * @param {number} y
         * @param {number} w
         * @param {number} h
         * @param {string} color
         */
        createSymbol: function (symbolType, x, y, w, h, color) {
            // TODO Support image object, DynamicImage.
 
            var isEmpty = symbolType.indexOf('empty') === 0;
            if (isEmpty) {
                symbolType = symbolType.substr(5, 1).toLowerCase() + symbolType.substr(6);
            }
            var symbolPath;
 
            if (symbolType.indexOf('image://') === 0) {
                symbolPath = new graphic.Image({
                    style: {
                        image: symbolType.slice(8),
                        x: x,
                        y: y,
                        width: w,
                        height: h
                    }
                });
            }
            else if (symbolType.indexOf('path://') === 0) {
                symbolPath = graphic.makePath(symbolType.slice(7), {}, new BoundingRect(x, y, w, h));
            }
            else {
                symbolPath = new Symbol({
                    shape: {
                        symbolType: symbolType,
                        x: x,
                        y: y,
                        width: w,
                        height: h
                    }
                });
            }
 
            symbolPath.__isEmptyBrush = isEmpty;
 
            symbolPath.setColor = symbolPathSetColor;
 
            symbolPath.setColor(color);
 
            return symbolPath;
        }
    };
 
    module.exports = symbolUtil;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/throttle.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/throttle.js

Statements: 15% (9 / 60)      Branches: 0% (0 / 32)      Functions: 0% (0 / 7)      Lines: 15% (9 / 60)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155    1   1 1 1                     1                         1                                                                                                                                                               1                                                                   1             1      
 
 
    var lib = {};
 
    var ORIGIN_METHOD = '\0__throttleOriginMethod';
    var RATE = '\0__throttleRate';
    var THROTTLE_TYPE = '\0__throttleType';
 
    /**
     * @public
     * @param {(Function)} fn
     * @param {number} [delay=0] Unit: ms.
     * @param {boolean} [debounce=false]
     *        true: If call interval less than `delay`, only the last call works.
     *        false: If call interval less than `delay, call works on fixed rate.
     * @return {(Function)} throttled fn.
     */
    lib.throttle = function (fn, delay, debounce) {
 
        var currCall;
        var lastCall = 0;
        var lastExec = 0;
        var timer = null;
        var diff;
        var scope;
        var args;
        var debounceNextCall;
 
        delay = delay || 0;
 
        function exec() {
            lastExec = (new Date()).getTime();
            timer = null;
            fn.apply(scope, args || []);
        }
 
        var cb = function () {
            currCall = (new Date()).getTime();
            scope = this;
            args = arguments;
            var thisDelay = debounceNextCall || delay;
            var thisDebounce = debounceNextCall || debounce;
            debounceNextCall = null;
            diff = currCall - (thisDebounce ? lastCall : lastExec) - thisDelay;
 
            clearTimeout(timer);
 
            if (thisDebounce) {
                timer = setTimeout(exec, thisDelay);
            }
            else {
                if (diff >= 0) {
                    exec();
                }
                else {
                    timer = setTimeout(exec, -diff);
                }
            }
 
            lastCall = currCall;
        };
 
        /**
         * Clear throttle.
         * @public
         */
        cb.clear = function () {
            if (timer) {
                clearTimeout(timer);
                timer = null;
            }
        };
 
        /**
         * Enable debounce once.
         */
        cb.debounceNextCall = function (debounceDelay) {
            debounceNextCall = debounceDelay;
        };
 
        return cb;
    };
 
    /**
     * Create throttle method or update throttle rate.
     *
     * @example
     * ComponentView.prototype.render = function () {
     *     ...
     *     throttle.createOrUpdate(
     *         this,
     *         '_dispatchAction',
     *         this.model.get('throttle'),
     *         'fixRate'
     *     );
     * };
     * ComponentView.prototype.remove = function () {
     *     throttle.clear(this, '_dispatchAction');
     * };
     * ComponentView.prototype.dispose = function () {
     *     throttle.clear(this, '_dispatchAction');
     * };
     *
     * @public
     * @param {Object} obj
     * @param {string} fnAttr
     * @param {number} [rate]
     * @param {string} [throttleType='fixRate'] 'fixRate' or 'debounce'
     * @return {Function} throttled function.
     */
    lib.createOrUpdate = function (obj, fnAttr, rate, throttleType) {
        var fn = obj[fnAttr];
 
        if (!fn) {
            return;
        }
 
        var originFn = fn[ORIGIN_METHOD] || fn;
        var lastThrottleType = fn[THROTTLE_TYPE];
        var lastRate = fn[RATE];
 
        if (lastRate !== rate || lastThrottleType !== throttleType) {
            if (rate == null || !throttleType) {
                return (obj[fnAttr] = originFn);
            }
 
            fn = obj[fnAttr] = lib.throttle(
                originFn, rate, throttleType === 'debounce'
            );
            fn[ORIGIN_METHOD] = originFn;
            fn[THROTTLE_TYPE] = throttleType;
            fn[RATE] = rate;
        }
 
        return fn;
    };
 
    /**
     * Clear throttle. Example see throttle.createOrUpdate.
     *
     * @public
     * @param {Object} obj
     * @param {string} fnAttr
     */
    lib.clear = function (obj, fnAttr) {
        var fn = obj[fnAttr];
        if (fn && fn[ORIGIN_METHOD]) {
            obj[fnAttr] = fn[ORIGIN_METHOD];
        }
    };
 
    module.exports = lib;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/array/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/array/

Statements: 12.82% (5 / 39)      Branches: 0% (0 / 8)      Functions: 0% (0 / 9)      Lines: 12.82% (5 / 39)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/util/array/
File Statements Branches Functions Lines
nest.js 12.82% (5 / 39) 0% (0 / 8) 0% (0 / 9) 12.82% (5 / 39)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/array/nest.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/util/array/nest.js

Statements: 12.82% (5 / 39)      Branches: 0% (0 / 8)      Functions: 0% (0 / 9)      Lines: 12.82% (5 / 39)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107    1           1                   1                                                                   1                                                                                                       1    
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    /**
     * nest helper used to group by the array.
     * can specified the keys and sort the keys.
     */
    function nest() {
 
        var keysFunction = [];
        var sortKeysFunction = [];
 
        /**
         * map an Array into the mapObject.
         * @param {Array} array
         * @param {number} depth
         */
        function map(array, depth) {
            if (depth >= keysFunction.length) {
                return array;
            }
            var i = -1;
            var n = array.length;
            var keyFunction = keysFunction[depth++];
            var mapObject = {};
            var valuesByKey = {};
 
            while (++i < n) {
                var keyValue = keyFunction(array[i]);
                var values = valuesByKey[keyValue];
 
                if (values) {
                    values.push(array[i]);
                }
                else {
                    valuesByKey[keyValue] = [array[i]];
                }
            }
 
            zrUtil.each(valuesByKey, function (value, key) {
                mapObject[key] = map(value, depth);
            });
 
            return mapObject;
        }
 
        /**
         * transform the Map Object to multidimensional Array
         * @param {Object} map
         * @param {number} depth
         */
        function entriesMap(mapObject, depth) {
            if (depth >= keysFunction.length) {
                return mapObject;
            }
            var array = [];
            var sortKeyFunction = sortKeysFunction[depth++];
 
            zrUtil.each(mapObject, function (value, key) {
                array.push({
                    key: key, values: entriesMap(value, depth)
                });
            });
 
            if (sortKeyFunction) {
                return array.sort(function (a, b) {
                    return sortKeyFunction(a.key, b.key);
                });
            }
            else {
                return array;
            }
        }
 
        return {
            /**
             * specified the key to groupby the arrays.
             * users can specified one more keys.
             * @param {Function} d
             */
            key: function (d) {
                keysFunction.push(d);
                return this;
            },
 
            /**
             * specified the comparator to sort the keys
             * @param {Function} order
             */
            sortKeys: function (order) {
                sortKeysFunction[keysFunction.length - 1] = order;
                return this;
            },
 
            /**
             * the array to be grouped by.
             * @param {Array} array
             */
            entries: function (array) {
                return entriesMap(map(array, 0), 0);
            }
        };
    }
    module.exports = nest;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/view/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/view/

Statements: 55.81% (24 / 43)      Branches: 0% (0 / 6)      Functions: 0% (0 / 17)      Lines: 55.81% (24 / 43)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/view/
File Statements Branches Functions Lines
Chart.js 45.16% (14 / 31) 0% (0 / 6) 0% (0 / 12) 45.16% (14 / 31)
Component.js 83.33% (10 / 12) 100% (0 / 0) 0% (0 / 5) 83.33% (10 / 12)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/view/Chart.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/view/Chart.js

Statements: 45.16% (14 / 31)      Branches: 0% (0 / 6)      Functions: 0% (0 / 12)      Lines: 45.16% (14 / 31)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144    1 1 1 1 1   1                             1                                                                                                                                       1 1                       1                               1                               1     1   1    
 
 
    var Group = require('zrender/lib/container/Group');
    var componentUtil = require('../util/component');
    var clazzUtil = require('../util/clazz');
    var modelUtil = require('../util/model');
    var zrUtil = require('zrender/lib/core/util');
 
    function Chart() {
 
        /**
         * @type {module:zrender/container/Group}
         * @readOnly
         */
        this.group = new Group();
 
        /**
         * @type {string}
         * @readOnly
         */
        this.uid = componentUtil.getUID('viewChart');
    }
 
    Chart.prototype = {
 
        type: 'chart',
 
        /**
         * Init the chart
         * @param  {module:echarts/model/Global} ecModel
         * @param  {module:echarts/ExtensionAPI} api
         */
        init: function (ecModel, api) {},
 
        /**
         * Render the chart
         * @param  {module:echarts/model/Series} seriesModel
         * @param  {module:echarts/model/Global} ecModel
         * @param  {module:echarts/ExtensionAPI} api
         * @param  {Object} payload
         */
        render: function (seriesModel, ecModel, api, payload) {},
 
        /**
         * Highlight series or specified data item
         * @param  {module:echarts/model/Series} seriesModel
         * @param  {module:echarts/model/Global} ecModel
         * @param  {module:echarts/ExtensionAPI} api
         * @param  {Object} payload
         */
        highlight: function (seriesModel, ecModel, api, payload) {
            toggleHighlight(seriesModel.getData(), payload, 'emphasis');
        },
 
        /**
         * Downplay series or specified data item
         * @param  {module:echarts/model/Series} seriesModel
         * @param  {module:echarts/model/Global} ecModel
         * @param  {module:echarts/ExtensionAPI} api
         * @param  {Object} payload
         */
        downplay: function (seriesModel, ecModel, api, payload) {
            toggleHighlight(seriesModel.getData(), payload, 'normal');
        },
 
        /**
         * Remove self
         * @param  {module:echarts/model/Global} ecModel
         * @param  {module:echarts/ExtensionAPI} api
         */
        remove: function (ecModel, api) {
            this.group.removeAll();
        },
 
        /**
         * Dispose self
         * @param  {module:echarts/model/Global} ecModel
         * @param  {module:echarts/ExtensionAPI} api
         */
        dispose: function () {}
 
        /**
         * The view contains the given point.
         * @interface
         * @param {Array.<number>} point
         * @return {boolean}
         */
        // containPoint: function () {}
 
    };
 
    var chartProto = Chart.prototype;
    chartProto.updateView
        = chartProto.updateLayout
        = chartProto.updateVisual
        = function (seriesModel, ecModel, api, payload) {
            this.render(seriesModel, ecModel, api, payload);
        };
 
    /**
     * Set state of single element
     * @param  {module:zrender/Element} el
     * @param  {string} state
     */
    function elSetState(el, state) {
        if (el) {
            el.trigger(state);
            if (el.type === 'group') {
                for (var i = 0; i < el.childCount(); i++) {
                    elSetState(el.childAt(i), state);
                }
            }
        }
    }
    /**
     * @param  {module:echarts/data/List} data
     * @param  {Object} payload
     * @param  {string} state 'normal'|'emphasis'
     * @inner
     */
    function toggleHighlight(data, payload, state) {
        var dataIndex = modelUtil.queryDataIndex(data, payload);
 
        if (dataIndex != null) {
            zrUtil.each(modelUtil.normalizeToArray(dataIndex), function (dataIdx) {
                elSetState(data.getItemGraphicEl(dataIdx), state);
            });
        }
        else {
            data.eachItemGraphicEl(function (el) {
                elSetState(el, state);
            });
        }
    }
 
    // Enable Chart.extend.
    clazzUtil.enableClassExtend(Chart, ['dispose']);
 
    // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
    clazzUtil.enableClassManagement(Chart, {registerWhenExtend: true});
 
    module.exports = Chart;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/view/Component.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/view/Component.js

Statements: 83.33% (10 / 12)      Branches: 100% (0 / 0)      Functions: 0% (0 / 5)      Lines: 83.33% (10 / 12)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48    1 1 1   1                           1                       1 1             1     1   1    
 
 
    var Group = require('zrender/lib/container/Group');
    var componentUtil = require('../util/component');
    var clazzUtil = require('../util/clazz');
 
    var Component = function () {
        /**
         * @type {module:zrender/container/Group}
         * @readOnly
         */
        this.group = new Group();
 
        /**
         * @type {string}
         * @readOnly
         */
        this.uid = componentUtil.getUID('viewComponent');
    };
 
    Component.prototype = {
 
        constructor: Component,
 
        init: function (ecModel, api) {},
 
        render: function (componentModel, ecModel, api, payload) {},
 
        dispose: function () {}
 
    };
 
    var componentProto = Component.prototype;
    componentProto.updateView
        = componentProto.updateLayout
        = componentProto.updateVisual
        = function (seriesModel, ecModel, api, payload) {
            // Do nothing;
        };
    // Enable Component.extend.
    clazzUtil.enableClassExtend(Component);
 
    // Enable capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
    clazzUtil.enableClassManagement(Component, {registerWhenExtend: true});
 
    module.exports = Component;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/visual/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/visual/

Statements: 18.06% (69 / 382)      Branches: 0% (0 / 209)      Functions: 3.26% (3 / 92)      Lines: 18.06% (69 / 382)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/lib/visual/
File Statements Branches Functions Lines
VisualMapping.js 16.82% (36 / 214) 0% (0 / 131) 5.66% (3 / 53) 16.82% (36 / 214)
dataColor.js 5% (1 / 20) 0% (0 / 10) 0% (0 / 4) 5% (1 / 20)
seriesColor.js 17.65% (3 / 17) 0% (0 / 12) 0% (0 / 4) 17.65% (3 / 17)
symbol.js 5% (1 / 20) 0% (0 / 12) 0% (0 / 4) 5% (1 / 20)
visualDefault.js 66.67% (4 / 6) 0% (0 / 6) 0% (0 / 1) 66.67% (4 / 6)
visualSelectable.js 31.11% (14 / 45) 0% (0 / 8) 0% (0 / 12) 31.11% (14 / 45)
visualSolution.js 16.67% (10 / 60) 0% (0 / 30) 0% (0 / 14) 16.67% (10 / 60)
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/visual/VisualMapping.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/visual/VisualMapping.js

Statements: 16.82% (36 / 214)      Branches: 0% (0 / 131)      Functions: 5.66% (3 / 53)      Lines: 16.82% (36 / 214)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620          1 1 1 1 1   1                                                           1                                                                                                                                 1                           1                                                                                                                                                                                                                         1                           1                                                                         1                                                   1 4                   1             1 3         1                 1       1 6                               1                       1                           1                                                               1                     1             1                   1                 1                                         1                                           1                                                                   1                         1                                                                                                                 1                   1       1      
/**
 * @file Visual mapping.
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
    var zrColor = require('zrender/lib/tool/color');
    var linearMap = require('../util/number').linearMap;
    var each = zrUtil.each;
    var isObject = zrUtil.isObject;
 
    var CATEGORY_DEFAULT_VISUAL_INDEX = -1;
 
    /**
     * @param {Object} option
     * @param {string} [option.type] See visualHandlers.
     * @param {string} [option.mappingMethod] 'linear' or 'piecewise' or 'category' or 'fixed'
     * @param {Array.<number>=} [option.dataExtent] [minExtent, maxExtent],
     *                                              required when mappingMethod is 'linear'
     * @param {Array.<Object>=} [option.pieceList] [
     *                                             {value: someValue},
     *                                             {interval: [min1, max1], visual: {...}},
     *                                             {interval: [min2, max2]}
     *                                             ],
     *                                            required when mappingMethod is 'piecewise'.
     *                                            Visual for only each piece can be specified.
     * @param {Array.<string|Object>=} [option.categories] ['cate1', 'cate2']
     *                                            required when mappingMethod is 'category'.
     *                                            If no option.categories, categories is set
     *                                            as [0, 1, 2, ...].
     * @param {boolean} [option.loop=false] Whether loop mapping when mappingMethod is 'category'.
     * @param {(Array|Object|*)} [option.visual]  Visual data.
     *                                            when mappingMethod is 'category',
     *                                            visual data can be array or object
     *                                            (like: {cate1: '#222', none: '#fff'})
     *                                            or primary types (which represents
     *                                            defualt category visual), otherwise visual
     *                                            can be array or primary (which will be
     *                                            normalized to array).
     *
     */
    var VisualMapping = function (option) {
        var mappingMethod = option.mappingMethod;
        var visualType = option.type;
 
        /**
         * @readOnly
         * @type {Object}
         */
        var thisOption = this.option = zrUtil.clone(option);
 
        /**
         * @readOnly
         * @type {string}
         */
        this.type = visualType;
 
        /**
         * @readOnly
         * @type {string}
         */
        this.mappingMethod = mappingMethod;
 
        /**
         * @private
         * @type {Function}
         */
        this._normalizeData = normalizers[mappingMethod];
 
        var visualHandler = visualHandlers[visualType];
 
        /**
         * @public
         * @type {Function}
         */
        this.applyVisual = visualHandler.applyVisual;
 
        /**
         * @public
         * @type {Function}
         */
        this.getColorMapper = visualHandler.getColorMapper;
 
        /**
         * @private
         * @type {Function}
         */
        this._doMap = visualHandler._doMap[mappingMethod];
 
        if (mappingMethod === 'piecewise') {
            normalizeVisualRange(thisOption);
            preprocessForPiecewise(thisOption);
        }
        else if (mappingMethod === 'category') {
            thisOption.categories
                ? preprocessForSpecifiedCategory(thisOption)
                // categories is ordinal when thisOption.categories not specified,
                // which need no more preprocess except normalize visual.
                : normalizeVisualRange(thisOption, true);
        }
        else { // mappingMethod === 'linear' or 'fixed'
            zrUtil.assert(mappingMethod !== 'linear' || thisOption.dataExtent);
            normalizeVisualRange(thisOption);
        }
    };
 
    VisualMapping.prototype = {
 
        constructor: VisualMapping,
 
        mapValueToVisual: function (value) {
            var normalized = this._normalizeData(value);
            return this._doMap(normalized, value);
        },
 
        getNormalizer: function () {
            return zrUtil.bind(this._normalizeData, this);
        }
    };
 
    var visualHandlers = VisualMapping.visualHandlers = {
 
        color: {
 
            applyVisual: makeApplyVisual('color'),
 
            /**
             * Create a mapper function
             * @return {Function}
             */
            getColorMapper: function () {
                var thisOption = this.option;
 
                return zrUtil.bind(
                    thisOption.mappingMethod === 'category'
                        ? function (value, isNormalized) {
                            !isNormalized && (value = this._normalizeData(value));
                            return doMapCategory.call(this, value);
                        }
                        : function (value, isNormalized, out) {
                            // If output rgb array
                            // which will be much faster and useful in pixel manipulation
                            var returnRGBArray = !!out;
                            !isNormalized && (value = this._normalizeData(value));
                            out = zrColor.fastMapToColor(value, thisOption.parsedVisual, out);
                            return returnRGBArray ? out : zrColor.stringify(out, 'rgba');
                        },
                    this
                );
            },
 
            _doMap: {
                linear: function (normalized) {
                    return zrColor.stringify(
                        zrColor.fastMapToColor(normalized, this.option.parsedVisual),
                        'rgba'
                    );
                },
                category: doMapCategory,
                piecewise: function (normalized, value) {
                    var result = getSpecifiedVisual.call(this, value);
                    if (result == null) {
                        result = zrColor.stringify(
                            zrColor.fastMapToColor(normalized, this.option.parsedVisual),
                            'rgba'
                        );
                    }
                    return result;
                },
                fixed: doMapFixed
            }
        },
 
        colorHue: makePartialColorVisualHandler(function (color, value) {
            return zrColor.modifyHSL(color, value);
        }),
 
        colorSaturation: makePartialColorVisualHandler(function (color, value) {
            return zrColor.modifyHSL(color, null, value);
        }),
 
        colorLightness: makePartialColorVisualHandler(function (color, value) {
            return zrColor.modifyHSL(color, null, null, value);
        }),
 
        colorAlpha: makePartialColorVisualHandler(function (color, value) {
            return zrColor.modifyAlpha(color, value);
        }),
 
        opacity: {
            applyVisual: makeApplyVisual('opacity'),
            _doMap: makeDoMap([0, 1])
        },
 
        symbol: {
            applyVisual: function (value, getter, setter) {
                var symbolCfg = this.mapValueToVisual(value);
                if (zrUtil.isString(symbolCfg)) {
                    setter('symbol', symbolCfg);
                }
                else if (isObject(symbolCfg)) {
                    for (var name in symbolCfg) {
                        if (symbolCfg.hasOwnProperty(name)) {
                            setter(name, symbolCfg[name]);
                        }
                    }
                }
            },
            _doMap: {
                linear: doMapToArray,
                category: doMapCategory,
                piecewise: function (normalized, value) {
                    var result = getSpecifiedVisual.call(this, value);
                    if (result == null) {
                        result = doMapToArray.call(this, normalized);
                    }
                    return result;
                },
                fixed: doMapFixed
            }
        },
 
        symbolSize: {
            applyVisual: makeApplyVisual('symbolSize'),
            _doMap: makeDoMap([0, 1])
        }
    };
 
 
    function preprocessForPiecewise(thisOption) {
        var pieceList = thisOption.pieceList;
        thisOption.hasSpecialVisual = false;
 
        zrUtil.each(pieceList, function (piece, index) {
            piece.originIndex = index;
            // piece.visual is "result visual value" but not
            // a visual range, so it does not need to be normalized.
            if (piece.visual != null) {
                thisOption.hasSpecialVisual = true;
            }
        });
    }
 
    function preprocessForSpecifiedCategory(thisOption) {
        // Hash categories.
        var categories = thisOption.categories;
        var visual = thisOption.visual;
 
        var categoryMap = thisOption.categoryMap = {};
        each(categories, function (cate, index) {
            categoryMap[cate] = index;
        });
 
        // Process visual map input.
        if (!zrUtil.isArray(visual)) {
            var visualArr = [];
 
            if (zrUtil.isObject(visual)) {
                each(visual, function (v, cate) {
                    var index = categoryMap[cate];
                    visualArr[index != null ? index : CATEGORY_DEFAULT_VISUAL_INDEX] = v;
                });
            }
            else { // Is primary type, represents default visual.
                visualArr[CATEGORY_DEFAULT_VISUAL_INDEX] = visual;
            }
 
            visual = setVisualToOption(thisOption, visualArr);
        }
 
        // Remove categories that has no visual,
        // then we can mapping them to CATEGORY_DEFAULT_VISUAL_INDEX.
        for (var i = categories.length - 1; i >= 0; i--) {
            if (visual[i] == null) {
                delete categoryMap[categories[i]];
                categories.pop();
            }
        }
    }
 
    function normalizeVisualRange(thisOption, isCategory) {
        var visual = thisOption.visual;
        var visualArr = [];
 
        if (zrUtil.isObject(visual)) {
            each(visual, function (v) {
                visualArr.push(v);
            });
        }
        else if (visual != null) {
            visualArr.push(visual);
        }
 
        var doNotNeedPair = {color: 1, symbol: 1};
 
        if (!isCategory
            && visualArr.length === 1
            && !doNotNeedPair.hasOwnProperty(thisOption.type)
        ) {
            // Do not care visualArr.length === 0, which is illegal.
            visualArr[1] = visualArr[0];
        }
 
        setVisualToOption(thisOption, visualArr);
    }
 
    function makePartialColorVisualHandler(applyValue) {
        return {
            applyVisual: function (value, getter, setter) {
                value = this.mapValueToVisual(value);
                // Must not be array value
                setter('color', applyValue(getter('color'), value));
            },
            _doMap: makeDoMap([0, 1])
        };
    }
 
    function doMapToArray(normalized) {
        var visual = this.option.visual;
        return visual[
            Math.round(linearMap(normalized, [0, 1], [0, visual.length - 1], true))
        ] || {};
    }
 
    function makeApplyVisual(visualType) {
        return function (value, getter, setter) {
            setter(visualType, this.mapValueToVisual(value));
        };
    }
 
    function doMapCategory(normalized) {
        var visual = this.option.visual;
        return visual[
            (this.option.loop && normalized !== CATEGORY_DEFAULT_VISUAL_INDEX)
                ? normalized % visual.length
                : normalized
        ];
    }
 
    function doMapFixed() {
        return this.option.visual[0];
    }
 
    function makeDoMap(sourceExtent) {
        return {
            linear: function (normalized) {
                return linearMap(normalized, sourceExtent, this.option.visual, true);
            },
            category: doMapCategory,
            piecewise: function (normalized, value) {
                var result = getSpecifiedVisual.call(this, value);
                if (result == null) {
                    result = linearMap(normalized, sourceExtent, this.option.visual, true);
                }
                return result;
            },
            fixed: doMapFixed
        };
    }
 
    function getSpecifiedVisual(value) {
        var thisOption = this.option;
        var pieceList = thisOption.pieceList;
        if (thisOption.hasSpecialVisual) {
            var pieceIndex = VisualMapping.findPieceIndex(value, pieceList);
            var piece = pieceList[pieceIndex];
            if (piece && piece.visual) {
                return piece.visual[this.type];
            }
        }
    }
 
    function setVisualToOption(thisOption, visualArr) {
        thisOption.visual = visualArr;
        if (thisOption.type === 'color') {
            thisOption.parsedVisual = zrUtil.map(visualArr, function (item) {
                return zrColor.parse(item);
            });
        }
        return visualArr;
    }
 
 
    /**
     * Normalizers by mapping methods.
     */
    var normalizers = {
 
        linear: function (value) {
            return linearMap(value, this.option.dataExtent, [0, 1], true);
        },
 
        piecewise: function (value) {
            var pieceList = this.option.pieceList;
            var pieceIndex = VisualMapping.findPieceIndex(value, pieceList, true);
            if (pieceIndex != null) {
                return linearMap(pieceIndex, [0, pieceList.length - 1], [0, 1], true);
            }
        },
 
        category: function (value) {
            var index = this.option.categories
                ? this.option.categoryMap[value]
                : value; // ordinal
            return index == null ? CATEGORY_DEFAULT_VISUAL_INDEX : index;
        },
 
        fixed: zrUtil.noop
    };
 
 
 
    /**
     * List available visual types.
     *
     * @public
     * @return {Array.<string>}
     */
    VisualMapping.listVisualTypes = function () {
        var visualTypes = [];
        zrUtil.each(visualHandlers, function (handler, key) {
            visualTypes.push(key);
        });
        return visualTypes;
    };
 
    /**
     * @public
     */
    VisualMapping.addVisualHandler = function (name, handler) {
        visualHandlers[name] = handler;
    };
 
    /**
     * @public
     */
    VisualMapping.isValidType = function (visualType) {
        return visualHandlers.hasOwnProperty(visualType);
    };
 
    /**
     * Convinent method.
     * Visual can be Object or Array or primary type.
     *
     * @public
     */
    VisualMapping.eachVisual = function (visual, callback, context) {
        if (zrUtil.isObject(visual)) {
            zrUtil.each(visual, callback, context);
        }
        else {
            callback.call(context, visual);
        }
    };
 
    VisualMapping.mapVisual = function (visual, callback, context) {
        var isPrimary;
        var newVisual = zrUtil.isArray(visual)
            ? []
            : zrUtil.isObject(visual)
            ? {}
            : (isPrimary = true, null);
 
        VisualMapping.eachVisual(visual, function (v, key) {
            var newVal = callback.call(context, v, key);
            isPrimary ? (newVisual = newVal) : (newVisual[key] = newVal);
        });
        return newVisual;
    };
 
    /**
     * @public
     * @param {Object} obj
     * @return {Oject} new object containers visual values.
     *                 If no visuals, return null.
     */
    VisualMapping.retrieveVisuals = function (obj) {
        var ret = {};
        var hasVisual;
 
        obj && each(visualHandlers, function (h, visualType) {
            if (obj.hasOwnProperty(visualType)) {
                ret[visualType] = obj[visualType];
                hasVisual = true;
            }
        });
 
        return hasVisual ? ret : null;
    };
 
    /**
     * Give order to visual types, considering colorSaturation, colorAlpha depends on color.
     *
     * @public
     * @param {(Object|Array)} visualTypes If Object, like: {color: ..., colorSaturation: ...}
     *                                     IF Array, like: ['color', 'symbol', 'colorSaturation']
     * @return {Array.<string>} Sorted visual types.
     */
    VisualMapping.prepareVisualTypes = function (visualTypes) {
        if (isObject(visualTypes)) {
            var types = [];
            each(visualTypes, function (item, type) {
                types.push(type);
            });
            visualTypes = types;
        }
        else if (zrUtil.isArray(visualTypes)) {
            visualTypes = visualTypes.slice();
        }
        else {
            return [];
        }
 
        visualTypes.sort(function (type1, type2) {
            // color should be front of colorSaturation, colorAlpha, ...
            // symbol and symbolSize do not matter.
            return (type2 === 'color' && type1 !== 'color' && type1.indexOf('color') === 0)
                ? 1 : -1;
        });
 
        return visualTypes;
    };
 
    /**
     * 'color', 'colorSaturation', 'colorAlpha', ... are depends on 'color'.
     * Other visuals are only depends on themself.
     *
     * @public
     * @param {string} visualType1
     * @param {string} visualType2
     * @return {boolean}
     */
    VisualMapping.dependsOn = function (visualType1, visualType2) {
        return visualType2 === 'color'
            ? !!(visualType1 && visualType1.indexOf(visualType2) === 0)
            : visualType1 === visualType2;
    };
 
    /**
     * @param {number} value
     * @param {Array.<Object>} pieceList [{value: ..., interval: [min, max]}, ...]
     *                         Always from small to big.
     * @param {boolean} [findClosestWhenOutside=false]
     * @return {number} index
     */
    VisualMapping.findPieceIndex = function (value, pieceList, findClosestWhenOutside) {
        var possibleI;
        var abs = Infinity;
 
        // value has the higher priority.
        for (var i = 0, len = pieceList.length; i < len; i++) {
            var pieceValue = pieceList[i].value;
            if (pieceValue != null) {
                if (pieceValue === value
                    // FIXME
                    // It is supposed to compare value according to value type of dimension,
                    // but currently value type can exactly be string or number.
                    // Compromise for numeric-like string (like '12'), especially
                    // in the case that visualMap.categories is ['22', '33'].
                    || (typeof pieceValue === 'string' && pieceValue === value + '')
                ) {
                    return i;
                }
                findClosestWhenOutside && updatePossible(pieceValue, i);
            }
        }
 
        for (var i = 0, len = pieceList.length; i < len; i++) {
            var piece = pieceList[i];
            var interval = piece.interval;
            var close = piece.close;
 
            if (interval) {
                if (interval[0] === -Infinity) {
                    if (littleThan(close[1], value, interval[1])) {
                        return i;
                    }
                }
                else if (interval[1] === Infinity) {
                    if (littleThan(close[0], interval[0], value)) {
                        return i;
                    }
                }
                else if (
                    littleThan(close[0], interval[0], value)
                    && littleThan(close[1], value, interval[1])
                ) {
                    return i;
                }
                findClosestWhenOutside && updatePossible(interval[0], i);
                findClosestWhenOutside && updatePossible(interval[1], i);
            }
        }
 
        if (findClosestWhenOutside) {
            return value === Infinity
                ? pieceList.length - 1
                : value === -Infinity
                ? 0
                : possibleI;
        }
 
        function updatePossible(val, index) {
            var newAbs = Math.abs(val - value);
            if (newAbs < abs) {
                abs = newAbs;
                possibleI = index;
            }
        }
 
    };
 
    function littleThan(close, a, b) {
        return close ? a <= b : a < b;
    }
 
    module.exports = VisualMapping;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/visual/dataColor.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/visual/dataColor.js

Statements: 5% (1 / 20)      Branches: 0% (0 / 10)      Functions: 0% (0 / 4)      Lines: 5% (1 / 20)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47          1                                                                                  
// Pick color from palette for each data item.
// Applicable for charts that require applying color palette
// in data level (like pie, funnel, chord).
 
 
    module.exports = function (seriesType, ecModel) {
        // Pie and funnel may use diferrent scope
        var paletteScope = {};
        ecModel.eachRawSeriesByType(seriesType, function (seriesModel) {
            var dataAll = seriesModel.getRawData();
            var idxMap = {};
            if (!ecModel.isSeriesFiltered(seriesModel)) {
                var data = seriesModel.getData();
                data.each(function (idx) {
                    var rawIdx = data.getRawIndex(idx);
                    idxMap[rawIdx] = idx;
                });
                dataAll.each(function (rawIdx) {
                    var filteredIdx = idxMap[rawIdx];
 
                    // If series.itemStyle.normal.color is a function. itemVisual may be encoded
                    var singleDataColor = filteredIdx != null
                        && data.getItemVisual(filteredIdx, 'color', true);
 
                    if (!singleDataColor) {
                        // FIXME Performance
                        var itemModel = dataAll.getItemModel(rawIdx);
                        var color = itemModel.get('itemStyle.normal.color')
                            || seriesModel.getColorFromPalette(dataAll.getName(rawIdx), paletteScope);
                        // Legend may use the visual info in data before processed
                        dataAll.setItemVisual(rawIdx, 'color', color);
 
                        // Data is not filtered
                        if (filteredIdx != null) {
                            data.setItemVisual(filteredIdx, 'color', color);
                        }
                    }
                    else {
                        // Set data all color for legend
                        dataAll.setItemVisual(rawIdx, 'color', singleDataColor);
                    }
                });
            }
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/visual/seriesColor.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/visual/seriesColor.js

Statements: 17.65% (3 / 17)      Branches: 0% (0 / 12)      Functions: 0% (0 / 4)      Lines: 17.65% (3 / 17)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36  1 1 1                                                                
 
    var Gradient = require('zrender/lib/graphic/Gradient');
    module.exports = function (ecModel) {
        function encodeColor(seriesModel) {
            var colorAccessPath = (seriesModel.visualColorAccessPath || 'itemStyle.normal.color').split('.');
            var data = seriesModel.getData();
            var color = seriesModel.get(colorAccessPath) // Set in itemStyle
                || seriesModel.getColorFromPalette(seriesModel.get('name'));  // Default color
 
            // FIXME Set color function or use the platte color
            data.setVisual('color', color);
 
            // Only visible series has each data be visual encoded
            if (!ecModel.isSeriesFiltered(seriesModel)) {
                if (typeof color === 'function' && !(color instanceof Gradient)) {
                    data.each(function (idx) {
                        data.setItemVisual(
                            idx, 'color', color(seriesModel.getDataParams(idx))
                        );
                    });
                }
 
                // itemStyle in each data item
                data.each(function (idx) {
                    var itemModel = data.getItemModel(idx);
                    var color = itemModel.get(colorAccessPath, true);
                    if (color != null) {
                        data.setItemVisual(idx, 'color', color);
                    }
                });
            }
        }
        ecModel.eachRawSeries(encodeColor);
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/visual/symbol.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/visual/symbol.js

Statements: 5% (1 / 20)      Branches: 0% (0 / 12)      Functions: 0% (0 / 4)      Lines: 5% (1 / 20)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45    1                                                                                    
 
 
    module.exports = function (seriesType, defaultSymbolType, legendSymbol, ecModel, api) {
 
        // Encoding visual for all series include which is filtered for legend drawing
        ecModel.eachRawSeriesByType(seriesType, function (seriesModel) {
            var data = seriesModel.getData();
 
            var symbolType = seriesModel.get('symbol') || defaultSymbolType;
            var symbolSize = seriesModel.get('symbolSize');
 
            data.setVisual({
                legendSymbol: legendSymbol || symbolType,
                symbol: symbolType,
                symbolSize: symbolSize
            });
 
            // Only visible series has each data be visual encoded
            if (!ecModel.isSeriesFiltered(seriesModel)) {
                if (typeof symbolSize === 'function') {
                    data.each(function (idx) {
                        var rawValue = seriesModel.getRawValue(idx);
                        // FIXME
                        var params = seriesModel.getDataParams(idx);
                        data.setItemVisual(idx, 'symbolSize', symbolSize(rawValue, params));
                    });
                }
                data.each(function (idx) {
                    var itemModel = data.getItemModel(idx);
                    var itemSymbolType = itemModel.getShallow('symbol', true);
                    var itemSymbolSize = itemModel.getShallow('symbolSize', true);
                    // If has item symbol
                    if (itemSymbolType != null) {
                        data.setItemVisual(idx, 'symbol', itemSymbolType);
                    }
                    if (itemSymbolSize != null) {
                        // PENDING Transform symbolSize ?
                        data.setItemVisual(idx, 'symbolSize', itemSymbolSize);
                    }
                });
            }
        });
    };
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/visual/visualDefault.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/visual/visualDefault.js

Statements: 66.67% (4 / 6)      Branches: 0% (0 / 6)      Functions: 0% (0 / 1)      Lines: 66.67% (4 / 6)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72          1   1                                 1                                                                                     1        
/**
 * @file Visual mapping.
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
 
    var visualDefault = {
 
        /**
         * @public
         */
        get: function (visualType, key, isCategory) {
            var value = zrUtil.clone(
                (defaultOption[visualType] || {})[key]
            );
 
            return isCategory
                ? (zrUtil.isArray(value) ? value[value.length - 1] : value)
                : value;
        }
 
    };
 
    var defaultOption = {
 
        color: {
            active: ['#006edd', '#e0ffff'],
            inactive: ['rgba(0,0,0,0)']
        },
 
        colorHue: {
            active: [0, 360],
            inactive: [0, 0]
        },
 
        colorSaturation: {
            active: [0.3, 1],
            inactive: [0, 0]
        },
 
        colorLightness: {
            active: [0.9, 0.5],
            inactive: [0, 0]
        },
 
        colorAlpha: {
            active: [0.3, 1],
            inactive: [0, 0]
        },
 
        opacity: {
            active: [0.3, 1],
            inactive: [0, 0]
        },
 
        symbol: {
            active: ['circle', 'roundRect', 'diamond'],
            inactive: ['none']
        },
 
        symbolSize: {
            active: [10, 50],
            inactive: [0, 0]
        }
    };
 
    module.exports = visualDefault;
 
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/visual/visualSelectable.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/visual/visualSelectable.js

Statements: 31.11% (14 / 45)      Branches: 0% (0 / 8)      Functions: 0% (0 / 12)      Lines: 31.11% (14 / 45)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152                                          2 2 2   2   2 2             2                                       2                               2                                     1             1                                     1         1                       1                                    
 
 
    /**
     * Usage:
     *      SomeSeries = visualSelectable(SomeSeries);
     *
     * In option:
     *      `option.series.selectedDataIndex`
     *          is taken to specified selected data indices when setOption.
     *          If option.series.selectedDataIndex is null/undefined,
     *          nothing selected.
     *          If option.series.selectedDataIndex is [3, 4, 6], data
     *          items at indices 3, 4, 6 is selected.
     *      `option.series.visualSelectable`
     *          is taken to enable or disable select for a selectable series,
     *          default true.
     *      `option.series.visualInSelect` and
     *      `option.series.visualOutOfSelect`
     *          is taken to specify visuals in those states.
     */
 
    var echarts = require('../echarts');
    var zrUtil = require('zrender/lib/core/util');
    var visualSolution = require('./visualSolution');
 
    var each = zrUtil.each;
 
    var STATE_LIST = ['visualInSelect', 'visualOutOfSelect'];
    var MAP_ATTR = '\0__selectedMap'; // forbiden user access.
 
 
    /**
     * defaultOption can be overrided in series.
     * @type {Object}
     */
    var defaultOption = {
        visualSelectable: true,
        visualInSelect: {
        },
        visualOutOfSelect: {
            color: '#ccc'
        }
    };
 
 
    /**
     * Register the action if this modules required.
     * payload: {
     *      seriesIndex: number, or,
     *      seriesId: string, or,
     *      seriesName: string,
     *      dataIndex: Array, or,
     *      dataIndexMap: Array,
     * }
     */
    echarts.registerAction(
        {type: 'select', event: 'select', update: 'updateView'},
        function (payload, ecModel) {
            var seriesList = ecModel.findComponents(
                {mainType: 'series', query: payload}
            );
            each(seriesList, function (seriesModel) {
                resetSelectedMapInAction(seriesModel, payload);
            });
        }
    );
 
 
    /**
     * Register the visual encoding if this modules required.
     */
    echarts.registerVisual(echarts.PRIORITY.VISUAL.SELECT, function (ecModel) {
 
        ecModel.eachSeries(function (seriesModel) {
            var dataIndexMap = seriesModel[MAP_ATTR];
 
            if (!dataIndexMap) {
                return;
            }
 
            var visualMappings = visualSolution.createVisualMappings(
                seriesModel.option, STATE_LIST, function (mappingOption) {
                    mappingOption.mappingMethod = 'fixed';
                }
            );
 
            visualSolution.applyVisual(
                STATE_LIST, visualMappings, seriesModel.getData(), getValueState
            );
 
            function getValueState(dataIndex) {
                return dataIndexMap[dataIndex] ? 'visualInSelect' : 'visualOutOfSelect';
            }
        });
    });
 
 
    function visualSelectable(SeriesClz) {
        var proto = SeriesClz.prototype;
 
        // This method is only internally used in echarts.
        proto.getSelectedDataIndexMap = getSelectedDataIndexMap;
 
        var rawOptionUpdated = proto.optionUpdated;
        proto.optionUpdated = function () {
            var ret = rawOptionUpdated.apply(this, arguments);
            // Clear selectd each time setOption called.
            resetSelectedMapByDataIndices(this, this.option.selectedDataIndex);
            return ret;
        };
 
        zrUtil.defaults(proto.defaultOption, defaultOption);
 
        return SeriesClz;
    }
 
    function getSelectedDataIndexMap() {
        // Do not clone the big object.
        return this[MAP_ATTR];
    }
 
    function resetSelectedMapByDataIndices(seriesModel, dataIndices) {
        // Always clear when no option.selected.
        var dataIndexMap = seriesModel[MAP_ATTR] = null;
 
        if (dataIndices instanceof Array) {
            var dataIndexMap = seriesModel[MAP_ATTR] = Array(seriesModel.getData().count());
            each(dataIndices, function (dataIndex) {
                dataIndexMap[dataIndex] = 1;
            });
        }
    }
 
    function resetSelectedMapInAction(seriesModel, payload) {
        var dataIndexMap = payload.dataIndexMap;
 
        // Support dataIndexMap to reuse the big object to avoid GC frequently.
        if (dataIndexMap) {
            seriesModel[MAP_ATTR] = dataIndexMap;
        }
        else {
            resetSelectedMapByDataIndices(seriesModel, payload.dataIndex);
        }
 
        // FIXME
        // Do not reset option.selected here for performance
        // consideration. Do that in getOption or getSelected().
    }
 
    module.exports = visualSelectable;
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/visual/visualSolution.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/lib/visual/visualSolution.js

Statements: 16.67% (10 / 60)      Branches: 0% (0 / 30)      Functions: 0% (0 / 14)      Lines: 16.67% (10 / 60)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151          1 1 1   1                   1                                                                         1                                                                                                         1       1                     1                                             1      
/**
 * @file Visual solution, for consistent option specification.
 */
 
 
    var zrUtil = require('zrender/lib/core/util');
    var VisualMapping = require('./VisualMapping');
    var each = zrUtil.each;
 
    function hasKeys(obj) {
        if (obj) {
            for (var name in obj){
                if (obj.hasOwnProperty(name)) {
                    return true;
                }
            }
        }
    }
 
    var visualSolution = {
 
        /**
         * @param {Object} option
         * @param {Array.<string>} stateList
         * @param {Function} [supplementVisualOption]
         * @return {Object} visualMappings <state, <visualType, module:echarts/visual/VisualMapping>>
         */
        createVisualMappings: function (option, stateList, supplementVisualOption) {
            var visualMappings = {};
 
            each(stateList, function (state) {
                var mappings = visualMappings[state] = createMappings();
 
                each(option[state], function (visualData, visualType) {
                    if (!VisualMapping.isValidType(visualType)) {
                        return;
                    }
                    var mappingOption = {
                        type: visualType,
                        visual: visualData
                    };
                    supplementVisualOption && supplementVisualOption(mappingOption, state);
                    mappings[visualType] = new VisualMapping(mappingOption);
 
                    // Prepare a alpha for opacity, for some case that opacity
                    // is not supported, such as rendering using gradient color.
                    if (visualType === 'opacity') {
                        mappingOption = zrUtil.clone(mappingOption);
                        mappingOption.type = 'colorAlpha';
                        mappings.__hidden.__alphaForOpacity = new VisualMapping(mappingOption);
                    }
                });
            });
 
            return visualMappings;
 
            function createMappings() {
                var Creater = function () {};
                // Make sure hidden fields will not be visited by
                // object iteration (with hasOwnProperty checking).
                Creater.prototype.__hidden = Creater.prototype;
                var obj = new Creater();
                return obj;
            }
        },
 
        /**
         * @param {Object} thisOption
         * @param {Object} newOption
         * @param {Array.<string>} keys
         */
        replaceVisualOption: function (thisOption, newOption, keys) {
            // Visual attributes merge is not supported, otherwise it
            // brings overcomplicated merge logic. See #2853. So if
            // newOption has anyone of these keys, all of these keys
            // will be reset. Otherwise, all keys remain.
            var has;
            zrUtil.each(keys, function (key) {
                if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) {
                    has = true;
                }
            });
            has && zrUtil.each(keys, function (key) {
                if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) {
                    thisOption[key] = zrUtil.clone(newOption[key]);
                }
                else {
                    delete thisOption[key];
                }
            });
        },
 
        /**
         * @param {Array.<string>} stateList
         * @param {Object} visualMappings <state, Object.<visualType, module:echarts/visual/VisualMapping>>
         * @param {module:echarts/data/List} list
         * @param {Function} getValueState param: valueOrIndex, return: state.
         * @param {object} [scope] Scope for getValueState
         * @param {string} [dimension] Concrete dimension, if used.
         */
        applyVisual: function (stateList, visualMappings, data, getValueState, scope, dimension) {
            var visualTypesMap = {};
            zrUtil.each(stateList, function (state) {
                var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]);
                visualTypesMap[state] = visualTypes;
            });
 
            var dataIndex;
 
            function getVisual(key) {
                return data.getItemVisual(dataIndex, key);
            }
 
            function setVisual(key, value) {
                data.setItemVisual(dataIndex, key, value);
            }
 
            if (dimension == null) {
                data.each(eachItem, true);
            }
            else {
                data.each([dimension], eachItem, true);
            }
 
            function eachItem(valueOrIndex, index) {
                dataIndex = dimension == null ? valueOrIndex : index;
 
                var rawDataItem = data.getRawDataItem(dataIndex);
                // Consider performance
                if (rawDataItem && rawDataItem.visualMap === false) {
                    return;
                }
 
                var valueState = getValueState.call(scope, valueOrIndex);
                var mappings = visualMappings[valueState];
                var visualTypes = visualTypesMap[valueState];
 
                for (var i = 0, len = visualTypes.length; i < len; i++) {
                    var type = visualTypes[i];
                    mappings[type] && mappings[type].applyVisual(
                        valueOrIndex, getVisual, setVisual
                    );
                }
            }
        }
    };
 
    module.exports = visualSolution;
 
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/map/js/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/map/js/

Statements: 50% (24 / 48)      Branches: 41.18% (21 / 51)      Functions: 66.67% (6 / 9)      Lines: 50% (24 / 48)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/map/js/
File Statements Branches Functions Lines
china-contour.js 50% (8 / 16) 41.18% (7 / 17) 66.67% (2 / 3) 50% (8 / 16)
china.js 50% (8 / 16) 41.18% (7 / 17) 66.67% (2 / 3) 50% (8 / 16)
world.js 50% (8 / 16) 41.18% (7 / 17) 66.67% (2 / 3) 50% (8 / 16)
Code coverage report for node-npmtest-echarts/node_modules/echarts/map/js/china-contour.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/map/js/china-contour.js

Statements: 50% (8 / 16)      Branches: 41.18% (7 / 17)      Functions: 66.67% (2 / 3)      Lines: 50% (8 / 16)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 281 1     1   1           1         1       1       1    
(function (root, factory) {
    Iif (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['exports', 'echarts'], factory);
    } else Eif (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
        // CommonJS
        factory(exports, require('echarts'));
    } else {
        // Browser globals
        factory({}, root.echarts);
    }
}(this, function (exports, echarts) {
    var log = function (msg) {
        if (typeof console !== 'undefined') {
            console && console.error && console.error(msg);
        }
    }
    Iif (!echarts) {
        log('ECharts is not Loaded');
        return;
    }
    Iif (!echarts.registerMap) {
        log('ECharts Map is not loaded')
        return;
    }
    echarts.registerMap('china-contour', {"type":"FeatureCollection","features":[{"id":"100000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@š¦ŜiÀºƦ‘ƞò–ïè§ŞCêɕrŧůÇąĻõ™·ĉ³œ̅ó­@ċȧƒŧĥ‰Ľʉ­ƅſ“ȓÒ˦ŝE}ºƑ[ÍĜȋ AɞÏĤ¨êƺ\\Ɔ¸ĠĎvʄȀœÐ¾jNðĒĞȠzÐŘΰH¨ȔBĠ "],["@@ƛĴÕƊÉɼģºðʀI̠ÔĚäœθؾNJŨxĚĮǂƺòƌ‚ĪŐĮXŦţƸZûЋƕƑ’ʳÛDžƝɉlÝƯֹÅŃ^Ó·śŃNjƏďíåɛGɉ™¿@ăƑŽ¥ĘWǬÏĶŁâ"],["@@Óɖ± dƊ½ǒÂň×äı–§ĤƩ™¶hlçxĬŸĄŞkâ’ÌwøàIJaĞ‚fƠ¥Ž„Ŕdž˜®UɎÖ¢aƆúŪtŠųƠjd•ƺŠƺÅìnŽŢ¯äɝĦ]èpĄ¦´LƞĬŠ´ƤǬ˼Ēɸ¤rºǼìĴPðŀbþ¹ļD¢¹œ\\ĜÑ̔ùўÊ‰ȮŒǪűŽÀêZǚŐ¤qȂ\\`ºłĤ\\ºs|zºÿŐãѦvĪĺĺ†ĈłÈ͚FÞºĠUƢ¾ªì°`öøu®Ì¼ãÐUÞ˶¬æɒlʐߨvWʚ”ÖÕÁÜÅŵ­_«”E”ÍɪëÏ÷ÅyXo͂ĝĂÛÎf`Þ…¹ÂÿÐGĮÕĞXŪōŸMźÈƺQèĽôe|¿ƸJR¤ĘETėº¯ɀáMĺŝOéȇ¿ÖğǤǷŔ²å]­Ĥĝ‰œ¦EP}ûƥé¿İƷTėƫœŕƅ™ƱB»Đ±‚řü›]µȺrĦáŖuҞª«IJ‡πdƺÏɌ]͚œĐ™ǂZɔ¹ÚZצʥĪï|ÇĦMŔ»İĝLj‹ì¥Βœba­¯¥Ǖǚk˦ӷxūД̵nơԆ|DŽŽࡰţાíϲäʮW¬®ҌeרūȠkɬɻ̼ãɜRצɩςåȈHϚÎKdzͲOðÏȆƘ¼CϚǚ࢚˼ФԂ¤ƌžĞ̪Qʤ´ԜÃƲÀɠmǐnȺĸƠ´ǠNˠŜ‚¶ƌĆĘźʆȬμƒĞGȖƴƀj`ĢçĶȅŚē̃ĖćšYŒÀŎüôQÐÂŎŞdžŞêƖš˜oˆDƞŧǘÛۨĝȘIJžªǬ”¾äʀƪ¼Ð€Ĕǎ¨Ȕ»͠^ˮÊ˰ȎŜHĦðDĝŒ|ø˂˜ƮÐ¬ҌqjĔ²Äw°dždĞéĸdîàŎjɒĚŌ‡ŜWÈ|Ŗ‡¶îÎFC•ĊZĀēƄNĤ¶ŠłKĊOj“Ě”j´ĜYp˜{¦„ˆSĚÍ\\Tš×ªV–÷Šų¬K°ȧǵÂcḷ̌ĚǣȄɧ\\ĵœŇ‹ȣFέ̿ʏƶɷØ̫»ƽū¹Ʊő̝Ȩ§ȞʘĖiɜɶʦ}¨֪ࠜ̀ƇǬ¹ǨE˦ĥªÔDzlжøZh¤Ɛ E ĈDJ˜ì¸̚¸ƎGú´Pž¬WÄì–HsIJ¾wLVnƽCw`h`¥V”„¦U¤¸}€¾Ô[~âxh¢ªHÆÂr–iĐɘǜhÀoRzNy˜ÀDs~€bcfÌ`L–¾n‹|¾T‚°c¨È¢a‚ÈÄ[|òDȎŸÖdH„Ʈ–Àì~Ǝ†â•¦^¢ķ¶e”ÐÚEꖄɡČÅyġLû™ŇV®ŠÄ‰Ðź~ϰƂŤǒȦÒŬÂezÂvǴZ„{ĘFǜĴAΜĐȄEÔ¤ØQĄ–Ą»ΈZǺ¨ìSŊÄƸwŠn¼–c]—ܬì¯DŽ]ȘŏńzƺŷɄeeOĨS’Œfm Ɋ’̎ēz©þ†ÐÙÊmgŸÇsJ¥ƔˆŊśÎÔsÁtÃßGo—À­ xňË_½ä@êíuáĠ[ġ¥g“ɊדûÏWXáǠDZÌsNͽƎÁ§č՛AēeL³àydl›¦ĘVçŁpśdžĽĺſʃQíÜçÛġԏsĕ¬—Dz¡SíċġHµ ¡EŃļƒrĉŘóƢFƺ«øxÊk†”ƈdƬÌr|©ÛńRŀƒøďŊœŀ›ˆàŀU²ŕƀB‚Q£Ď}L¹Îk@©ĈuǰųǨ”Ú§ƈnTËÇéƟÊcfčŤ^gēĊĕƯǏx³ǔķÐċJā‚wİ_ĸ˜Ȁ^ôWr­°oú¬Ɏ‘~”ȰCĐ´Ƕ£’fNÎèâ_ÐŮeʆNJǘuȔ\\¤ÒĨA¢Ê͠æÔ ŬGƠ”ƦYê‹ŊàƆXvkmŸͥœ@čŅĻA“¶çÎqC½Ĉ»NŸăëK™ďÍQ“Ʌ›řęgßÔÇOÝáWáħ£˯ā¡ÑķĎÛ寰WKɱ_d_}}vyŸõu¬ïÏҽ@gÏ¿rýб…Cd‰µ—°MFYxw¿CG£ǧ«»ó¡Ɵš¿BÇƻğëšܭNJĭôµ}‰čÓpg±˜ƒǫŋRwŕnéÑƕfSŸŋ‹®ÍšD Ûǖ֍Ÿ]gr¡µŷzįm³~S«“„›þeo³l™•{iē¥yZ÷īŖõġMRÇģZ“mÃ|¡™ģTɟij“Â`À–çm‰‘FK¥ÚíÁbXš³ÌQґHof{‰]e€pt·GŋĜTNJŋB…h–¬ƩDoˆ±enq©G`™wGçǑ‚“K‰‹F‚“›uNĝw‡őXtW·Ýďæßa}xV•—XR‰ãQ`­©GŒM»­”ďϝd‡©ÑW_ÏǷr¡…é\\ƒɹ~ɍuØ©Bš¤ÝĤ½¢Å_Á¿•LŅñuT\\rÅIs®y}’ywdS™DZtCmûvašʋJr€Ư‚⦳P‡rbbÍzš€wBG’ĭ€T†Ák‘»ƒlY­ċ²z“Ç£—^§»d¯íŻŽ£ćGŵDžƍÓ]í“M^o•£Ã]ªUóo½~ŕ‘|ŋݘ¥ċh“¹·CÉ­Dřlg‡ȵë[‘’}ģS}xƃği©ĝ‡ɝǡF꼵áƣ©‚Hžĕoƫ€Ňqƒr³Ãg[„šÃS–ő_†±ÅFC¥Pq{‚ñg—¿įX…•ƝıĉNj•ûěʼn³F‘¦oĵ—hŸÕP{¯~TÍl¸ÓßYÏàs{ÃVU™™eĎwk±ʼnVÓ½ŽJūĉ»Jm°fϑdF~ˆ€ĀeĖ€O˜² Ĉ‰żĀiÂd^~ăÔHˆ¦\\§|ĄVez¤NP ǹӗR™ÆƇP[¦´Âghwm}ÐШźhI|žVVŽ—Ž|p[¦À¶èNä¶ÒCÀ¢^h—PfvƾĪ×òúNZÞÒKxpw|ÊEZŽI¨®œİFÜçmĩ‚WĪñt‘ÞʼnËÝ^³uL‚±|Əlĉ¥čn§ßÅc‘˜B× CNƒǟ‹_ñŧı¯Y]ăٟ™Ľѷť‹³ÃAR‹‡ZRlʑýSëÍDěïÿȧ¢ÙġƒěŗŷęŸUªhJˆƁ™ƅn³gF‹³HàŋÅÃƉÀKšť`ċŮÁõYėé÷`ٚ_Ïǵ—R§òoEÅąLœŐœƜVµąłíļĐ·ũ̈«ªdÎɜnb²ĦhņBĖ›žįĦåXćì@L¯´ywƕCéõė ƿäćú y±¨Mf~C¿`€à_ŒÿƌfQnð³ƬˆŲŎ¥ĠʦĘĒØ‰¼Â†±ŴPè¸ŔLƔÜƺ_T‘üÃĤBBċȉöA´fa„˜M¨{«Múīô‰Ö°ʊkŲÆM|²@¤u•ƒ¤Û´Œä«̰\\„}ēƒ‹ÅM•¼Ã­]NągoõľH‰yGă{{çrnÓE‰‹ƕZGª¹Fj¢ïW…uøC̍ƃhÛ­–Ň\\bÅxì²ƝýN‰īCȽĿǃšŖÕy\\‡¹kx‡Ã£Č×G¿Ï¤ÁçFQ¡„KtŵΥëÚź—Љ«ėn½ĉŀ—›Á¼zK›¶†G•­Y§Ëƒ@–´śÇµƕñžx———Z¯u™Œ…Ï•˜ï{éƵP—™_K«™pÍÁwƏčaE›U”£uݘāɌŁFŴu»¹İ×ȖħŴw̌ŵ²ǹǠ͛hĭłƕrçü±hǥ®jű¢KOķÅ}`åÂK­_Юƫ²ʯÊ^H{ǸÃĆēĤȍzȥݵċF͓ŸI©Õ͈ǫȌȥ¦ŋEӏ“†ıŪěřÀåżȟLƏ—ŽąđGǛģLjƧĎOłčȶʋÀBŖÕªˆŠÁŐTőŕåqûõi¨hÜ·ƒñt»¹ýv_[«²Kƒ{L¯‰SªƒGѵ¸•gÑpY´«•ęœƘʑcoċ\\œ­gěŧ«Āý¶ŧ·Å”KsËɏc¢Ù\\ĭƛëbf¹­ģSƒĜkáƉÔ­ĈZ~﵉fzʼnfåÂȝǷÕĕÊĉ{ğč±uƁí]Í»ęX\\­•Ip™¡éĥZE‹ãoP…þy—¸k³—†¡ƽŸ¿å³BRضˆœWlâþäą`“]aģc— ĹGµ¶H™åՌ‰¾xĨ‡ôȉðX«½đCIŇOK³Á‰Äţ¬OAwã»aLʼn‡ËĥW[“ÂGI—ÂNrį~IМ‘êĘÎG§Ė¥Ý™F{ WK}ùaH‘āÖ{OoužHEÅǍqĬuë±KEò£‰UplÀ÷tMāe£bYÂý¡a±Öcp©®^ö±q…ÇGjųªKy¬ŏ–®¤ÉEŸ–ĀåA¬ˆV{Xģ‰Đƒpě…¼³Ăp·¤ƒīyÚ¡ŅLĻŗž§qlŸÀh¬µ»åÇGnùčÙmÆß–ėu›ĕeûҍiÁŧSW¥˜QŠûŗ½ùěYÓ±]ÓđīkWó«íěCŸŇͱ™‘čvĭõĉ‚ę÷N¹³ĉoTĵËçŁYلǝŕ¹tȏģ·Ĕĭ|đėÊK™½R‘ē ó]™ĀęAx–ŸNk©|ām‡¡diď×YïYWªʼnOeÚtĐ«zđ¹T…ā‡úE™áÎÁąÏŸHcòßÎſ¿Çdğ·ùT×Çūʄ¡XgWÀLJƟψOj YÇ÷Sğ³kzőȝğ§õ¡VÙæÅöM̳¹pÁaËýý©D©Ü“JŹƕģGą¤{Ùū…ǘO²«BƱéA—Ò‰Ƈ׫BhlmtÃPµy‹ÓɉUīí}†€GBȅ‰ŹãĻFŷŽǩoo¿ē‹±ß}ŽwƋtƺ—CőØEîǻīƓʑã͘ƍ“DĈ±ÌŒÜӔĨ£LóɢVȞĆĖMĸĤfˆÜǗjđĆ»ýͥãğ¶ĞØO¤Ǜn³Žő}‹¦…·z€YŠwa™–šőűMę§ZĨ훘Û]é’ÛUćİȹ¯…dƒy¹TcÂĕ½A´µê÷wĻþÙ`K€¦˜…¢ÍeœĥR¡ˆã…‚Ĉu¼dl‰t‚†U¶¶ď\\zœ}ưŬ–{ÚfKš¶Ð_„ÂÒ¿C©Ö•TmuŸ¼ãl‰›ŇÕVåĤĵfÝYYįk‘ÒīØſNQĠ³r³øÓrŸÖͳgÍſGįÅ_—±he¡ÅM²Ɠ綾ßīZgmk„ǭƁć¦UĔťƒ×ëǟ…e˭ʔħǛāĘPªij¶‘Ņăw§n‰ď£S»şŒÍļɉŀ‰}ÛÞ»å£_ˆŸıęÏZ—÷`…[„ùx½}ÑRH‘YėĺďsÍn‘™é½Ya¤Ïm¬ĝg•ĂsA•ØÅwď‚õ¤q}—«Dx¿}UũlŸê™@•HÅ­F‰¨ÇoJ´Ónȯ×âpÒŌ“Ø Tˆêa²ËX€€c̋lLìģËŁkŻƑŷÉăP¹æƧÝ¡¦}•veèÆ´UvÅ~§‡½˜“Ġ²Ŵwæč\\Dƒ}O÷š£[ŽăŒá[™‚į‰ŷvŸœRsdĒƄwžŎĒo~t¾ÍŶÒtD¦Ú„iôö‰€z«Ųƭ¸Û±¯€ÿm·zR¦Ɵ`ªŊÃh¢rOԍ´£Ym¼èêf¯ŪĽn„†AĦw\\ưĆ ¦g–ʉË£¢ι‰ǫßK‘ÙIįóVesb‘aĕ ǠƺpªqŒ‚ďŒE˜®tŸôřk˜ȌwêżĔÂe‚nËÂQƞ´’¼ŲƝÎô¶R„ä’Q^Øu¬°š_Èôc´¹ò¨P΢hlϦ´Ħ“¬oêDŽŲÚr^¯°’^º{ªBHŒ²Ö¤ɦ§Țv€qĸ„ ­viļ€ndĜ­ĆfŒ“xÝgyށqóžSᝑ³X_ĞçêtrmÚ§z„¦c¦¥jnŞi˜¯´ÓH@ÂċĂჷÌ_þ·–¹_wzË£Z­¹|ŕWM‰“|O¥ÃWTÕ­ùÔQ†¥‡¥Rã»Ge†ŸeƃīQ•}J[ғK…¬Ə|o’ėjġĠÑN¡ð¯EBčnkòəėªƒ²œm˽ŏġǝʅįĭạ̃ūȹ]ΓͧŹəăЕ·ƭˆęgſ¶ҍć`ĘąŌJޚä¤rÅň¥ÖƝ^ęuůÞiĊÄÀ\\Æs¦ÓRäšřÌkÄŷ¶½÷ùCMÝۛĥ°G¬ĩ`£Øą‚ğ¯ß”§aëbéüÑOčœk£ÍI ïCċÀÕÕĻSŧʼnïŽŗãWÑăû‚··‘Q—òı}¯ã‰I•éÕÂZ¨īès¶ZÈsŽæĔŠƦ›Ú@îá¾ó@‰˜ÙwU±ÉT廣TđŸWxĉWù׌¯cĩv‡Œėŧ³BM|¹k‰ªħ—¥TzNYnݍßpęrñĠĉRÑÈěVVе‚õ‡«Œ¯ůĉ¥áºaeõ|uĐh`Ü³ç@šƋĿa©|z²Ý¼ŸĴ貋ŸƒIƒû›I ā€óK¥}rÝ_Á´éMaňæêSĈ½Ž½KÙóĿeƃÆBŽ·¬ƃV×ĴƳ˜lŒµ`bԑ¨ˆÐÓ@s¬ƿ‚ûws¡åQÑßÁ`ŋĴ{Ī“T•ÚÅTSÄį¤Ç[ǾµMW¢ĭiÕØ¿@ŠÂ…pÕ]j†éò¿OƇĆƇp€êĉâlØw–ěsˆǩ‚ĵ¸c…bU¹ř¨^“ƒ±ze…ė·¥Ó@~¯‹éīB™Š\\”āƚǗÀƷŘóQīÈáP•œǥ@ŗĸIæÅ„hnszÁCËìñšÏ·ąĚÝUm®ó­Z±đ[‰Âÿiñ¬‰Òj°ŁŤ_uµ^‘°ŒìÇÊĶĒ¡Æ‡MğźİĨƥôRŽāð©[wâ䥩Ô\\°ÝĄ̄Ƣ’ăk™néǀůŠ˜ĆK„ĒĬœ¶è‰âz¨u¦¥L~ƄýÎIƖߔµĔƱĐċņbÎՂĄæ_ƞZRÖíŽJ²öLĸҜcºƖÎ\\ñºÛqY–Ѩ`x¥’ù^•}ƒÌđYªƅ”Aйn~Ꝛf¤áÀz„gŠÇDIԝ´Aňńňĕuĩt[{ù°ŁÏ•|Soċxţ[õÔĥkŋÞŭZ˺óYËüċrw €ÞkrťË¿XGǣ@Dü·Ē÷Aê[Ää€I®BÕИÞ_¢āĠpŠÛÄȉĖġDKÕK‡ÄNô‡ŠfœƫVó¼dz—H‘‹QµâFšù­Âœ³¦{Y‹Â¢ĚÜO „€{Ö¦ÞͨJÜÄƨ€lŽU˧ªÍE˨¡ĐĬĬùÎRƠŸHÕŔ_ƪàÒKäȇĬə²ȕnáûl—÷eǛò•Ğ\\ªÑò˜Üìc\\üqˆÕ[ēdžċªbØ­Œø|€¶ȴZdÆÂšońéŒGšŠǚnìÈƲ‚ہȖưòTxÊǪMīИÖŲÃɎO̚ǰއRěò—¿ġ~åŊœú‰¬ô¸qŽ’Ę[Ĕ¶ÂćnÒPĒÜvúĀÊbÖ{Äî¸~Ŕünp¤ŀ¤ĄYÒ©ÊfºmԈȈ¡DŽ~¤„s²‚”ʘچžȂVƼîèW²æIJXŔþɔÖĚêϜêĮŢɨJ€˜¯ÎrDDšĤ€`€Q¾§~wâJÂ˜ñÈOú¤p¨ŪŊMǎÀW|ų ¿¾ɄĦƖAiƒ÷fØĶK¢ȝ˔"]],"encodeOffsets":[[[112750,20508]],[[123335,22980]],[[82455,44869]]]},"properties":{"cp":[116.3683244,39.915085],"name":"中华人民共和国","childNum":3}}],"UTF8Encoding":true});
}));
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/map/js/china.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/map/js/china.js

Statements: 50% (8 / 16)      Branches: 41.18% (7 / 17)      Functions: 66.67% (2 / 3)      Lines: 50% (8 / 16)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 281 1     1   1           1         1       1       1    
(function (root, factory) {
    Iif (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['exports', 'echarts'], factory);
    } else Eif (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
        // CommonJS
        factory(exports, require('echarts'));
    } else {
        // Browser globals
        factory({}, root.echarts);
    }
}(this, function (exports, echarts) {
    var log = function (msg) {
        if (typeof console !== 'undefined') {
            console && console.error && console.error(msg);
        }
    }
    Iif (!echarts) {
        log('ECharts is not Loaded');
        return;
    }
    Iif (!echarts.registerMap) {
        log('ECharts Map is not loaded')
        return;
    }
    echarts.registerMap('china', {"type":"FeatureCollection","features":[{"id":"710000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@°Ü¯Û"],["@@ƛĴÕƊÉɼģºðʀ\\ƎsÆNŌÔĚäœnÜƤɊĂǀĆĴžĤNJŨxĚĮǂƺòƌ‚–âÔ®ĮXŦţƸZûЋƕƑGđ¨ĭMó·ęcëƝɉlÝƯֹÅŃ^Ó·śŃNjƏďíåɛGɉ™¿@ăƑŽ¥ĘWǬÏĶŁâ"],["@@\\p|WoYG¿¥I†j@¢"],["@@…¡‰@ˆV^RqˆBbAŒnTXeRz¤Lž«³I"],["@@ÆEE—„kWqë @œ"],["@@fced"]],"encodeOffsets":[[[122886,24033]],[[123335,22980]],[[122375,24193]],[[122518,24117]],[[124427,22618]],[[124862,26043]]]},"properties":{"cp":[121.509062,25.044332],"name":"台湾","childNum":6}},{"id":"130000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@o~†Z]‚ªr‰ºc_ħ²G¼s`jΟnüsœłNX_“M`ǽÓnUK…Ĝēs¤­©yrý§uģŒc†JŠ›e"],["@@U`Ts¿m‚"],["@@oºƋÄd–eVŽDJj£€J|Ådz•Ft~žKŨ¸IÆv|”‡¢r}膎onb˜}`RÎÄn°ÒdÞ²„^®’lnÐèĄlðӜ×]ªÆ}LiĂ±Ö`^°Ç¶p®đDcœŋ`–ZÔ’¶êqvFƚ†N®ĆTH®¦O’¾ŠIbÐã´BĐɢŴÆíȦp–ĐÞXR€·nndOž¤’OÀĈƒ­Qg˜µFo|gȒęSWb©osx|hYh•gŃfmÖĩnº€T̒Sp›¢dYĤ¶UĈjl’ǐpäìë|³kÛfw²Xjz~ÂqbTŠÑ„ěŨ@|oM‡’zv¢ZrÃVw¬ŧˏfŒ°ÐT€ªqŽs{Sž¯r æÝlNd®²Ğ džiGʂJ™¼lr}~K¨ŸƐÌWö€™ÆŠzRš¤lêmĞL΄’@¡|q]SvK€ÑcwpÏρ†ĿćènĪWlĄkT}ˆJ”¤~ƒÈT„d„™pddʾĬŠ”ŽBVt„EÀ¢ôPĎƗè@~‚k–ü\\rÊĔÖæW_§¼F˜†´©òDòj’ˆYÈrbĞāøŀG{ƀ|¦ðrb|ÀH`pʞkv‚GpuARhÞÆǶgƊTǼƹS£¨¡ù³ŘÍ]¿Ây™ôEP xX¶¹܇O¡“gÚ¡IwÃ鑦ÅB‡Ï|ǰ…N«úmH¯‹âŸDùŽyŜžŲIÄuШDž•¸dɂ‡‚FŸƒ•›Oh‡đ©OŸ›iÃ`ww^ƒÌkŸ‘ÑH«ƇǤŗĺtFu…{Z}Ö@U‡´…ʚLg®¯Oı°ÃwŸ ^˜—€VbÉs‡ˆmA…ê]]w„§›RRl£‡ȭµu¯b{ÍDěïÿȧŽuT£ġƒěŗƃĝ“Q¨fV†Ƌ•ƅn­a@‘³@šď„yýIĹÊKšŭfċŰóŒxV@tˆƯŒJ”]eƒR¾fe|rHA˜|h~Ėƍl§ÏŠlTíb ØoˆÅbbx³^zÃ͚¶Sj®A”yÂhðk`š«P€”ˈµEF†Û¬Y¨Ļrõqi¼‰Wi°§’б´°^[ˆÀ|ĠO@ÆxO\\tŽa\\tĕtû{ġŒȧXýĪÓjùÎRb›š^ΛfK[ݏděYfíÙTyŽuUSyŌŏů@Oi½’éŅ­aVcř§ax¹XŻác‡žWU£ôãºQ¨÷Ñws¥qEH‰Ù|‰›šYQoŕÇyáĂ£MðoťÊ‰P¡mšWO¡€v†{ôvîēÜISpÌhp¨ ‘j†deŔQÖj˜X³à™Ĉ[n`Yp@Už–cM`’RKhŒEbœ”pŞlNut®Etq‚nsÁŠgA‹iú‹oH‡qCX‡”hfgu“~ϋWP½¢G^}¯ÅīGCŸÑ^ãziMáļMTÃƘrMc|O_ž¯Ŏ´|‡morDkO\\mĆJfl@c̬¢aĦtRıҙ¾ùƀ^juųœK­ƒUFy™—Ɲ…›īÛ÷ąV×qƥV¿aȉd³B›qPBm›aËđŻģm“Å®Vйd^K‡KoŸnYg“¯Xhqa”Ldu¥•ÍpDž¡KąÅƒkĝęěhq‡}HyÓ]¹ǧ£…Í÷¿qáµ§š™g‘¤o^á¾ZE‡¤i`ij{n•ƒOl»ŸWÝĔįhg›F[¿¡—ßkOüš_‰€ū‹i„DZàUtėGylƒ}ŒÓM}€jpEC~¡FtoQi‘šHkk{Ãmï‚"]],"encodeOffsets":[[[119712,40641]],[[121616,39981]],[[116462,37237]]]},"properties":{"cp":[114.502461,38.045474],"name":"河北","childNum":3}},{"id":"140000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@Þĩ҃S‰ra}Á€yWix±Üe´lè“ßÓǏok‘ćiµVZģ¡coœ‘TS˹ĪmnÕńe–hZg{gtwªpXaĚThȑp{¶Eh—®RćƑP¿£‘Pmc¸mQÝW•ďȥoÅîɡųAďä³aωJ‘½¥PG­ąSM­™…EÅruµé€‘Yӎ•Ō_d›ĒCo­Èµ]¯_²ÕjāŽK~©ÅØ^ԛkïçămϑk]­±ƒcݯÑÃmQÍ~_a—pm…~ç¡q“ˆu{JÅŧ·Ls}–EyÁÆcI{¤IiCfUc•ƌÃp§]웫vD@¡SÀ‘µM‚ÅwuŽYY‡¡DbÑc¡hƒ×]nkoQdaMç~eD•ÛtT‰©±@¥ù@É¡‰ZcW|WqOJmĩl«ħşvOÓ«IqăV—¥ŸD[mI~Ó¢cehiÍ]Ɠ~ĥqXŠ·eƷœn±“}v•[ěďŽŕ]_‘œ•`‰¹ƒ§ÕōI™o©b­s^}Ét±ū«³p£ÿ·Wµ|¡¥ăFÏs׌¥ŅxŸÊdÒ{ºvĴÎêÌɊ²¶€ü¨|ÞƸµȲ‘LLúÉƎ¤ϊęĔV`„_bª‹S^|ŸdŠzY|dz¥p†ZbÆ£¶ÒK}tĦÔņƠ‚PYzn€ÍvX¶Ěn ĠÔ„zý¦ª˜÷žÑĸَUȌ¸‚dòÜJð´’ìúNM¬ŒXZ´‘¤ŊǸ_tldIš{¦ƀðĠȤ¥NehXnYG‚‡R° ƬDj¬¸|CĞ„Kq‚ºfƐiĺ©ª~ĆOQª ¤@ìǦɌ²æBŒÊ”TœŸ˜ʂōĖ’šĴŞ–ȀœÆÿȄlŤĒö„t”νî¼ĨXhŒ‘˜|ªM¤Ðz"],"encodeOffsets":[[116874,41716]]},"properties":{"cp":[112.549248,37.857014],"name":"山西","childNum":1}},{"id":"150000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@Č^â£Ăh–šĖMÈÄw‚\\fŦ°W ¢¾luŸD„wŠ\\̀ʉÌÛM…Ā[bӞEn}¶Vc…ê“sƒ–›¯PqƒFB…‰|S•³C|kñ•H‹d‘iÄ¥sˆʼnő…PóÑÑE^‘ÅPpy_YtS™hQ·aHwsOnʼnÚs©iqj›‰€USiº]ïWš‰«gW¡A–R붛ijʕ…Œů`çõh]y»ǃŸǛҤxÒm~zf}pf|ÜroÈzrKÈĵSƧ„ż؜Ġu¦ö"],["@@sKCš…GS|úþX”gp›{ÁX¿Ÿć{ƱȏñZáĔyoÁhA™}ŅĆfdʼn„_¹„Y°ėǩÑ¡H¯¶oMQqð¡Ë™|‘Ñ`ƭŁX½·óۓxğįÅcQ‡ˆ“ƒs«tȋDžF“Ÿù^i‘t«Č¯[›hAi©á¥ÇĚ×l|¹y¯YȵƓ‹ñǙµï‚ċ™Ļ|Dœ™üȭ¶¡˜›oŽäÕG\\ďT¿Òõr¯œŸLguÏYęRƩšɷŌO\\İТæ^Ŋ IJȶȆbÜGŽĝ¬¿ĚVĎgª^íu½jÿĕęjık@Ľƒ]ėl¥Ë‡ĭûÁ„ƒėéV©±ćn©­ȇžÍq¯½•YÃÔʼn“ÉNѝÅÝy¹NqáʅDǡËñ­ƁYÅy̱os§ȋµʽǘǏƬɱà‘ưN¢ƔÊuľýľώȪƺɂļžxœZĈ}ÌʼnŪ˜ĺœŽĭFЛĽ̅ȣͽÒŵìƩÇϋÿȮǡŏçƑůĕ~Ǎ›¼ȳÐUf†dIxÿ\\G ˆzâɏÙOº·pqy£†@ŒŠqþ@Ǟ˽IBäƣzsÂZ†ÁàĻdñ°ŕzéØűzșCìDȐĴĺf®ŽÀľưø@ɜÖÞKĊŇƄ§‚͑těï͡VAġÑÑ»d³öǍÝXĉĕÖ{þĉu¸ËʅğU̎éhɹƆ̗̮ȘNJ֥ड़ࡰţાíϲäʮW¬®ҌeרūȠkɬɻ̼ãüfƠSצɩςåȈHϚÎKdzͲOðÏȆƘ¼CϚǚ࢚˼ФԂ¤ƌžĞ̪Qʤ´¼mȠJˀŸƲÀɠmǐnǔĎȆÞǠN~€ʢĜ‚¶ƌĆĘźʆȬ˪ĚǏĞGȖƴƀj`ĢçĶāàŃºē̃ĖćšYŒÀŎüôQÐÂŎŞdžŞêƖš˜oˆDĤÕºÑǘÛˤ³̀gńƘĔÀ^žªƂ`ªt¾äƚêĦĀ¼Ð€Ĕǎ¨Ȕ»͠^ˮÊȦƤøxRrŜH¤¸ÂxDĝŒ|ø˂˜ƮÐ¬ɚwɲFjĔ²Äw°dždÀɞ_ĸdîàŎjʜêTĞªŌ‡ŜWÈ|tqĢUB~´°ÎFC•ŽU¼pĀēƄN¦¾O¶ŠłKĊOj“Ě”j´ĜYp˜{¦„ˆSĚÍ\\Tš×ªV–÷Ší¨ÅDK°ßtŇĔKš¨ǵÂcḷ̌ĚǣȄĽF‡lġUĵœŇ‹ȣFʉɁƒMğįʏƶɷØŭOǽ«ƽū¹Ʊő̝Ȩ§ȞʘĖiɜɶʦ}¨֪ࠜ̀ƇǬ¹ǨE˦ĥªÔêFŽxúQ„Er´W„rh¤Ɛ \\talĈDJ˜Ü|[Pll̚¸ƎGú´Pž¬W¦†^¦–H]prR“n|or¾wLVnÇIujkmon£cX^Bh`¥V”„¦U¤¸}€xRj–[^xN[~ªŠxQ„‚[`ªHÆÂExx^wšN¶Ê˜|¨ì†˜€MrœdYp‚oRzNy˜ÀDs~€bcfÌ`L–¾n‹|¾T‚°c¨È¢a‚r¤–`[|òDŞĔöxElÖdH„ÀI`„Ď\\Àì~ƎR¼tf•¦^¢ķ¶e”ÐÚMŒptgj–„ɡČÅyġLû™ŇV®ŠÄÈƀ†Ď°P|ªVV†ªj–¬ĚÒêp¬–E|ŬÂc|ÀtƐK fˆ{ĘFǜƌXƲąo½Ę‘\\¥–o}›Ûu£ç­kX‘{uĩ«āíÓUŅßŢq€Ť¥lyň[€oi{¦‹L‡ń‡ðFȪȖ”ĒL„¿Ì‹ˆfŒ£K£ʺ™oqNŸƒwğc`ue—tOj×°KJ±qƒÆġm‰Ěŗos¬…qehqsuœƒH{¸kH¡Š…ÊRǪÇƌbȆ¢´ä܍¢NìÉʖ¦â©Ż؛Ç@Vu»A—ylßí¹ĵê…ÝlISò³C¹Ìâ„²i¶’Ìoú^H“²CǜңDŽ z¼g^èöŰ_‹‚–†IJĕꄜ}gÁnUI«m‰…„‹]j‡vV¼euhwqA„aW˜ƒ_µj…»çjioQR¹ēÃßt@r³[ÛlćË^ÍÉáG“›OUۗOB±•XŸkŇ¹£k|e]ol™ŸkVͼÕqtaÏõjgÁ£§U^Œ”RLˆËnX°Ç’Bz†^~wfvˆypV ¯„ƫĉ˭ȫƗŷɿÿĿƑ˃ĝÿÃǃßËőó©ǐȍŒĖM×ÍEyx‹þp]Évïè‘vƀnÂĴÖ@‚‰†V~Ĉ™Š³MEˆĸÅĖt—ējyÄDXÄxGQuv_›i¦aBçw‘˛wD™©{ŸtāmQ€{EJ§KPśƘƿ¥@‰sCT•É}ɃwˆƇy±ŸgÑ“}T[÷kÐ禫…SÒ¥¸ëBX½‰HáŵÀğtSÝÂa[ƣ°¯¦P]£ġ“–“Òk®G²„èQ°óMq}EŠóƐÇ\\ƒ‡@áügQ͋u¥Fƒ“T՛¿Jû‡]|mvāÎYua^WoÀa·­ząÒot×¶CLƗi¯¤mƎHNJ¤îìɾŊìTdåwsRÖgĒųúÍġäÕ}Q¶—ˆ¿A•†‹[¡Œ{d×uQAƒ›M•xV‹vMOmăl«ct[wº_šÇʊŽŸjb£ĦS_é“QZ“_lwgOiýe`YYLq§IÁˆdz£ÙË[ÕªuƏ³ÍT—s·bÁĽäė[›b[ˆŗfãcn¥îC¿÷µ[ŏÀQ­ōšĉm¿Á^£mJVm‡—L[{Ï_£›F¥Ö{ŹA}…×Wu©ÅaųijƳhB{·TQqÙIķˑZđ©Yc|M¡…L•eVUóK_QWk’_ĥ‘¿ãZ•»X\\ĴuUƒè‡lG®ěłTĠğDєOrÍd‚ÆÍz]‹±…ŭ©ŸÅ’]ŒÅÐ}UË¥©Tċ™ïxgckfWgi\\ÏĒ¥HkµE˜ë{»ÏetcG±ahUiñiWsɁˆ·c–C‚Õk]wȑ|ća}w…VaĚ᠞ŒG°ùnM¬¯†{ÈˆÐÆA’¥ÄêJxÙ¢”hP¢Ûˆº€µwWOŸóFŽšÁz^ÀŗÎú´§¢T¤ǻƺSė‰ǵhÝÅQgvBHouʝl_o¿Ga{ïq{¥|ſĿHĂ÷aĝÇq‡Z‘ñiñC³ª—…»E`¨åXēÕqÉû[l•}ç@čƘóO¿¡ƒFUsA‰“ʽīccšocƒ‚ƒÇS}„“£‡IS~ălkĩXçmĈ…ŀЂoÐdxÒuL^T{r@¢‘žÍƒĝKén£kQ™‰yšÅõËXŷƏL§~}kqš»IHėDžjĝŸ»ÑÞoŸå°qTt|r©ÏS‹¯·eŨĕx«È[eMˆ¿yuˆ‘pN~¹ÏyN£{©’—g‹ħWí»Í¾s“əšDž_ÃĀɗ±ą™ijĉʍŌŷ—S›É“A‹±åǥɋ@럣R©ąP©}ĹªƏj¹erƒLDĝ·{i«ƫC£µ"]],"encodeOffsets":[[[127444,52594]],[[113793,40312]]]},"properties":{"cp":[111.670801,40.818311],"name":"内蒙古","childNum":2}},{"id":"210000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@L–Ž@@s™a"],["@@MnNm"],["@@d‚c"],["@@eÀ‚C@b‚“‰"],["@@f‡…Xwkbr–Ä`qg"],["@@^jtW‘Q"],["@@~ Y]c"],["@@G`ĔN^_¿Z‚ÃM"],["@@iX¶B‹Y"],["@@„YƒZ"],["@@L_{Epf"],["@@^WqCT\\"],["@@\\[“‹§t|”¤_"],["@@m`n_"],["@@Ïxnj{q_×^Giip"],["@@@œé^B†‡ntˆaÊU—˜Ÿ]x ¯ÄPIJ­°h€ʙK³†VˆÕ@Y~†|EvĹsDŽ¦­L^p²ŸÒG ’Ël]„xxÄ_˜fT¤Ď¤cŽœP„–C¨¸TVjbgH²sdÎdHt`Bˆ—²¬GJję¶[ÐhjeXdlwhšðSȦªVÊπ‹Æ‘Z˜ÆŶ®²†^ŒÎyÅÎcPqń“ĚDMħĜŁH­ˆk„çvV[ij¼W–‚YÀäĦ’‘`XlžR`žôLUVžfK–¢†{NZdĒª’YĸÌÚJRr¸SA|ƴgŴĴÆbvªØX~†źBŽ|¦ÕœEž¤Ð`\\|Kˆ˜UnnI]¤ÀÂĊnŎ™R®Ő¿¶\\ÀøíDm¦ÎbŨab‰œaĘ\\ľã‚¸a˜tÎSƐ´©v\\ÖÚÌǴ¤Â‡¨JKr€Z_Z€fjþhPkx€`Y”’RIŒjJcVf~sCN¤ ˆE‚œhæm‰–sHy¨SðÑÌ\\\\ŸĐRZk°IS§fqŒßýáЍÙÉÖ[^¯ǤŲ„ê´\\¦¬ĆPM¯£Ÿˆ»uïpùzEx€žanµyoluqe¦W^£ÊL}ñrkqWňûP™‰UP¡ôJŠoo·ŒU}£Œ„[·¨@XŒĸŸ“‹‹DXm­Ûݏº‡›GU‹CÁª½{íĂ^cj‡k“¶Ã[q¤“LÉö³cux«zZfƒ²BWÇ®Yß½ve±ÃC•ý£W{Ú^’q^sÑ·¨‹ÍOt“¹·C¥‡GD›rí@wÕKţ݋˜Ÿ«V·i}xËÍ÷‘i©ĝ‡ɝǡ]ƒˆ{c™±OW‹³Ya±Ÿ‰_穂Hžĕoƫ€Ňqƒr³‰Lys[„ñ³¯OS–ďOMisZ†±ÅFC¥Pq{‚Ã[Pg}\\—¿ghćO…•k^ģÁFıĉĥM­oEqqZûěʼn³F‘¦oĵ—hŸÕP{¯~TÍlª‰N‰ßY“Ð{Ps{ÃVU™™eĎwk±ʼnVÓ½ŽJãÇÇ»Jm°dhcÀff‘dF~ˆ€ĀeĖ€d`sx² šƒ®EżĀdQ‹Âd^~ăÔHˆ¦\\›LKpĄVez¤NP ǹӗR™ÆąJSh­a[¦´Âghwm€BÐ¨źhI|žVVŽ—Ž|p] Â¼èNä¶ÜBÖ¼“L`‚¼bØæŒKV”ŸpoœúNZÞÒKxpw|ÊEMnzEQšŽIZ”ŽZ‡NBˆčÚFÜçmĩ‚WĪñt‘ÞĵÇñZ«uD‚±|Əlij¥ãn·±PmÍa‰–da‡ CL‡Ǒkùó¡³Ï«QaċϑOÃ¥ÕđQȥċƭy‹³ÃA"]],"encodeOffsets":[[[123686,41445]],[[126019,40435]],[[124393,40128]],[[126117,39963]],[[125322,40140]],[[126686,40700]],[[126041,40374]],[[125584,40168]],[[125453,40165]],[[125362,40214]],[[125280,40291]],[[125774,39997]],[[125976,40496]],[[125822,39993]],[[125509,40217]],[[122731,40949]]]},"properties":{"cp":[123.429096,41.796767],"name":"辽宁","childNum":16}},{"id":"220000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@‘p䔳PClƒFbbÍzš€wBG’ĭ€Z„Åi“»ƒlY­ċ²SgŽkÇ£—^S‰“qd¯•‹R…©éŽ£¯S†\\cZ¹iűƏCuƍÓX‡oR}“M^o•£…R}oªU­F…uuXHlEŕ‡€Ï©¤ÛmTŽþ¤D–²ÄufàÀ­XXȱAe„yYw¬dvõ´KÊ£”\\rµÄl”iˆdā]|DÂVŒœH¹ˆÞ®ÜWnŒC”Œķ W‹§@\\¸‹ƒ~¤‹Vp¸‰póIO¢ŠVOšŇürXql~òÉK]¤¥Xrfkvzpm¶bwyFoúvð‡¼¤ N°ąO¥«³[ƒéǡű_°Õ\\ÚÊĝŽþâőàerR¨­JYlďQ[ ÏYëЧTGz•tnŠß¡gFkMŸāGÁ¤ia É‰™È¹`\\xs€¬dĆkNnuNUŠ–užP@‚vRY¾•–\\¢…ŒGªóĄ~RãÖÎĢù‚đŴÕhQŽxtcæëSɽʼníëlj£ƍG£nj°KƘµDsØÑpyƸ®¿bXp‚]vbÍZuĂ{nˆ^IüœÀSք”¦EŒvRÎûh@℈[‚Əȉô~FNr¯ôçR±ƒ­HÑl•’Ģ–^¤¢‚OðŸŒævxsŒ]ÞÁTĠs¶¿âƊGW¾ìA¦·TѬ†è¥€ÏÐJ¨¼ÒÖ¼ƒƦɄxÊ~S–tD@ŠĂ¼Ŵ¡jlºWžvЉˆzƦZЎ²CH— „Axiukd‹ŒGgetqmcžÛ£Ozy¥cE}|…¾cZ…k‚‰¿uŐã[oxGikfeäT@…šSUwpiÚFM©’£è^ڟ‚`@v¶eň†f h˜eP¶žt“äOlÔUgƒÞzŸU`lœ}ÔÆUvØ_Ō¬Öi^ĉi§²ÃŠB~¡Ĉ™ÚEgc|DC_Ȧm²rBx¼MÔ¦ŮdĨÃâYx‘ƘDVÇĺĿg¿cwÅ\\¹˜¥Yĭlœ¤žOv†šLjM_a W`zļMž·\\swqÝSA‡š—q‰Śij¯Š‘°kŠRē°wx^Đkǂғ„œž“œŽ„‹\\]˜nrĂ}²ĊŲÒøãh·M{yMzysěnĒġV·°“G³¼XÀ““™¤¹i´o¤ŃšŸÈ`̃DzÄUĞd\\i֚ŒˆmÈBĤÜɲDEh LG¾ƀľ{WaŒYÍȏĢĘÔRîĐj‹}Ǟ“ccj‡oUb½š{“h§Ǿ{K‹ƖµÎ÷žGĀÖŠåưÎs­l›•yiē«‹`姝H¥Ae^§„GK}iã\\c]v©ģZ“mÃ|“[M}ģTɟĵ‘Â`À–çm‰‘FK¥ÚíÁbXš³ÌQґHof{‰]e€pt·GŋĜYünĎųVY^’˜ydõkÅZW„«WUa~U·Sb•wGçǑ‚“iW^q‹F‚“›uNĝ—·Ew„‹UtW·Ýďæ©PuqEzwAV•—XR‰ãQ`­©GŒM‡ehc›c”ďϝd‡©ÑW_ϗYƅŒ»…é\\ƒɹ~ǙG³mØ©BšuT§Ĥ½¢Ã_ý‘L¡‘ýŸqT^rme™\\Pp•ZZbƒyŸ’uybQ—efµ]UhĿDCmûvašÙNSkCwn‰cćfv~…Y‹„ÇG"],"encodeOffsets":[[130196,42528]]},"properties":{"cp":[125.3245,43.886841],"name":"吉林","childNum":1}},{"id":"230000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@ƨƒĶTLÇyqpÇÛqe{~oyen}s‰`q‡iXG”ù]Ëp½“©lɇÁp]Þñ´FÔ^f‘äîºkà˜z¼BUvÈ@"],["@@UƒµNÿ¥īè灋•HÍøƕ¶LŒǽ|g¨|”™Ža¾pViˆdd”~ÈiŒíďÓQġėǐZ΋ŽXb½|ſÃH½ŸKFgɱCģÛÇA‡n™‹jÕc[VĝDZÃ˄Ç_™ £ń³pŽj£º”š¿”»WH´¯”U¸đĢmžtĜyzzNN|g¸÷äűѱĉā~mq^—Œ[ƒ”››”ƒǁÑďlw]¯xQĔ‰¯l‰’€°řĴrŠ™˜BˆÞTxr[tޏĻN_yŸX`biN™Ku…P›£k‚ZĮ—¦[ºxÆÀdhŽĹŀUÈƗCw’áZħÄŭcÓ¥»NAw±qȥnD`{ChdÙFćš}¢‰A±Äj¨]ĊÕjŋ«×`VuÓś~_kŷVÝyh„“VkÄãPs”Oµ—fŸge‚Ň…µf@u_Ù ÙcŸªNªÙEojVx™T@†ãSefjlwH\\pŏäÀvŠŽlY†½d{†F~¦dyz¤PÜndsrhf‹HcŒvlwjFœ£G˜±DύƥY‡yϊu¹XikĿ¦ÏqƗǀOŜ¨LI|FRĂn sª|Cš˜zxAè¥bœfudTrFWÁ¹Am|˜ĔĕsķÆF‡´Nš‰}ć…UŠÕ@Áijſmužç’uð^ÊýowŒFzØÎĕNőžǏȎôªÌŒDŽàĀÄ˄ĞŀƒʀĀƘŸˮȬƬĊ°ƒUŸzou‡xe]}Ž…AyȑW¯ÌmK‡“Q]‹Īºif¸ÄX|sZt|½ÚUΠlkš^p{f¤lˆºlÆW –€A²˜PVܜPH”Êâ]ÎĈÌÜk´\\@qàsĔÄQºpRij¼èi†`¶—„bXƒrBgxfv»ŽuUiˆŒ^v~”J¬mVp´£Œ´VWrnP½ì¢BX‚¬h™ŠðX¹^TjVœŠriªj™tŊÄm€tPGx¸bgRšŽsT`ZozÆO]’ÒFô҆Oƒ‡ŊŒvŞ”p’cGŒêŠsx´DR–Œ{A†„EOr°Œ•žx|íœbˆ³Wm~DVjºéNN†Ëܲɶ­GƒxŷCStŸ}]ûō•SmtuÇÃĕN•™āg»šíT«u}ç½BĵÞʣ¥ëÊ¡Mێ³ãȅ¡ƋaǩÈÉQ‰†G¢·lG|›„tvgrrf«†ptęŘnŠÅĢr„I²¯LiØsPf˜_vĠd„xM prʹšL¤‹¤‡eˌƒÀđK“žïÙVY§]I‡óáĥ]ķ†Kˆ¥Œj|pŇ\\kzţ¦šnņäÔVĂîά|vW’®l¤èØr‚˜•xm¶ă~lÄƯĄ̈́öȄEÔ¤ØQĄ–Ą»ƢjȦOǺ¨ìSŖÆƬy”Qœv`–cwƒZSÌ®ü±DŽ]ŀç¬B¬©ńzƺŷɄeeOĨS’Œfm Ċ‚ƀP̎ēz©Ċ‚ÄÕÊmgŸÇsJ¥ƔˆŊśæ’΁Ñqv¿íUOµª‰ÂnĦÁ_½ä@ê텣P}Ġ[@gġ}g“ɊדûÏWXá¢užƻÌsNͽƎÁ§č՛AēeL³àydl›¦ĘVçŁpśdžĽĺſʃQíÜçÛġԏsĕ¬—Ǹ¯YßċġHµ ¡eå`ļƒrĉŘóƢFì“ĎWøxÊk†”ƈdƬv|–I|·©NqńRŀƒ¤é”eŊœŀ›ˆàŀU²ŕƀB‚Q£Ď}L¹Îk@©ĈuǰųǨ”Ú§ƈnTËÇéƟÊcfčŤ^Xm‡—HĊĕË«W·ċëx³ǔķÐċJā‚wİ_ĸ˜Ȁ^ôWr­°oú¬Ħ…ŨK~”ȰCĐ´Ƕ£’fNÎèâw¢XnŮeÂÆĶŽ¾¾xäLĴĘlļO¤ÒĨA¢Êɚ¨®‚ØCÔ ŬGƠ”ƦYĜ‡ĘÜƬDJ—g_ͥœ@čŅĻA“¶¯@wÎqC½Ĉ»NŸăëK™ďÍQ“Ùƫ[«Ãí•gßÔÇOÝáW‘ñuZ“¯ĥ€Ÿŕā¡ÑķJu¤E Ÿå¯°WKɱ_d_}}vyŸõu¬ï¹ÓU±½@gÏ¿rýD‰†g…Cd‰µ—°MFYxw¿CG£‹Rƛ½Õ{]L§{qqąš¿BÇƻğëšܭNJË|c²}Fµ}›ÙRsÓpg±ŠQNqǫŋRwŕnéÑÉKŸ†«SeYR…ŋ‹@{¤SJ}šD Ûǖ֍Ÿ]gr¡µŷjqWÛham³~S«“„›Þ]"]],"encodeOffsets":[[[127123,51780]],[[134456,44547]]]},"properties":{"cp":[126.642464,45.756967],"name":"黑龙江","childNum":2}},{"id":"320000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@cþÅPiŠ`ZŸRu¥É\\]~°ŽY`µ†Óƒ^phÁbnÀşúŽòa–ĬºTÖŒb‚˜e¦¦€{¸ZâćNpŒ©žHr|^ˆmjhŠSEb\\afv`sz^lkŽlj‹Ätg‹¤D˜­¾Xš¿À’|ДiZ„ȀåB·î}GL¢õcßjaŸyBFµÏC^ĭ•cÙt¿sğH]j{s©HM¢ƒQnDÀ©DaÜތ·jgàiDbPufjDk`dPOîƒhw¡ĥ‡¥šG˜ŸP²ĐobºrY†„î¶aHŢ´ ]´‚rılw³r_{£DB_Ûdåuk|ˆŨ¯F Cºyr{XFy™e³Þċ‡¿Â™kĭB¿„MvÛpm`rÚã”@ƹhågËÖƿxnlč¶Åì½Ot¾dJlŠVJʜǀœŞqvnOŠ^ŸJ”Z‘ż·Q}ê͎ÅmµÒ]Žƍ¦Dq}¬R^èĂ´ŀĻĊIԒtžIJyQŐĠMNtœR®òLh‰›Ěs©»œ}OӌGZz¶A\\jĨFˆäOĤ˜HYš†JvÞHNiÜaϚɖnFQlšNM¤ˆB´ĄNöɂtp–Ŭdf先‹qm¿QûŠùއÚb¤uŃJŴu»¹Ą•lȖħŴw̌ŵ²ǹǠ͛hĭłƕrçü±Y™xci‡tğ®jű¢KOķ•Coy`å®VTa­_Ā]ŐÝɞï²ʯÊ^]afYǸÃĆēĪȣJđ͍ôƋĝÄ͎ī‰çÛɈǥ£­ÛmY`ó£Z«§°Ó³QafusNıDž_k}¢m[ÝóDµ—¡RLčiXy‡ÅNïă¡¸iĔϑNÌŕoēdōîåŤûHcs}~Ûwbù¹£¦ÓCt‹OPrƒE^ÒoŠg™ĉIµžÛÅʹK…¤½phMŠü`o怆ŀ"],"encodeOffsets":[[121740,32276]]},"properties":{"cp":[118.767413,32.041544],"name":"江苏","childNum":1}},{"id":"330000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@E^dQ]K"],["@@jX^j‡"],["@@sfŠbU‡"],["@@qP\\xz[ck"],["@@‘Rƒ¢‚FX}°[s_"],["@@Cbœ\\—}"],["@@e|v\\la{u"],["@@v~u}"],["@@QxÂF¯}"],["@@¹nŒvÞs¯o"],["@@rSkUEj"],["@@bi­ZŒP"],["@@p[}INf"],["@@À¿€"],["@@¹dnbŒ…"],["@@rSŸBnR"],["@@g~h}"],["@@FlEk"],["@@OdPc"],["@@v[u\\"],["@@FjâL~wyoo~›sµL–\\"],["@@¬e¹aNˆ"],["@@\\nÔ¡q]L³ë\\ÿ®ŒQ֎"],["@@ÊA­©[¬"],["@@KxŒv­"],["@@@hlIk]"],["@@pW{o||j"],["@@Md|_mC"],["@@¢…X£ÏylD¼XˆtH"],["@@hlÜ[LykAvyfw^Ež›¤"],["@@fp¤Mus“R"],["@@®_ma~•LÁ¬šZ"],["@@iM„xZ"],["@@ZcYd"],["@@Z~dOSo|A¿qZv"],["@@@`”EN¡v"],["@@|–TY{"],["@@@n@m"],["@@XWkCT\\"],["@@ºwšZRkĕWO¢"],["@@™X®±Grƪ\\ÔáXq{‹"],["@@ůTG°ĄLHm°UC‹"],["@@¤Ž€aÜx~}dtüGæţŎíĔcŖpMËВj碷ðĄÆMzˆjWKĎ¢Q¶˜À_꒔_Bı€i«pZ€gf€¤Nrq]§ĂN®«H±‡yƳí¾×ŸīàLłčŴǝĂíÀBŖÕªˆŠÁŖHŗʼnåqûõi¨hÜ·ƒñt»¹ýv_[«¸m‰YL¯‰Qª…mĉÅdMˆ•gÇjcº«•ęœ¬­K­´ƒB«Âącoċ\\xKd¡gěŧ«®á’[~ıxu·Å”KsËɏc¢Ù\\ĭƛëbf¹­ģSƒĜkáƉÔ­ĈZB{ŠaM‘µ‰fzʼnfåÂŧįƋǝÊĕġć£g³ne­ą»@­¦S®‚\\ßðCšh™iqªĭiAu‡A­µ”_W¥ƣO\\lċĢttC¨£t`ˆ™PZäuXßBs‡Ļyek€OđġĵHuXBšµ]׌‡­­\\›°®¬F¢¾pµ¼kŘó¬Wät’¸|@ž•L¨¸µr“ºù³Ù~§WI‹ŸZWŽ®’±Ð¨ÒÉx€`‰²pĜ•rOògtÁZ}þÙ]„’¡ŒŸFK‚wsPlU[}¦Rvn`hq¬\\”nQ´ĘRWb”‚_ rtČFI֊kŠŠĦPJ¶ÖÀÖJĈĄTĚòžC ²@Pú…Øzœ©PœCÈÚœĒ±„hŖ‡l¬â~nm¨f©–iļ«m‡nt–u†ÖZÜÄj“ŠLŽ®E̜Fª²iÊxبžIÈhhst"],["@@o\\V’zRZ}y"],["@@†@°¡mۛGĕ¨§Ianá[ýƤjfæ‡ØL–•äGr™"]],"encodeOffsets":[[[125592,31553]],[[125785,31436]],[[125729,31431]],[[125513,31380]],[[125223,30438]],[[125115,30114]],[[124815,29155]],[[124419,28746]],[[124095,28635]],[[124005,28609]],[[125000,30713]],[[125111,30698]],[[125078,30682]],[[125150,30684]],[[124014,28103]],[[125008,31331]],[[125411,31468]],[[125329,31479]],[[125626,30916]],[[125417,30956]],[[125254,30976]],[[125199,30997]],[[125095,31058]],[[125083,30915]],[[124885,31015]],[[125218,30798]],[[124867,30838]],[[124755,30788]],[[124802,30809]],[[125267,30657]],[[125218,30578]],[[125200,30562]],[[124968,30474]],[[125167,30396]],[[124955,29879]],[[124714,29781]],[[124762,29462]],[[124325,28754]],[[123990,28459]],[[125366,31477]],[[125115,30363]],[[125369,31139]],[[122495,31878]],[[125329,30690]],[[125192,30787]]]},"properties":{"cp":[120.153576,30.287459],"name":"浙江","childNum":45}},{"id":"340000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@^iuLX^"],["@@‚e©Ehl"],["@@°ZÆëϵmkǀwÌÕæhºgBĝâqÙĊz›ÖgņtÀÁÊÆá’hEz|WzqD¹€Ÿ°E‡ŧl{ævÜcA`¤C`|´qžxIJkq^³³ŸGšµbƒíZ…¹qpa±ď OH—¦™Ħˆx¢„gPícOl_iCveaOjCh߸i݋bÛªCC¿€m„RV§¢A|t^iĠGÀtÚs–d]ĮÐDE¶zAb àiödK¡~H¸íæAžǿYƒ“j{ď¿‘™À½W—®£ChŒÃsiŒkkly]_teu[bFa‰Tig‡n{]Gqªo‹ĈMYá|·¥f¥—őaSÕė™NµñĞ«ImŒ_m¿Âa]uĜp …Z_§{Cƒäg¤°r[_Yj‰ÆOdý“[ŽI[á·¥“Q_n‡ùgL¾mv™ˊBÜÆ¶ĊJhšp“c¹˜O]iŠ]œ¥ jtsggJǧw×jÉ©±›EFˍ­‰Ki”ÛÃÕYv…s•ˆm¬njĻª•§emná}k«ŕˆƒgđ²Ù›DǤ›í¡ªOy›†×Où±@DŸñSęćăÕIÕ¿IµĥO‰‰jNÕËT¡¿tNæŇàåyķrĕq§ÄĩsWÆßŽF¶žX®¿‰mŒ™w…RIޓfßoG‘³¾©uyH‘į{Ɓħ¯AFnuP…ÍÔzšŒV—dàôº^Ðæd´€‡oG¤{S‰¬ćxã}›ŧ×Kǥĩ«žÕOEзÖdÖsƘѨ[’Û^Xr¢¼˜§xvěƵ`K”§ tÒ´Cvlo¸fzŨð¾NY´ı~ÉĔē…ßúLÃϖ_ÈÏ|]ÂÏFl”g`bšežž€n¾¢pU‚h~ƴ˶_‚r sĄ~cž”ƈ]|r c~`¼{À{ȒiJjz`îÀT¥Û³…]’u}›f…ïQl{skl“oNdŸjŸäËzDvčoQŠďHI¦rb“tHĔ~BmlRš—V_„ħTLnñH±’DžœL‘¼L˜ªl§Ťa¸ŒĚlK²€\\RòvDcÎJbt[¤€D@®hh~kt°ǾzÖ@¾ªdb„YhüóZ ň¶vHrľ\\ʗJuxAT|dmÀO„‹[ÃԋG·ĚąĐlŪÚpSJ¨ĸˆLvÞcPæķŨŽ®mАˆálŸwKhïgA¢ųƩޖ¤OȜm’°ŒK´"]],"encodeOffsets":[[[121722,32278]],[[119475,30423]],[[119168,35472]]]},"properties":{"cp":[117.283042,31.86119],"name":"安徽","childNum":3}},{"id":"350000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@“zht´‡]"],["@@aj^~ĆG—©O"],["@@ed¨„C}}i"],["@@@vˆPGsQ"],["@@‰sBz‚ddW]Q"],["@@SލQ“{"],["@@NŽVucW"],["@@qptBAq"],["@@‰’¸[mu"],["@@Q\\pD]_"],["@@jSwUadpF"],["@@eXª~ƒ•"],["@@AjvFso"],["@@fT–›_Çí\\Ÿ™—v|ba¦jZÆy€°"],["@@IjJi"],["@@wJI€ˆxš«¼AoNe{M­"],["@@K‰±¡Óˆ”ČäeZ"],["@@k¡¹Eh~c®wBk‹UplÀ¡I•~Māe£bN¨gZý¡a±Öcp©PhžI”Ÿ¢Qq…ÇGj‹|¥U™ g[Ky¬ŏ–v@OpˆtÉEŸF„\\@ åA¬ˆV{Xģ‰ĐBy…cpě…¼³Ăp·¤ƒ¥o“hqqÚ¡ŅLsƒ^ᗞ§qlŸÀhH¨MCe»åÇGD¥zPO£čÙkJA¼ß–ėu›ĕeûҍiÁŧSW¥˜QŠûŗ½ùěcݧSùĩąSWó«íęACµ›eR—åǃRCÒÇZÍ¢‹ź±^dlsŒtjD¸•‚ZpužÔâÒH¾oLUêÃÔjjēò´ĄW‚ƛ…^Ñ¥‹ĦŸ@Çò–ŠmŒƒOw¡õyJ†yD}¢ďÑÈġfŠZd–a©º²z£šN–ƒjD°Ötj¶¬ZSÎ~¾c°¶Ðm˜x‚O¸¢Pl´žSL|¥žA†ȪĖM’ņIJg®áIJČĒü` ŽQF‡¬h|ÓJ@zµ |ê³È ¸UÖŬŬÀEttĸr‚]€˜ðŽM¤ĶIJHtÏ A’†žĬkvsq‡^aÎbvŒd–™fÊòSD€´Z^’xPsÞrv‹ƞŀ˜jJd×ŘÉ ®A–ΦĤd€xĆqAŒ†ZR”ÀMźŒnĊ»ŒİÐZ— YX–æJŠyĊ²ˆ·¶q§·–K@·{s‘Xãô«lŗ¶»o½E¡­«¢±¨Yˆ®Ø‹¶^A™vWĶGĒĢžPlzfˆļŽtàAvWYãšO_‡¤sD§ssČġ[kƤPX¦Ž`¶“ž®ˆBBvĪjv©šjx[L¥àï[F…¼ÍË»ğV`«•Ip™}ccÅĥZE‹ãoP…´B@ŠD—¸m±“z«Ƴ—¿å³BRضˆœWlâþäą`“]Z£Tc— ĹGµ¶H™m@_©—kŒ‰¾xĨ‡ôȉðX«½đCIbćqK³Á‹Äš¬OAwã»aLʼn‡ËĥW[“ÂGI—ÂNxij¤D¢ŽîĎÎB§°_JœGsƒ¥E@…¤uć…P‘å†cuMuw¢BI¿‡]zG¹guĮck\\_"]],"encodeOffsets":[[[123250,27563]],[[122541,27268]],[[123020,27189]],[[122916,27125]],[[122887,26845]],[[122808,26762]],[[122568,25912]],[[122778,26197]],[[122515,26757]],[[122816,26587]],[[123388,27005]],[[122450,26243]],[[122578,25962]],[[121255,25103]],[[120987,24903]],[[122339,25802]],[[121042,25093]],[[122439,26024]]]},"properties":{"cp":[119.306239,26.075302],"name":"福建","childNum":18}},{"id":"360000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@ĢĨƐgÂMD~ņªe^\\^§„ý©j׍cZ†Ø¨zdÒa¶ˆlҍJŒìõ`oz÷@¤u޸´†ôęöY¼‰HČƶajlÞƩ¥éZ[”|h}^U Œ ¥p„ĄžƦO lt¸Æ €Q\\€ŠaÆ|CnÂOjt­ĚĤd’ÈŒF`’¶„@Ð딠¦ōҞ¨Sêv†HĢûXD®…QgėWiØPÞìºr¤dž€NĠ¢l–•ĄtZoœCƞÔºCxrpĠV®Ê{f_Y`_ƒeq’’®Aot`@o‚DXfkp¨|Šs¬\\D‘ÄSfè©Hn¬…^DhÆyøJh“ØxĢĀLʈ„ƠPżċĄwȠ̦G®ǒĤäTŠÆ~ĦwŠ«|TF¡Šn€c³Ïå¹]ĉđxe{ÎӐ†vOEm°BƂĨİ|G’vz½ª´€H’àp”eJ݆Qšxn‹ÀŠW­žEµàXÅĪt¨ÃĖrÄwÀFÎ|ňÓMå¼ibµ¯»åDT±m[“r«_gŽmQu~¥V\\OkxtL E¢‹ƒ‘Ú^~ýê‹Pó–qo슱_Êw§ÑªåƗ⼋mĉŹ‹¿NQ“…YB‹ąrwģcÍ¥B•Ÿ­ŗÊcØiI—žƝĿuŒqtāwO]‘³YCñTeɕš‹caub͈]trlu€ī…B‘ПGsĵıN£ï—^ķqss¿FūūV՟·´Ç{éĈý‰ÿ›OEˆR_ŸđûIċâJh­ŅıN‘ȩĕB…¦K{Tk³¡OP·wn—µÏd¯}½TÍ«YiµÕsC¯„iM•¤™­•¦¯P|ÿUHv“he¥oFTu‰õ\\ŽOSs‹MòđƇiaºćXŸĊĵà·çhƃ÷ǜ{‘ígu^›đg’m[×zkKN‘¶Õ»lčÓ{XSƉv©_ÈëJbVk„ĔVÀ¤P¾ºÈMÖxlò~ªÚàGĂ¢B„±’ÌŒK˜y’áV‡¼Ã~­…`g›ŸsÙfI›Ƌlę¹e|–~udjˆuTlXµf`¿JdŠ[\\˜„L‚‘²"],"encodeOffsets":[[116689,26234]]},"properties":{"cp":[115.892151,28.676493],"name":"江西","childNum":1}},{"id":"370000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@Xjd]{K"],["@@itbFHy"],["@@HlGk"],["@@T‚ŒGŸy"],["@@K¬˜•‹U"],["@@WdXc"],["@@PtOs"],["@@•LnXhc"],["@@ppVƒu]Or"],["@@cdzAUa"],["@@udRhnCI‡"],["@@ˆoIƒpR„"],["@@Ľč{fzƤî’Kš–ÎMĮ]†—ZFˆ½Y]â£ph’™š¶¨râøÀ†ÎǨ¤^ºÄ”Gzˆ~grĚĜlĞÆ„LĆdž¢Îo¦–cv“Kb€gr°Wh”mZp ˆL]LºcU‰Æ­n”żĤÌǜbAnrOAœ´žȊcÀbƦUØrĆUÜøœĬƞ†š˜Ez„VL®öØBkŖÝĐ˹ŧ̄±ÀbÎɜnb²ĦhņBĖ›žįĦåXćì@L¯´ywƕCéõė ƿ¸‘lµ¾Z|†ZWyFYŸ¨Mf~C¿`€à_RÇzwƌfQnny´INoƬˆèôº|sT„JUš›‚L„îVj„ǎ¾Ē؍‚Dz²XPn±ŴPè¸ŔLƔÜƺ_T‘üÃĤBBċȉöA´fa„˜M¨{«M`‡¶d¡ô‰Ö°šmȰBÔjjŒ´PM|”c^d¤u•ƒ¤Û´Œä«ƢfPk¶Môlˆ]Lb„}su^ke{lC‘…M•rDŠÇ­]NÑFsmoõľH‰yGă{{çrnÓE‰‹ƕZGª¹Fj¢ïW…uøCǷ돡ąuhÛ¡^Kx•C`C\\bÅxì²ĝÝ¿_N‰īCȽĿåB¥¢·IŖÕy\\‡¹kx‡Ã£Č×GDyÕ¤ÁçFQ¡„KtŵƋ]CgÏAùSed‡cÚź—ŠuYfƒyMmhUWpSyGwMPqŀ—›Á¼zK›¶†G•­Y§Ëƒ@–´śÇµƕBmœ@Io‚g——Z¯u‹TMx}C‘‰VK‚ï{éƵP—™_K«™pÛÙqċtkkù]gŽ‹Tğwo•ɁsMõ³ă‡AN£™MRkmEʕč™ÛbMjÝGu…IZ™—GPģ‡ãħE[iµBEuŸDPԛ~ª¼ętŠœ]ŒûG§€¡QMsğNPŏįzs£Ug{đJĿļā³]ç«Qr~¥CƎÑ^n¶ÆéÎR~ݏY’I“] P‰umŝrƿ›‰›Iā‹[x‰edz‹L‘¯v¯s¬ÁY…~}…ťuٌg›ƋpÝĄ_ņī¶ÏSR´ÁP~ž¿Cyžċßdwk´Ss•X|t‰`Ä Èð€AªìÎT°¦Dd–€a^lĎDĶÚY°Ž`ĪŴǒˆ”àŠv\\ebŒZH„ŖR¬ŢƱùęO•ÑM­³FۃWp[ƒ"]],"encodeOffsets":[[[123806,39303]],[[123821,39266]],[[123742,39256]],[[123702,39203]],[[123649,39066]],[[123847,38933]],[[123580,38839]],[[123894,37288]],[[123043,36624]],[[123344,38676]],[[123522,38857]],[[123628,38858]],[[118260,36742]]]},"properties":{"cp":[117.000923,36.675807],"name":"山东","childNum":13}},{"id":"410000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@•ýL™ùµP³swIÓxcŢĞð†´E®žÚPt†ĴXØx¶˜@«ŕŕQGƒ‹Yfa[şu“ßǩ™đš_X³ijÕčC]kbc•¥CS¯ëÍB©÷‹–³­Siˆ_}m˜YTtž³xlàcȂzÀD}ÂOQ³ÐTĨ¯†ƗòËŖ[hœł‹Ŧv~††}ÂZž«¤lPǕ£ªÝŴÅR§ØnhcŒtâk‡nύ­ľŹUÓÝdKuķ‡I§oTũÙďkęĆH¸ÓŒ\\ăŒ¿PcnS{wBIvɘĽ[GqµuŸŇôYgûƒZcaŽ©@½Õǽys¯}lgg@­C\\£as€IdÍuCQñ[L±ęk·‹ţb¨©kK—’»›KC²‘òGKmĨS`ƒ˜UQ™nk}AGē”sqaJ¥ĐGR‰ĎpCuÌy ã iMc”plk|tRk†ðœev~^‘´†¦ÜŽSí¿_iyjI|ȑ|¿_»d}qŸ^{“Ƈdă}Ÿtqµ`Ƴĕg}V¡om½fa™Ço³TTj¥„tĠ—Ry”K{ùÓjuµ{t}uËR‘iŸvGŠçJFjµŠÍyqΘàQÂFewixGw½Yŷpµú³XU›½ġy™łå‰kÚwZXˆ·l„¢Á¢K”zO„Λ΀jc¼htoDHr…|­J“½}JZ_¯iPq{tę½ĕ¦Zpĵø«kQ…Ťƒ]MÛfaQpě±ǽ¾]u­Fu‹÷nƒ™čįADp}AjmcEǒaª³o³ÆÍSƇĈÙDIzˑ赟^ˆKLœ—i—Þñ€[œƒaA²zz‰Ì÷Dœ|[šíijgf‚ÕÞd®|`ƒĆ~„oĠƑô³Ŋ‘D×°¯CsŠøÀ«ì‰UMhTº¨¸ǡîS–Ô„DruÂÇZ•ÖEŽ’vPZ„žW”~؋ÐtĄE¢¦Ðy¸bŠô´oŬ¬Ž²Ês~€€]®tªašpŎJ¨Öº„_ŠŔ–`’Ŗ^Ѝ\\Ĝu–”~m²Ƹ›¸fW‰ĦrƔ}Î^gjdfÔ¡J}\\n C˜¦þWxªJRÔŠu¬ĨĨmF†dM{\\d\\ŠYÊ¢ú@@¦ª²SŠÜsC–}fNècbpRmlØ^g„d¢aÒ¢CZˆZxvÆ¶N¿’¢T@€uCœ¬^ĊðÄn|žlGl’™Rjsp¢ED}€Fio~ÔNŽ‹„~zkĘHVsDzßjƒŬŒŠŢ`Pûàl¢˜\\ÀœEhŽİgÞē X¼Pk–„|m"],"encodeOffsets":[[118256,37017]]},"properties":{"cp":[113.665412,34.757975],"name":"河南","childNum":1}},{"id":"420000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@AB‚"],["@@lskt"],["@@¾«}{ra®pîÃ\\™›{øCŠËyyB±„b\\›ò˜Ý˜jK›‡L ]ĎĽÌ’JyÚCƈćÎT´Å´pb©È‘dFin~BCo°BĎĚømvŒ®E^vǾ½Ĝ²Ro‚bÜeNŽ„^ĺ£R†¬lĶ÷YoĖ¥Ě¾|sOr°jY`~I”¾®I†{GqpCgyl{‡£œÍƒÍyPL“¡ƒ¡¸kW‡xYlÙæŠšŁĢzœ¾žV´W¶ùŸo¾ZHxjwfx„GNÁ•³Xéæl¶‰EièIH‰ u’jÌQ~v|sv¶Ôi|ú¢Fh˜Qsğ¦ƒSiŠBg™ÐE^ÁÐ{–čnOÂȞUÎóĔ†ÊēIJ}Z³½Mŧïeyp·uk³DsѨŸL“¶_œÅuèw»—€¡WqÜ]\\‘Ò§tƗcÕ¸ÕFÏǝĉăxŻČƟO‡ƒKÉġÿ×wg”÷IÅzCg†]m«ªGeçÃTC’«[‰t§{loWeC@ps_Bp‘­r‘„f_``Z|ei¡—oċMqow€¹DƝӛDYpûs•–‹Ykıǃ}s¥ç³[§ŸcYЧHK„«Qy‰]¢“wwö€¸ïx¼ņ¾Xv®ÇÀµRĠЋžHMž±cÏd„ƒǍũȅȷ±DSyúĝ£ŤĀàtÖÿï[îb\\}pĭÉI±Ñy…¿³x¯N‰o‰|¹H™ÏÛm‹júË~Tš•u˜ęjCöAwě¬R’đl¯ Ñb­‰ŇT†Ŀ_[Œ‘IčĄʿnM¦ğ\\É[T·™k¹œ©oĕ@A¾w•ya¥Y\\¥Âaz¯ãÁ¡k¥ne£Ûw†E©Êō¶˓uoj_Uƒ¡cF¹­[Wv“P©w—huÕyBF“ƒ`R‹qJUw\\i¡{jŸŸEPïÿ½fć…QÑÀQ{ž‚°‡fLԁ~wXg—ītêݾ–ĺ‘Hdˆ³fJd]‹HJ²…E€ƒoU¥†HhwQsƐ»Xmg±çve›]Dm͂PˆoCc¾‹_h”–høYrŊU¶eD°Č_N~øĹĚ·`z’]Äþp¼…äÌQŒv\\rCŒé¾TnkžŐڀÜa‡“¼ÝƆ̶Ûo…d…ĔňТJq’Pb ¾|JŒ¾fXŠƐîĨ_Z¯À}úƲ‹N_ĒĊ^„‘ĈaŐyp»CÇĕKŠšñL³ŠġMŒ²wrIÒŭxjb[œžn«øœ˜—æˆàƒ ^²­h¯Ú€ŐªÞ¸€Y²ĒVø}Ā^İ™´‚LŠÚm„¥ÀJÞ{JVŒųÞŃx×sxxƈē ģMř–ÚðòIf–Ċ“Œ\\Ʈ±ŒdʧĘD†vČ_Àæ~DŒċ´A®µ†¨ØLV¦êHÒ¤"]],"encodeOffsets":[[[113712,34000]],[[115612,30507]],[[113649,34054]]]},"properties":{"cp":[114.298572,30.584355],"name":"湖北","childNum":3}},{"id":"430000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@—n„FTs"],["@@ßÅÆá‰½ÔXr—†CO™“…ËR‘ïÿĩ­TooQyšÓ[‹ŅBE¬–ÎÓXa„į§Ã¸G °ITxp‰úxÚij¥Ïš–̾ŠedžÄ©ĸG…œàGh‚€M¤–Â_U}Ċ}¢pczfŠþg¤€”ÇòAV‘‹M"],["@@©K—ƒA·³CQ±Á«³BUŠƑ¹AŠtćOw™D]ŒJiØSm¯b£‘ylƒ›X…HËѱH•«–‘C^õľA–Å§¤É¥„ïyuǙuA¢^{ÌC´­¦ŷJ£^[†“ª¿‡ĕ~•Ƈ…•N… skóā‡¹¿€ï]ă~÷O§­@—Vm¡‹Qđ¦¢Ĥ{ºjԏŽŒª¥nf´•~ÕoŸž×Ûą‹MąıuZœmZcÒ IJβSÊDŽŶ¨ƚƒ’CÖŎªQؼrŭŽ­«}NÏürʬŒmjr€@ĘrTW ­SsdHzƓ^ÇÂyUi¯DÅYlŹu{hTœ}mĉ–¹¥ě‰Dÿë©ıÓ[Oº£ž“¥ót€ł¹MՄžƪƒ`Pš…Di–ÛUоÅ‌ìˆU’ñB“È£ýhe‰dy¡oċ€`pfmjP~‚kZa…ZsÐd°wj§ƒ@€Ĵ®w~^‚kÀÅKvNmX\\¨a“”сqvíó¿F„¤¡@ũÑVw}S@j}¾«pĂr–ªg àÀ²NJ¶¶Dô…K‚|^ª†Ž°LX¾ŴäPᜣEXd›”^¶›IJÞܓ~‘u¸ǔ˜Ž›MRhsR…e†`ÄofIÔ\\Ø  i”ćymnú¨cj ¢»–GČìƊÿШXeĈ¾Oð Fi ¢|[jVxrIQŒ„_E”zAN¦zLU`œcªx”OTu RLÄ¢dV„i`p˔vŎµªÉžF~ƒØ€d¢ºgİàw¸Áb[¦Zb¦–z½xBĖ@ªpº›šlS¸Ö\\Ĕ[N¥ˀmĎă’J\\‹ŀ`€…ňSڊĖÁĐiO“Ĝ«BxDõĚiv—ž–S™Ì}iùŒžÜnšÐºGŠ{Šp°M´w†ÀÒzJ²ò¨ oTçüöoÛÿñŽőФ‚ùTz²CȆȸǎۃƑÐc°dPÎŸğ˶[Ƚu¯½WM¡­Éž“’B·rížnZŸÒ `‡¨GA¾\\pē˜XhÆRC­üWGġu…T靧Ŏѝ©ò³I±³}_‘‹EÃħg®ęisÁPDmÅ{‰b[Rşs·€kPŸŽƥƒóRo”O‹ŸVŸ~]{g\\“êYƪ¦kÝbiċƵŠGZ»Ěõ…ó·³vŝž£ø@pyö_‹ëŽIkѵ‡bcѧy…×dY؎ªiþž¨ƒ[]f]Ņ©C}ÁN‡»hĻħƏ’ĩ"]],"encodeOffsets":[[[115640,30489]],[[112543,27312]],[[116690,26230]]]},"properties":{"cp":[112.982279,28.19409],"name":"湖南","childNum":3}},{"id":"440000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@QdˆAua"],["@@ƒlxDLo"],["@@sbhNLo"],["@@Ă āŸ"],["@@WltO[["],["@@Krœ]S"],["@@e„„I]y"],["@@I|„Mym"],["@@ƒÛ³LSŒž¼Y"],["@@nvºB–ëui©`¾"],["@@zdšÛ›Jw®"],["@@†°…¯"],["@@a yAª¸ËJIx،@€ĀHAmßV¡o•fu•o"],["@@šs‰ŗÃÔėAƁ›ZšÄ ~°ČP‚‹äh"],["@@‹¶Ý’Ì‚vmĞh­ı‡Q"],["@@HœŠdSjĒ¢D}war…“u«ZqadYM"],["@@elŒ\\LqqU"],["@@~rMo\\"],["@@f„^ƒC"],["@@øPªoj÷ÍÝħXČx”°Q¨ıXNv"],["@@gÇƳˆŽˆ”oˆŠˆ[~tly"],["@@E–ÆC¿‘"],["@@OŽP"],["@@w‹†đóg‰™ĝ—[³‹¡VÙæÅöM̳¹pÁaËýý©D©Ü“JŹƕģGą¤{Ùū…ǘO²«BƱéA—Ò‰ĥ‡¡«BhlmtÃPµyU¯uc“d·w_bŝcīímGOŽ|KP’ȏ‡ŹãŝIŕŭŕ@Óoo¿ē‹±ß}Ž…ŭ‚ŸIJWÈCőâUâǙI›ğʼn©I›ijEׅÁ”³Aó›wXJþ±ÌŒÜӔĨ£L]ĈÙƺZǾĆĖMĸĤfŒÎĵl•ŨnȈ‘ĐtF”Š–FĤ–‚êk¶œ^k°f¶gŠŽœ}®Fa˜f`vXŲxl˜„¦–ÔÁ²¬ÐŸ¦pqÊ̲ˆi€XŸØRDÎ}†Ä@ZĠ’s„x®AR~®ETtĄZ†–ƈfŠŠHâÒÐA†µ\\S¸„^wĖkRzŠalŽŜ|E¨ÈNĀňZTŒ’pBh£\\ŒĎƀuXĖtKL–¶G|Ž»ĺEļĞ~ÜĢÛĊrˆO˜Ùîvd]nˆ¬VœÊĜ°R֟pM††–‚ƂªFbwžEÀˆ˜©Œž\\…¤]ŸI®¥D³|ˎ]CöAŤ¦…æ’´¥¸Lv¼€•¢ĽBaô–F~—š®²GÌҐEY„„œzk¤’°ahlV՞I^‹šCxĈPŽsB‰ƒºV‰¸@¾ªR²ĨN]´_eavSi‡vc•}p}Đ¼ƌkJœÚe thœ†_¸ ºx±ò_xN›Ë‹²‘@ƒă¡ßH©Ùñ}wkNÕ¹ÇO½¿£ĕ]ly_WìIžÇª`ŠuTÅxYĒÖ¼k֞’µ‚MžjJÚwn\\h‘œĒv]îh|’È›Ƅøègž¸Ķß ĉĈWb¹ƀdéƌNTtP[ŠöSvrCZžžaGuœbo´ŖÒÇА~¡zCI…özx¢„Pn‹•‰Èñ @ŒĥÒ¦†]ƞŠV}³ăĔñiiÄÓVépKG½Ä‘ÓávYo–C·sit‹iaÀy„ŧΡÈYDÑům}‰ý|m[węõĉZÅxUO}÷N¹³ĉo_qtă“qwµŁYلǝŕ¹tïÛUïmRCº…ˆĭ|µ›ÕÊK™½R‘ē ó]‘–GªęAx–»HO£|ām‡¡diď×YïYWªʼnOeÚtĐ«zđ¹T…ā‡úE™á²\\‹ķÍ}jYàÙÆſ¿Çdğ·ùTßÇţʄ¡XgWÀLJğ·¿ÃˆOj YÇ÷Qě‹i"]],"encodeOffsets":[[[117381,22988]],[[116552,22934]],[[116790,22617]],[[116973,22545]],[[116444,22536]],[[116931,22515]],[[116496,22490]],[[116453,22449]],[[113301,21439]],[[118726,21604]],[[118709,21486]],[[113210,20816]],[[115482,22082]],[[113171,21585]],[[113199,21590]],[[115232,22102]],[[115739,22373]],[[115134,22184]],[[113056,21175]],[[119573,21271]],[[119957,24020]],[[115859,22356]],[[116561,22649]],[[116285,22746]]]},"properties":{"cp":[113.280637,23.125178],"name":"广东","childNum":24}},{"id":"450000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@H– TQ§•A"],["@@ĨʪƒLƒƊDÎĹĐCǦė¸zÚGn£¾›rªŀÜt¬@֛ڈSx~øOŒ˜ŶÐÂæȠ\\„ÈÜObĖw^oބLf¬°bI lTØB̈F£Ć¹gñĤaY“t¿¤VSñœK¸¤nM†¼‚JE±„½¸šŠño‹ÜCƆæĪ^ŠĚQÖ¦^‡ˆˆf´Q†üÜʝz¯šlzUĺš@쇀p¶n]sxtx¶@„~ÒĂJb©gk‚{°‚~c°`ԙ¬rV\\“la¼¤ôá`¯¹LC†ÆbŒxEræO‚v[H­˜„[~|aB£ÖsºdAĐzNÂðsŽÞƔ…Ĥªbƒ–ab`ho¡³F«èVloޤ™ÔRzpp®SŽĪº¨ÖƒºN…ij„d`’a”¦¤F³ºDÎńĀìŠCžĜº¦Ċ•~nS›|gźvZkCÆj°zVÈÁƔ]LÊFZg…čP­kini«‹qǀcz͔Y®¬Ů»qR×ō©DՄ‘§ƙǃŵTÉĩ±ŸıdÑnYY›IJvNĆÌØÜ Öp–}e³¦m‹©iÓ|¹Ÿħņ›|ª¦QF¢Â¬ʖovg¿em‡^ucà÷gՎuŒíÙćĝ}FϼĹ{µHK•sLSđƃr‹č¤[Ag‘oS‹ŇYMÿ§Ç{Fśbky‰lQxĕƒ]T·¶[B…ÑÏGáşşƇe€…•ăYSs­FQ}­Bƒw‘tYğÃ@~…C̀Q ×W‡j˱rÉ¥oÏ ±«ÓÂ¥•ƒ€k—ŽwWűŒmcih³K›~‰µh¯e]lµ›él•E쉕E“ďs‡’mǖŧē`ãògK_ÛsUʝ“ćğ¶hŒöŒO¤Ǜn³Žc‘`¡y‹¦C‘ez€YŠwa™–‘[ďĵűMę§]X˜Î_‚훘Û]é’ÛUćİÕBƣ±…dƒy¹T^džûÅÑŦ·‡PĻþÙ`K€¦˜…¢ÍeœĥR¿Œ³£[~Œäu¼dl‰t‚†W¸oRM¢ď\\zœ}Æzdvň–{ÎXF¶°Â_„ÒÂÏL©Ö•TmuŸ¼ãl‰›īkiqéfA„·Êµ\\őDc¥ÝF“y›Ôć˜c€űH_hL܋êĺШc}rn`½„Ì@¸¶ªVLŒŠhŒ‹\\•Ţĺk~ŽĠið°|gŒtTĭĸ^x‘vK˜VGréAé‘bUu›MJ‰VÃO¡…qĂXËS‰ģãlýàŸ_ju‡YÛÒB†œG^˜é֊¶§ŽƒEG”ÅzěƒƯ¤Ek‡N[kdåucé¬dnYpAyČ{`]þ¯T’bÜÈk‚¡Ġ•vŒàh„ÂƄ¢Jî¶²"]],"encodeOffsets":[[[111707,21520]],[[107619,25527]]]},"properties":{"cp":[108.320004,22.82402],"name":"广西","childNum":2}},{"id":"460000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@š¦Ŝil¢”XƦ‘ƞò–ïè§ŞCêɕrŧůÇąĻõ™·ĉ³œ̅kÇm@ċȧƒŧĥ‰Ľʉ­ƅſ“ȓÒ˦ŝE}ºƑ[ÍĜȋ gÎfǐÏĤ¨êƺ\\Ɔ¸ĠĎvʄȀœÐ¾jNðĀÒRŒšZdž™zÐŘΰH¨Ƣb²_Ġ "],"encodeOffsets":[[112750,20508]]},"properties":{"cp":[110.33119,20.031971],"name":"海南","childNum":1}},{"id":"510000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@LqKr"],["@@Š[ĻéV£ž_ţġñpG •réÏ·~ąSfy×͂·ºſƽiÍıƣıĻmHH}siaX@iǰÁÃ×t«ƒ­Tƒ¤J–JJŒyJ•ÈŠ`Ohߦ¡uËhIyCjmÿw…ZG……Ti‹SˆsO‰žB²ŸfNmsPaˆ{M{ŠõE‘^Hj}gYpaeuž¯‘oáwHjÁ½M¡pM“–uå‡mni{fk”\\oƒÎqCw†EZ¼K›ĝŠƒAy{m÷L‡wO×SimRI¯rK™õBS«sFe‡]fµ¢óY_ÆPRcue°Cbo׌bd£ŌIHgtrnyPt¦foaXďx›lBowz‹_{ÊéWiêE„GhܸºuFĈIxf®Ž•Y½ĀǙ]¤EyŸF²ċ’w¸¿@g¢§RGv»–áŸW`ÃĵJwi]t¥wO­½a[׈]`Ãi­üL€¦LabbTÀå’c}Íh™Æhˆ‹®BH€î|Ék­¤S†y£„ia©taį·Ɖ`ō¥Uh“O…ƒĝLk}©Fos‰´›Jm„µlŁu—…ø–nÑJWΪ–YÀïAetTžŅ‚ӍG™Ë«bo‰{ıwodƟ½ƒžOġܑµxàNÖ¾P²§HKv¾–]|•B‡ÆåoZ`¡Ø`ÀmºĠ~ÌЧnDž¿¤]wğ@sƒ‰rğu‰~‘Io”[é±¹ ¿žſđӉ@q‹gˆ¹zƱřaí°KtǤV»Ã[ĩǭƑ^ÇÓ@ỗs›Zϕ‹œÅĭ€Ƌ•ěpwDóÖሯneQˌq·•GCœýS]xŸ·ý‹q³•O՜Œ¶Qzßti{ř‰áÍÇWŝŭñzÇW‹pç¿JŒ™‚Xœĩè½cŒF–ÂLiVjx}\\N†ŇĖ¥Ge–“JA¼ÄHfÈu~¸Æ«dE³ÉMA|b˜Ò…˜ćhG¬CM‚õŠ„ƤąAvƒüV€éŀ‰_V̳ĐwQj´·ZeÈÁ¨X´Æ¡Qu·»Ÿ“˜ÕZ³ġqDo‰y`L¬gdp°şŠp¦ėìÅĮZްIä”h‚‘ˆzŠĵœf²å ›ĚрKp‹IN|‹„Ñz]ń……·FU×é»R³™MƒÉ»GM«€ki€™ér™}Ã`¹ăÞmȝnÁîRǀ³ĜoİzŔwǶVÚ£À]ɜ»ĆlƂ²Ġ…þTº·àUȞÏʦ¶†I’«dĽĢdĬ¿–»Ĕ׊h\\c¬†ä²GêëĤł¥ÀǿżÃÆMº}BÕĢyFVvw–ˆxBèĻĒ©Ĉ“tCĢɽŠȣ¦āæ·HĽî“ôNԓ~^¤Ɗœu„œ^s¼{TA¼ø°¢İªDè¾Ň¶ÝJ‘®Z´ğ~Sn|ªWÚ©òzPOȸ‚bð¢|‹øĞŠŒœŒQìÛÐ@Ğ™ǎRS¤Á§d…i“´ezÝúØã]Hq„kIŸþËQǦÃsǤ[E¬ÉŪÍxXƒ·ÖƁİlƞ¹ª¹|XÊwn‘ÆƄmÀêErĒtD®ċæcQƒ”E®³^ĭ¥©l}äQto˜ŖÜqƎkµ–„ªÔĻĴ¡@Ċ°B²Èw^^RsºT£ڿœQP‘JvÄz„^Đ¹Æ¯fLà´GC²‘dt˜­ĀRt¼¤ĦOðğfÔðDŨŁĞƘïžPȆ®âbMüÀXZ ¸£@Ś›»»QÉ­™]d“sÖ×_͖_ÌêŮPrĔĐÕGĂeZÜîĘqBhtO ¤tE[h|Y‹Ô‚ZśÎs´xº±UŒ’ñˆt|O’ĩĠºNbgþŠJy^dÂY Į„]Řz¦gC‚³€R`Šz’¢AjŒ¸CL„¤RÆ»@­Ŏk\\Ç´£YW}z@Z}‰Ã¶“oû¶]´^N‡Ò}èN‚ª–P˜Íy¹`S°´†ATe€VamdUĐwʄvĮÕ\\ƒu‹Æŗ¨Yp¹àZÂm™Wh{á„}WØǍ•Éüw™ga§áCNęÎ[ĀÕĪgÖɪX˜øx¬½Ů¦¦[€—„NΆL€ÜUÖ´òrÙŠxR^–†J˜k„ijnDX{Uƒ~ET{ļº¦PZc”jF²Ė@Žp˜g€ˆ¨“B{ƒu¨ŦyhoÚD®¯¢˜ WòàFΤ¨GDäz¦kŮPœġq˚¥À]€Ÿ˜eŽâÚ´ªKxī„Pˆ—Ö|æ[xäJÞĥ‚s’NÖ½ž€I†¬nĨY´®Ð—ƐŠ€mD™ŝuäđđEb…e’e_™v¡}ìęNJē}q”É埁T¯µRs¡M@}ůa†a­¯wvƉåZwž\\Z{åû^›"]],"encodeOffsets":[[[108815,30935]],[[110617,31811]]]},"properties":{"cp":[104.065735,30.659462],"name":"四川","childNum":2}},{"id":"520000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@†G\\†lY£‘in"],["@@q‚|ˆ‚mc¯tχVSÎ"],["@@hÑ£Is‡NgßH†›HªķÃh_¹ƒ¡ĝħń¦uيùŽgS¯JHŸ|sÝÅtÁïyMDč»eÕtA¤{b\\}—ƒG®u\\åPFq‹wÅaD…žK°ºâ_£ùbµ”mÁ‹ÛœĹM[q|hlaªāI}тƒµ@swtwm^oµˆD鼊yV™ky°ÉžûÛR…³‚‡eˆ‡¥]RՋěħ[ƅåÛDpŒ”J„iV™™‰ÂF²I…»mN·£›LbÒYb—WsÀbŽ™pki™TZĄă¶HŒq`……ĥ_JŸ¯ae«ƒKpÝx]aĕÛPƒÇȟ[ÁåŵÏő—÷Pw}‡TœÙ@Õs«ĿÛq©½œm¤ÙH·yǥĘĉBµĨÕnđ]K„©„œá‹ŸG纍§Õßg‡ǗĦTèƤƺ{¶ÉHÎd¾ŚÊ·OÐjXWrãLyzÉAL¾ę¢bĶėy_qMĔąro¼hĊžw¶øV¤w”²Ĉ]ʚKx|`ź¦ÂÈdr„cȁbe¸›`I¼čTF´¼Óýȃr¹ÍJ©k_șl³´_pН`oÒh޶pa‚^ÓĔ}D»^Xyœ`d˜[Kv…JPhèhCrĂĚÂ^Êƌ wˆZL­Ġ£šÁbrzOIl’MM”ĪŐžËr×ÎeŦŽtw|Œ¢mKjSǘňĂStÎŦEtqFT†¾†E쬬ôxÌO¢Ÿ KгŀºäY†„”PVgŎ¦Ŋm޼VZwVlŒ„z¤…ž£Tl®ctĽÚó{G­A‡ŒÇgeš~Αd¿æaSba¥KKûj®_ć^\\ؾbP®¦x^sxjĶI_Ä X‚⼕Hu¨Qh¡À@Ëô}ޱžGNìĎlT¸ˆ…`V~R°tbÕĊ`¸úÛtπFDu€[ƒMfqGH·¥yA‰ztMFe|R‚_Gk†ChZeÚ°to˜v`x‹b„ŒDnÐ{E}šZ˜è€x—†NEފREn˜[Pv@{~rĆAB§‚EO¿|UZ~ì„Uf¨J²ĂÝÆ€‚sª–B`„s¶œfvö¦ŠÕ~dÔq¨¸º»uù[[§´sb¤¢zþFœ¢Æ…Àhˆ™ÂˆW\\ıŽËI݊o±ĭŠ£þˆÊs}¡R]ŒěƒD‚g´VG¢‚j±®è†ºÃmpU[Á›‘Œëº°r›ÜbNu¸}Žº¼‡`ni”ºÔXĄ¤¼Ôdaµ€Á_À…†ftQQgœR—‘·Ǔ’v”}Ýלĵ]µœ“Wc¤F²›OĩųãW½¯K‚©…]€{†LóµCIµ±Mß¿hŸ•©āq¬o‚½ž~@i~TUxŪÒ¢@ƒ£ÀEîôruń‚”“‚b[§nWuMÆLl¿]x}ij­€½"]],"encodeOffsets":[[[112158,27383]],[[112105,27474]],[[112095,27476]]]},"properties":{"cp":[106.713478,26.578343],"name":"贵州","childNum":3}},{"id":"530000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@[„ùx½}ÑRH‘YīĺûsÍn‘iEoã½Ya²ė{c¬ĝg•ĂsA•ØÅwď‚õzFjw}—«Dx¿}UũlŸê™@•HÅ­F‰¨ÇoJ´Ónũuą¡Ã¢pÒŌ“Ø TF²‚xa²ËX€‚cʋlHîAßËŁkŻƑŷÉ©h™W­æßU‡“Ës¡¦}•teèÆ¶StǀÇ}Fd£j‹ĈZĆÆ‹¤T‚č\\Dƒ}O÷š£Uˆ§~ŃG™‚åŃDĝ¸œTsd¶¶Bªš¤u¢ŌĎo~t¾ÍŶÒtD¦Ú„iôö‰€z›ØX²ghįh½Û±¯€ÿm·zR¦Ɵ`ªŊÃh¢rOԍ´£Ym¼èêf¯ŪĽn„†cÚbŒw\\zlvWžªâˆ ¦g–mĿBş£¢ƹřbĥkǫßeeZkÙIKueT»sVesb‘aĕ  ¶®dNœĄÄpªyސ¼—„³BE˜®l‡ŽGœŭCœǶwêżĔÂe„pÍÀQƞpC„–¼ŲÈ­AÎô¶R„ä’Q^Øu¬°š_Èôc´¹ò¨P΢hlϦ´Ħ“Æ´sâDŽŲPnÊD^¯°’Upv†}®BP̪–jǬx–Söwlfòªv€qĸ|`H€­viļ€ndĜ­Ćhň•‚em·FyށqóžSᝑ³X_ĞçêtryvL¤§z„¦c¦¥jnŞk˜ˆlD¤øz½ĜàžĂŧMÅ|áƆàÊcðÂF܎‚áŢ¥\\\\º™İøÒÐJĴ‡„îD¦zK²ǏÎEh~’CD­hMn^ÌöÄ©ČZÀžaü„fɭyœpį´ěFűk]Ôě¢qlÅĆÙa¶~Äqššê€ljN¬¼H„ÊšNQ´ê¼VظE††^ŃÒyŒƒM{ŒJLoÒœęæŸe±Ķ›y‰’‡gã“¯JYÆĭĘëo¥Š‰o¯hcK«z_pŠrC´ĢÖY”—¼ v¸¢RŽÅW³Â§fǸYi³xR´ďUˊ`êĿU„û€uĆBƒƣö‰N€DH«Ĉg†——Ñ‚aB{ÊNF´¬c·Åv}eÇÃGB»”If•¦HňĕM…~[iwjUÁKE•Ž‹¾dĪçW›šI‹èÀŒoÈXòyŞŮÈXâÎŚŠj|àsRy‹µÖ›–Pr´þŒ ¸^wþTDŔ–Hr¸‹žRÌmf‡żÕâCôox–ĜƌÆĮŒ›Ð–œY˜tâŦÔ@]ÈǮƒ\\μģUsȯLbîƲŚºyh‡rŒŠ@ĒԝƀŸÀ²º\\êp“’JŠ}ĠvŠqt„Ġ@^xÀ£È†¨mËÏğ}n¹_¿¢×Y_æpˆÅ–A^{½•Lu¨GO±Õ½ßM¶w’ÁĢۂP‚›Ƣ¼pcIJxŠ|ap̬HšÐŒŊSfsðBZ¿©“XÏÒK•k†÷Eû¿‰S…rEFsÕūk”óVǥʼniTL‚¡n{‹uxţÏh™ôŝ¬ğōN“‘NJkyPaq™Âğ¤K®‡YŸxÉƋÁ]āęDqçgOg†ILu—\\_gz—]W¼ž~CÔē]bµogpў_oď`´³Țkl`IªºÎȄqÔþž»E³ĎSJ»œ_f·‚adÇqƒÇc¥Á_Źw{™L^ɱćx“U£µ÷xgĉp»ĆqNē`rĘzaĵĚ¡K½ÊBzyäKXqiWPÏɸ½řÍcÊG|µƕƣG˛÷Ÿk°_^ý|_zċBZocmø¯hhcæ\\lˆMFlư£Ĝ„ÆyH“„F¨‰µêÕ]—›HA…àӄ^it `þßäkŠĤÎT~Wlÿ¨„ÔPzUC–NVv [jâôDôď[}ž‰z¿–msSh‹¯{jïğl}šĹ[–őŒ‰gK‹©U·µË@¾ƒm_~q¡f¹…ÅË^»‘f³ø}Q•„¡Ö˳gͱ^ǁ…\\ëÃA_—¿bW›Ï[¶ƛ鏝£F{īZgm@|kHǭƁć¦UĔťƒ×ë}ǝƒeďºȡȘÏíBə£āĘPªij¶“ʼnÿ‡y©n‰ď£G¹¡I›Š±LÉĺÑdĉ܇W¥˜‰}g˜Á†{aqÃ¥aŠıęÏZ—ï`"],"encodeOffsets":[[104636,22969]]},"properties":{"cp":[102.712251,25.040609],"name":"云南","childNum":1}},{"id":"540000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@hžľxŽŖ‰xƒÒVކºÅâAĪÝȆµę¯Ňa±r_w~uSÕň‘qOj]ɄQ…£Z……UDûoY’»©M[‹L¼qãË{V͕çWViŽ]ë©Ä÷àyƛh›ÚU°ŒŒa”d„cQƒ~Mx¥™cc¡ÙaSyF—ցk­ŒuRýq¿Ôµ•QĽ³aG{¿FµëªéĜÿª@¬·–K‰·àariĕĀ«V»Ŷ™Ĵū˜gèLǴŇƶaf‹tŒèBŚ£^Šâ†ǐÝ®–šM¦ÁǞÿ¬LhŸŽJ¾óƾƺcxw‹f]Y…´ƒ¦|œQLn°aœdĊ…œ\\¨o’œǀÍŎœ´ĩĀd`tÊQŞŕ|‚¨C^©œĈ¦„¦ÎJĊ{ŽëĎjª²rЉšl`¼Ą[t|¦St辉PŒÜK¸€d˜Ƅı]s¤—î_v¹ÎVòŦj˜£Əsc—¬_Ğ´|٘¦Avަw`ăaÝaa­¢e¤ı²©ªSªšÈMĄwžÉØŔì@T‘¤—Ę™\\õª@”þo´­xA s”ÂtŎKzó´ÇĊµ¢rž^nĊ­Æ¬×üGž¢‚³ {âĊ]š™G‚~bÀgVjzlhǶf€žOšfdЉªB]pj„•TO–tĊ‚n¤}®¦ƒČ¥d¢¼»ddš”Y¼Žt—¢eȤJ¤}Ǿ¡°§¤AГlc@ĝ”sªćļđAç‡wx•UuzEÖġ~AN¹ÄÅȀݦ¿ģŁéì±H…ãd«g[؉¼ēÀ•cīľġ¬cJ‘µ…ÐʥVȝ¸ßS¹†ý±ğkƁ¼ą^ɛ¤Ûÿ‰b[}¬ōõÃ]ËNm®g@•Bg}ÍF±ǐyL¥íCˆƒIij€Ï÷њį[¹¦[⚍EÛïÁÉdƅß{âNÆāŨߝ¾ě÷yC£‡k­´ÓH@¹†TZ¥¢įƒ·ÌAЧ®—Zc…v½ŸZ­¹|ŕWZqgW“|ieZÅYVӁqdq•bc²R@†c‡¥Rã»Ge†ŸeƃīQ•}J[ғK…¬Ə|o’ėjġĠÑN¡ð¯EBčnwôɍėªƒ²•CλŹġǝʅįĭạ̃ūȹ]ΓͧgšsgȽóϧµǛ†ęgſ¶ҍć`ĘąŌJޚä¤rÅň¥ÖÁUětęuůÞiĊÄÀ\\Æs¦ÓRb|Â^řÌkÄŷ¶½÷‡f±iMݑ›‰@ĥ°G¬ÃM¥n£Øą‚ğ¯ß”§aëbéüÑOčœk£{\\‘eµª×M‘šÉfm«Ƒ{Å׃Gŏǩãy³©WÑăû‚··‘Q—òı}¯ã‰I•éÕÂZ¨īès¶ZÈsŽæĔTŘvŽgÌsN@îá¾ó@‰˜ÙwU±ÉT廣TđŸWxq¹Zo‘b‹s[׌¯cĩv‡Œėŧ³BM|¹k‰ªħ—¥TzNYnݍßpęrñĠĉRS~½ŠěVVе‚õ‡«ŒM££µB•ĉ¥áºae~³AuĐh`Ü³ç@BۘïĿa©|z²Ý¼D”£à貋ŸƒIƒû›I ā€óK¥}rÝ_Á´éMaň¨€~ªSĈ½Ž½KÙóĿeƃÆBŽ·¬ën×W|Uº}LJrƳ˜lŒµ`bÔ`QˆˆÐÓ@s¬ñIŒÍ@ûws¡åQÑßÁ`ŋĴ{Ī“T•ÚÅTSij‚‹Yo|Ç[ǾµMW¢ĭiÕØ¿@˜šMh…pÕ]j†éò¿OƇĆƇp€êĉâlØw–ěsˆǩ‚ĵ¸c…bU¹ř¨WavquSMzeo_^gsÏ·¥Ó@~¯¿RiīB™Š\\”qTGªÇĜçPoŠÿfñòą¦óQīÈáP•œābß{ƒZŗĸIæÅ„hnszÁCËìñšÏ·ąĚÝUm®ó­L·ăU›Èíoù´Êj°ŁŤ_uµ^‘°Œìǖ@tĶĒ¡Æ‡M³Ģ«˜İĨÅ®ğ†RŽāð“ggheÆ¢z‚Ê©Ô\\°ÝĎz~ź¤Pn–MĪÖB£Ÿk™n鄧żćŠ˜ĆK„ǰ¼L¶è‰âz¨u¦¥LDĘz¬ýÎmĘd¾ß”Fz“hg²™Fy¦ĝ¤ċņbΛ@y‚Ąæm°NĮZRÖíŽJ²öLĸÒ¨Y®ƌÐV‰à˜tt_ڀÂyĠzž]Ţh€zĎ{†ĢX”ˆc|šÐqŽšfO¢¤ög‚ÌHNŽ„PKŖœŽ˜Uú´xx[xˆvĐCûŠìÖT¬¸^}Ìsòd´_އKgžLĴ…ÀBon|H@–Êx˜—¦BpŰˆŌ¿fµƌA¾zLjRxжF”œkĄźRzŀˆ~¶[”´Hnª–VƞuĒ­È¨ƎcƽÌm¸ÁÈM¦x͊ëÀxdžB’šú^´W†£–d„kɾĬpœw‚˂ØɦļĬIŚœÊ•n›Ŕa¸™~J°î”lɌxĤÊÈðhÌ®‚g˜T´øŽàCˆŽÀ^ªerrƘdž¢İP|Ė ŸWœªĦ^¶´ÂL„aT±üWƜ˜ǀRšŶUńšĖ[QhlLüA†‹Ü\\†qR›Ą©"],"encodeOffsets":[[90849,37210]]},"properties":{"cp":[91.132212,29.660361],"name":"西藏","childNum":1}},{"id":"610000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@˜p¢—ȮµšûG™Ħ}Ħšðǚ¶òƄ€jɂz°{ºØkÈęâ¦jª‚Bg‚\\œċ°s¬Ž’]jžú ‚E”Ȍdž¬s„t‡”RˆÆdĠݎwܔ¸ôW¾ƮłÒ_{’Ìšû¼„jº¹¢GǪÒ¯ĘƒZ`ºŊƒecņąš~BÂgzpâēòYǠȰÌTΨÂWœ|fcŸă§uF—Œ@NŸ¢XLƒŠRMº[ğȣſï|¥J™kc`sʼnǷ’Y¹‹W@µ÷K…ãï³ÛIcñ·VȋڍÒķø©—þ¥ƒy‚ÓŸğęmWµÎumZyOŅƟĥÓ~sÑL¤µaŅY¦ocyZ{‰y c]{ŒTa©ƒ`U_Ěē£ωÊƍKù’K¶ȱÝƷ§{û»ÅÁȹÍéuij|¹cÑd‘ŠìUYƒŽO‘uF–ÕÈYvÁCqӃT•Ǣí§·S¹NgŠV¬ë÷Át‡°Dد’C´ʼnƒópģ}„ċcE˅FŸŸéGU¥×K…§­¶³B‹Č}C¿åċ`wġB·¤őcƭ²ő[Å^axwQO…ÿEËߌ•ĤNĔŸwƇˆÄŠńwĪ­Šo[„_KÓª³“ÙnK‰Çƒěœÿ]ď€ă_d©·©Ýŏ°Ù®g]±„Ÿ‡ß˜å›—¬÷m\\›iaǑkěX{¢|ZKlçhLt€Ňîŵ€œè[€É@ƉĄEœ‡tƇÏ˜³­ħZ«mJ…›×¾‘MtÝĦ£IwÄå\\Õ{‡˜ƒOwĬ©LÙ³ÙgBƕŀr̛ĢŭO¥lãyC§HÍ£ßEñŸX¡—­°ÙCgpťz‘ˆb`wI„vA|§”‡—hoĕ@E±“iYd¥OϹS|}F@¾oAO²{tfžÜ—¢Fǂ҈W²°BĤh^Wx{@„¬‚­F¸¡„ķn£P|ŸªĴ@^ĠĈæb–Ôc¶l˜Yi…–^Mi˜cϰÂ[ä€vï¶gv@À“Ĭ·lJ¸sn|¼u~a]’ÆÈtŌºJp’ƒþ£KKf~ЦUbyäIšĺãn‡Ô¿^­žŵMT–hĠܤko¼Ŏìąǜh`[tŒRd²IJ_œXPrɲ‰l‘‚XžiL§àƒ–¹ŽH˜°Ȧqº®QC—bA†„ŌJ¸ĕÚ³ĺ§ `d¨YjžiZvRĺ±öVKkjGȊĐePОZmļKÀ€‚[ŠŽ`ösìh†ïÎoĬdtKÞ{¬èÒÒBŒÔpIJÇĬJŊ¦±J«ˆY§‹@·pH€µàåVKe›pW†ftsAÅqC·¬ko«pHÆuK@oŸHĆۄķhx“e‘n›S³àǍrqƶRbzy€¸ËАl›¼EºpĤ¼Œx¼½~Ğ’”à@†ÚüdK^ˆmÌSj"],"encodeOffsets":[[110234,38774]]},"properties":{"cp":[108.948024,34.263161],"name":"陕西","childNum":1}},{"id":"620000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@VuUv"],["@@ũ‹EĠtt~nkh`Q‰¦ÅÄÜdw˜Ab×ĠąJˆ¤DüègĺqBqœj°lI¡ĨÒ¤úSHbš‡ŠjΑBаaZˆ¢KJŽ’O[|A£žDx}Nì•HUnrk„ kp€¼Y kMJn[aG‚áÚÏ[½rc†}aQxOgsPMnUs‡nc‹Z…ž–sKúvA›t„Þġ’£®ĀYKdnFwš¢JE°”Latf`¼h¬we|€Æ‡šbj}GA€·~WŽ”—`†¢MC¤tL©IJ°qdf”O‚“bÞĬ¹ttu`^ZúE`Œ[@„Æsîz®¡’C„ƳƜG²“R‘¢R’m”fŽwĸg܃‚ą G@pzJM½mŠhVy¸uÈÔO±¨{LfæU¶ßGĂq\\ª¬‡²I‚¥IʼnÈīoı‹ÓÑAçÑ|«LÝcspīðÍg…të_õ‰\\ĉñLYnĝg’ŸRǡÁiHLlõUĹ²uQjYi§Z_c¨Ÿ´ĹĖÙ·ŋI…ƒaBD˜­R¹ȥr—¯G•ºß„K¨jWk’ɱŠOq›Wij\\a­‹Q\\sg_ĆǛōëp»£lğۀgS•ŶN®À]ˆÓäm™ĹãJaz¥V}‰Le¤L„ýo‘¹IsŋÅÇ^‘Žbz…³tmEÁ´aйcčecÇN•ĊãÁ\\蝗dNj•]j†—ZµkÓda•ćå]ğij@ ©O{¤ĸm¢ƒE·®ƒ«|@Xwg]A챝‡XǁÑdzªc›wQÚŝñsÕ³ÛV_ýƒ˜¥\\ů¥©¾÷w—Ž©WÕÊĩhÿÖÁRo¸V¬âDb¨šhûx–Ê×nj~Zâƒg|šXÁnßYoº§ZÅŘvŒ[„ĭÖʃuďxcVbnUSf…B¯³_Tzº—ΕO©çMÑ~Mˆ³]µ^püµ”ŠÄY~y@X~¤Z³€[Èōl@®Å¼£QKƒ·Di‹¡By‘ÿ‰Q_´D¥hŗyƒ^ŸĭÁZ]cIzý‰ah¹MĪğP‘s{ò‡‹‘²Vw¹t³Ŝˁ[ŽÑ}X\\gsFŸ£sPAgěp×ëfYHāďÖqēŭOÏë“dLü•\\iŒ”t^c®šRʺ¶—¢H°mˆ‘rYŸ£BŸ¹čIoľu¶uI]vģSQ{ƒUŻ”Å}QÂ|̋°ƅ¤ĩŪU ęĄžÌZҞ\\v˜²PĔ»ƢNHƒĂyAmƂwVmž`”]ȏb•”H`‰Ì¢²ILvĜ—H®¤Dlt_„¢JJÄämèÔDëþgºƫ™”aʎÌrêYi~ ÎݤNpÀA¾Ĕ¼b…ð÷’Žˆ‡®‚”üs”zMzÖĖQdȨý†v§Tè|ªH’þa¸|šÐ ƒwKĢx¦ivr^ÿ ¸l öæfƟĴ·PJv}n\\h¹¶v†·À|\\ƁĚN´Ĝ€çèÁz]ġ¤²¨QÒŨTIl‡ªťØ}¼˗ƦvÄùØE‹’«Fï˛Iq”ōŒTvāÜŏ‚íÛߜÛV—j³âwGăÂíNOŠˆŠPìyV³ʼnĖýZso§HіiYw[߆\\X¦¥c]ÔƩÜ·«j‡ÐqvÁ¦m^ċ±R™¦΋ƈťĚgÀ»IïĨʗƮްƝ˜ĻþÍAƉſ±tÍEÕÞāNU͗¡\\ſčåÒʻĘm ƭÌŹöʥ’ëQ¤µ­ÇcƕªoIýˆ‰Iɐ_mkl³ă‰Ɠ¦j—¡Yz•Ňi–}Msßõ–īʋ —}ƒÁVmŸ_[n}eı­Uĥ¼‘ª•I{ΧDӜƻėoj‘qYhĹT©oūĶ£]ďxĩ‹ǑMĝ‰q`B´ƃ˺Ч—ç~™²ņj@”¥@đ´ί}ĥtPńǾV¬ufӃÉC‹tÓ̻‰…¹£G³€]ƖƾŎĪŪĘ̖¨ʈĢƂlɘ۪üºňUðǜȢƢż̌ȦǼ‚ĤŊɲĖ­Kq´ï¦—ºĒDzņɾªǀÞĈĂD†½ĄĎÌŗĞrôñnŽœN¼â¾ʄľԆ|DŽŽ֦ज़ȗlj̘̭ɺƅêgV̍ʆĠ·ÌĊv|ýĖÕWĊǎÞ´õ¼cÒÒBĢ͢UĜð͒s¨ňƃLĉÕÝ@ɛƯ÷¿Ľ­ĹeȏijëCȚDŲyê×Ŗyò¯ļcÂßY…tÁƤyAã˾J@ǝrý‹‰@¤…rz¸oP¹ɐÚyᐇHŸĀ[Jw…cVeȴϜ»ÈŽĖ}ƒŰŐèȭǢόĀƪÈŶë;Ñ̆ȤМľĮEŔ—ĹŊũ~ËUă{ŸĻƹɁύȩþĽvĽƓÉ@ē„ĽɲßǐƫʾǗĒpäWÐxnsÀ^ƆwW©¦cÅ¡Ji§vúF¶Ž¨c~c¼īŒeXǚ‹\\đ¾JŽwÀďksãA‹fÕ¦L}wa‚o”Z’‹D½†Ml«]eÒÅaɲáo½FõÛ]ĻÒ¡wYR£¢rvÓ®y®LF‹LzĈ„ôe]gx}•|KK}xklL]c¦£fRtív¦†PĤoH{tK"]],"encodeOffsets":[[[108619,36299]],[[108589,36341]]]},"properties":{"cp":[103.823557,36.058039],"name":"甘肃","childNum":2}},{"id":"630000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@InJm"],["@@CƒÆ½OŃĦsΰ~dz¦@@“Ņiš±è}ؘƄ˹A³r_ĞŠǒNΌĐw¤^ŬĵªpĺSZg’rpiƼĘԛ¨C|͖J’©Ħ»®VIJ~f\\m `Un„˜~ʌŸ•ĬàöNt•~ňjy–¢Zi˜Ɣ¥ĄŠk´nl`JʇŠJþ©pdƖ®È£¶ìRʦ‘źõƮËnŸʼėæÑƀĎ[‚˜¢VÎĂMÖÝÎF²sƊƀÎBļýƞ—¯ʘƭðħ¼Jh¿ŦęΌƇš¥²Q]Č¥nuÂÏriˆ¸¬ƪÛ^Ó¦d€¥[Wà…x\\ZŽjҕ¨GtpþYŊĕ´€zUO뇉P‰îMĄÁxH´á˜iÜUà›îÜՁĂÛSuŎ‹r“œJð̬EŒ‘FÁú×uÃÎkr“Ē{V}İ«O_ÌËĬ©ŽÓŧSRѱ§Ģ£^ÂyèçěM³Ƃę{[¸¿u…ºµ[gt£¸OƤĿéYŸõ·kŸq]juw¥Dĩƍ€õÇPéĽG‘ž©ã‡¤G…uȧþRcÕĕNy“yût“ˆ­‡ø‘†ï»a½ē¿BMoᣟÍj}éZËqbʍš“Ƭh¹ìÿÓAçãnIáI`ƒks£CG­ě˜Uy×Cy•…’Ÿ@¶ʡÊBnāzG„ơMē¼±O÷õJËĚăVŸĪũƆ£Œ¯{ËL½Ìzż“„VR|ĠTbuvJvµhĻĖH”Aëáa…­OÇðñęNw‡…œľ·L›mI±íĠĩPÉ×®ÿs—’cB³±JKßĊ«`…ađ»·QAmO’‘Vţéÿ¤¹SQt]]Çx€±¯A@ĉij¢Ó祖•ƒl¶ÅÛr—ŕspãRk~¦ª]Į­´“FR„åd­ČsCqđéFn¿Åƃm’Éx{W©ºƝºįkÕƂƑ¸wWūЩÈFž£\\tÈ¥ÄRÈýÌJ ƒlGr^×äùyÞ³fj”c†€¨£ÂZ|ǓMĝšÏ@ëÜőR‹›ĝ‰Œ÷¡{aïȷPu°ËXÙ{©TmĠ}Y³’­ÞIňµç½©C¡į÷¯B»|St»›]vƒųƒs»”}MÓ ÿʪƟǭA¡fs˜»PY¼c¡»¦c„ċ­¥£~msĉP•–Siƒ^o©A‰Šec‚™PeǵŽkg‚yUi¿h}aH™šĉ^|ᴟ¡HØûÅ«ĉ®]m€¡qĉ¶³ÈyôōLÁst“BŸ®wn±ă¥HSò뚣˜S’ë@לÊăxÇN©™©T±ª£IJ¡fb®ÞbŽb_Ą¥xu¥B—ž{łĝ³«`d˜Ɛt—¤ťiñžÍUuºí`£˜^tƃIJc—·ÛLO‹½Šsç¥Ts{ă\\_»™kϊ±q©čiìĉ|ÍIƒ¥ć¥›€]ª§D{ŝŖÉR_sÿc³Īō›ƿΑ›§p›[ĉ†›c¯bKm›R¥{³„Z†e^ŽŒwx¹dƽŽôIg §Mĕ ƹĴ¿—ǣÜ̓]‹Ý–]snåA{‹eŒƭ`ǻŊĿ\\ijŬű”YÂÿ¬jĖqŽßbЏ•L«¸©@ěĀ©ê¶ìÀEH|´bRľž–Ó¶rÀQþ‹vl®Õ‚E˜TzÜdb ˜hw¤{LR„ƒd“c‹b¯‹ÙVgœ‚ƜßzÃô쮍^jUèXΖ|UäÌ»rKŽ\\ŒªN‘¼pZCü†VY††¤ɃRi^rPҒTÖ}|br°qňb̰ªiƶGQ¾²„x¦PœmlŜ‘[Ĥ¡ΞsĦŸÔÏâ\\ªÚŒU\\f…¢N²§x|¤§„xĔsZPòʛ²SÐqF`ª„VƒÞŜĶƨVZŒÌL`ˆ¢dŐIqr\\oäõ–F礻Ŷ×h¹]Clـ\\¦ďÌį¬řtTӺƙgQÇÓHţĒ”´ÃbEÄlbʔC”|CˆŮˆk„Ʈ[ʼ¬ňœ´KŮÈΰÌζƶlð”ļA†TUvdTŠG†º̼ŠÔ€ŒsÊDԄveOg"]],"encodeOffsets":[[[105308,37219]],[[95370,40081]]]},"properties":{"cp":[101.778916,36.623178],"name":"青海","childNum":2}},{"id":"640000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@KëÀęĞ«OęȿȕŸı]ʼn¡åįÕÔ«Ǵõƪ™ĚQÐZhv K°›öqÀѐS[ÃÖHƖčË‡nL]ûc…Ùß@‚“ĝ‘¾}w»»‹oģF¹œ»kÌÏ·{zPƒ§B­¢íyÅt@ƒ@áš]Yv_ssģ¼i߁”ĻL¾ġsKD£¡N_…“˜X¸}B~Haiˆ™Åf{«x»ge_bs“KF¯¡Ix™mELcÿZ¤­Ģ‘ƒÝœsuBLù•t†ŒYdˆmVtNmtOPhRw~bd…¾qÐ\\âÙH\\bImlNZŸ»loƒŸqlVm–Gā§~QCw¤™{A\\‘PKŸNY‡¯bF‡kC¥’sk‹Šs_Ã\\ă«¢ħkJi¯r›rAhĹûç£CU‡ĕĊ_ԗBixÅُĄnªÑaM~ħpOu¥sîeQ¥¤^dkKwlL~{L~–hw^‚ófćƒKyEŒ­K­zuÔ¡qQ¤xZÑ¢^ļöܾEpž±âbÊÑÆ^fk¬…NC¾‘Œ“YpxbK~¥Že֎ŒäBlt¿Đx½I[ĒǙŒWž‹f»Ĭ}d§dµùEuj¨‚IÆ¢¥dXªƅx¿]mtÏwßR͌X¢͎vÆzƂZò®ǢÌʆCrâºMÞzžÆMҔÊÓŊZľ–r°Î®Ȉmª²ĈUªĚøºˆĮ¦ÌĘk„^FłĬhĚiĀ˾iİbjÕ"],["@@mfwěwMrŢªv@G‰"]],"encodeOffsets":[[[109366,40242]],[[108600,36303]]]},"properties":{"cp":[106.278179,38.46637],"name":"宁夏","childNum":2}},{"id":"650000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@QØĔ²X¨”~ǘBºjʐߨvK”ƔX¨vĊOžÃƒ·¢i@~c—‡ĝe_«”Eš“}QxgɪëÏÃ@sÅyXoŖ{ô«ŸuX…ê•Îf`œC‚¹ÂÿÐGĮÕĞXŪōŸMźÈƺQèĽôe|¿ƸJR¤ĘEjcUóº¯Ĩ_ŘÁMª÷Ð¥Oéȇ¿ÖğǤǷÂF҇zÉx[]­Ĥĝ‰œ¦EP}ûƥé¿İƷTėƫœŕƅ™ƱB»Đ±’ēO…¦E–•}‘`cȺrĦáŖuҞª«IJ‡πdƺÏØZƴwʄ¤ĖGЙǂZ̓èH¶}ÚZצʥĪï|ÇĦMŔ»İĝLj‹ì¥Βœba­¯¥ǕǚkĆŵĦɑĺƯxūД̵nơʃĽá½M»›òmqóŘĝč˾ăC…ćāƿÝɽ©DZŅ¹đ¥˜³ðLrÁ®ɱĕģʼnǻ̋ȥơŻǛȡVï¹Ň۩ûkɗġƁ§ʇė̕ĩũƽō^ƕŠUv£ƁQï“Ƶkŏ½ΉÃŭdzLқʻ«ƭ\\lƒ‡ŭD‡“{ʓDkaFÃÄa“³ŤđÔGRÈƚhSӹŚsİ«ĐË[¥ÚDkº^Øg¼ŵ¸£EÍö•€ůʼnT¡c_‡ËKY‹ƧUśĵ„݃U_©rETÏʜ±OñtYw獃{£¨uM³x½şL©Ùá[ÓÐĥ Νtģ¢\\‚ś’nkO›w¥±ƒT»ƷFɯàĩÞáB¹Æ…ÑUw„੍žĽw[“mG½Èå~‡Æ÷QyŠěCFmĭZī—ŵVÁ™ƿQƛ—ûXS²‰b½KϽĉS›©ŷXĕŸ{ŽĕK·¥Ɨcqq©f¿]‡ßDõU³h—­gËÇïģÉɋw“k¯í}I·šœbmœÉ–ř›īJɥĻˁ×xo›ɹī‡l•c…¤³Xù]‘™DžA¿w͉ì¥wÇN·ÂËnƾƍdǧđ®Ɲv•Um©³G\\“}µĿ‡QyŹl㓛µEw‰LJQ½yƋBe¶ŋÀů‡ož¥A—˜Éw@•{Gpm¿Aij†ŽKLhˆ³`ñcËtW‚±»ÕS‰ëüÿďD‡u\\wwwù³—V›LŕƒOMËGh£õP¡™er™Ïd{“‡ġWÁ…č|yšg^ğyÁzÙs`—s|ÉåªÇ}m¢Ń¨`x¥’ù^•}ƒÌ¥H«‰Yªƅ”Aйn~Ꝛf¤áÀz„gŠÇDIԝ´AňĀ҄¶ûEYospõD[{ù°]u›Jq•U•|Soċxţ[õÔĥkŋÞŭZ˺óYËüċrw €ÞkrťË¿XGÉbřaDü·Ē÷Aê[Ää€I®BÕИÞ_¢āĠpŠÛÄȉĖġDKwbm‡ÄNô‡ŠfœƫVÉvi†dz—H‘‹QµâFšù­Âœ³¦{YGžƒd¢ĚÜO „€{Ö¦ÞÍÀPŒ^b–ƾŠlŽ[„vt×ĈÍE˨¡Đ~´î¸ùÎh€uè`¸ŸHÕŔVºwĠââWò‡@{œÙNÝ´ə²ȕn{¿¥{l—÷eé^e’ďˆXj©î\\ªÑò˜Üìc\\üqˆÕ[Č¡xoÂċªbØ­Œø|€¶ȴZdÆÂšońéŒGš\\”¼C°ÌƁn´nxšÊOĨ’ہƴĸ¢¸òTxÊǪMīИÖŲÃɎOvˆʦƢ~FއRěò—¿ġ~åŊœú‰Nšžš¸qŽ’Ę[Ĕ¶ÂćnÒPĒÜvúĀÊbÖ{Äî¸~Ŕünp¤ÂH¾œĄYÒ©ÊfºmԈĘcDoĬMŬ’˜S¤„s²‚”ʘچžȂVŦ –ŽèW°ªB|IJXŔþÈJĦÆæFĚêŠYĂªĂ]øªŖNÞüA€’fɨJ€˜¯ÎrDDšĤ€`€mz\\„§~D¬{vJÂ˜«lµĂb–¤p€ŌŰNĄ¨ĊXW|ų ¿¾ɄĦƐMT”‡òP˜÷fØĶK¢ȝ˔Sô¹òEð­”`Ɩ½ǒÂň×äı–§ĤƝ§C~¡‚hlå‚ǺŦŞkâ’~}ŽFøàIJaĞ‚fƠ¥Ž„Ŕdž˜®U¸ˆźXœv¢aƆúŪtŠųƠjd•ƺŠƺÅìnrh\\ĺ¯äɝĦ]èpĄ¦´LƞĬŠ´ƤǬ˼Ēɸ¤rºǼ²¨zÌPðŀbþ¹ļD¢¹œ\\ĜÑŚŸ¶ZƄ³àjĨoâŠȴLʉȮŒĐ­ĚăŽÀêZǚŐ¤qȂ\\L¢ŌİfÆs|zºeªÙæ§΢{Ā´ƐÚ¬¨Ĵà²łhʺKÞºÖTŠiƢ¾ªì°`öøu®Ê¾ãØ"],"encodeOffsets":[[88824,50096]]},"properties":{"cp":[87.617733,43.792818],"name":"新疆","childNum":1}},{"id":"110000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@ĽOÁ›ûtŷmiÍt_H»Ĩ±d`й­{bw…Yr“³S]§§o¹€qGtm_Sŧ€“oa›‹FLg‘QN_•dV€@Zom_ć\\ߚc±x¯oœRcfe…£’o§ËgToÛJíĔóu…|wP¤™XnO¢ÉˆŦ¯rNÄā¤zâŖÈRpŢZŠœÚ{GŠrFt¦Òx§ø¹RóäV¤XdˆżâºWbwڍUd®bêņ¾‘jnŎGŃŶŠnzÚSeîĜZczî¾i]͜™QaúÍÔiþĩȨWĢ‹ü|Ėu[qb[swP@ÅğP¿{\\‡¥A¨Ï‘Ѩj¯ŠX\\¯œMK‘pA³[H…īu}}"],"encodeOffsets":[[120023,41045]]},"properties":{"cp":[116.405285,39.904989],"name":"北京","childNum":1}},{"id":"120000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@ŬgX§Ü«E…¶Ḟ“¬O_™ïlÁg“z±AXe™µÄĵ{¶]gitgšIj·›¥îakS€‰¨ÐƎk}ĕ{gB—qGf{¿a†U^fI“ư‹³õ{YƒıëNĿžk©ïËZŏ‘R§òoY×Ógc…ĥs¡bġ«@dekąI[nlPqCnp{ˆō³°`{PNdƗqSÄĻNNâyj]äžÒD ĬH°Æ]~¡HO¾ŒX}ÐxŒgp“gWˆrDGˆŒpù‚Š^L‚ˆrzWxˆZ^¨´T\\|~@I‰zƒ–bĤ‹œjeĊªz£®Ĕvě€L†mV¾Ô_ȔNW~zbĬvG†²ZmDM~”~"],"encodeOffsets":[[120237,41215]]},"properties":{"cp":[117.190182,39.125596],"name":"天津","childNum":1}},{"id":"310000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@ɧư¬EpƸÁxc‡"],["@@©„ªƒ"],["@@”MA‹‘š"],["@@Qp݁E§ÉC¾"],["@@bŝՕÕEȣÚƥêImɇǦèÜĠŒÚžÃƌÃ͎ó"],["@@ǜûȬɋŠŭ™×^‰sYŒɍDŋ‘ŽąñCG²«ªč@h–_p¯A{‡oloY€¬j@IJ`•gQڛhr|ǀ^MIJvtbe´R¯Ô¬¨YŽô¤r]ì†Ƭį"]],"encodeOffsets":[[[124702,32062]],[[124547,32200]],[[124808,31991]],[[124726,32110]],[[124903,32376]],[[124438,32149]]]},"properties":{"cp":[121.472644,31.231706],"name":"上海","childNum":6}},{"id":"500000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@vjG~nGŘŬĶȂƀƾ¹¸ØÎezĆT¸}êЖqHŸðqĖ䒊¥^CƒIj–²p…\\_ æüY|[YxƊæuž°xb®…Űb@~¢NQt°¶‚S栓Ê~rljĔëĚ¢~šuf`‘‚†fa‚ĔJåĊ„nÖ]„jƎćÊ@Š£¾a®£Ű{ŶĕF‹ègLk{Y|¡ĜWƔtƬJÑxq‹±ĢN´‰òK‰™–LÈüD|s`ŋ’ć]ƒÃ‰`đŒMûƱ½~Y°ħ`ƏíW‰½eI‹½{aŸ‘OIrÏ¡ĕŇa†p†µÜƅġ‘œ^ÖÛbÙŽŏml½S‹êqDu[R‹ãË»†ÿw`»y‘¸_ĺę}÷`M¯ċfCVµqʼn÷Z•gg“Œ`d½pDO‡ÎCnœ^uf²ènh¼WtƏxRGg¦…pV„†FI±ŽG^ŒIc´ec‡’G•ĹÞ½sëĬ„h˜xW‚}Kӈe­Xsbk”F¦›L‘ØgTkïƵNï¶}Gy“w\\oñ¡nmĈzjŸ•@™Óc£»Wă¹Ój“_m»ˆ¹·~MvÛaqœ»­‰êœ’\\ÂoVnŽÓØÍ™²«‹bq¿efE „€‹Ĝ^Qž~ Évý‡ş¤²Į‰pEİ}zcĺƒL‹½‡š¿gņ›¡ýE¡ya£³t\\¨\\vú»¼§·Ñr_oÒý¥u‚•_n»_ƒ•At©Þűā§IVeëƒY}{VPÀFA¨ąB}q@|Ou—\\Fm‰QF݅Mw˜å}]•€|FmϋCaƒwŒu_p—¯sfÙgY…DHl`{QEfNysBЦzG¸rHe‚„N\\CvEsÐùÜ_·ÖĉsaQ¯€}_U‡†xÃđŠq›NH¬•Äd^ÝŰR¬ã°wećJEž·vÝ·Hgƒ‚éFXjÉê`|yŒpxkAwœWĐpb¥eOsmzwqChóUQl¥F^laf‹anòsr›EvfQdÁUVf—ÎvÜ^efˆtET¬ôA\\œ¢sJŽnQTjP؈xøK|nBz‰„œĞ»LY‚…FDxӄvr“[ehľš•vN”¢o¾NiÂxGp⬐z›bfZo~hGi’]öF|‰|Nb‡tOMn eA±ŠtPT‡LjpYQ|†SH††YĀxinzDJ€Ìg¢và¥Pg‰_–ÇzII‹€II•„£®S¬„Øs쐣ŒN"],["@@ifjN@s"]],"encodeOffsets":[[[109628,30765]],[[111725,31320]]]},"properties":{"cp":[106.504962,29.533155],"name":"重庆","childNum":2}},{"id":"810000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@AlBk"],["@@mŽn"],["@@EpFo"],["@@ea¢pl¸Eõ¹‡hj[ƒ]ÔCΖ@lj˜¡uBXŸ…•´‹AI¹…[‹yDUˆ]W`çwZkmc–…M›žp€Åv›}I‹oJlcaƒfёKްä¬XJmРđhI®æÔtSHn€Eˆ„ÒrÈc"],["@@rMUw‡AS®€e"]],"encodeOffsets":[[[117111,23002]],[[117072,22876]],[[117045,22887]],[[116975,23082]],[[116882,22747]]]},"properties":{"cp":[114.173355,22.320048],"name":"香港","childNum":5}},{"id":"820000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@kÊd°å§s"],"encodeOffsets":[[116279,22639]]},"properties":{"cp":[113.54909,22.198951],"name":"澳门","childNum":1}}],"UTF8Encoding":true});
}));
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/map/js/world.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/map/js/world.js

Statements: 50% (8 / 16)      Branches: 41.18% (7 / 17)      Functions: 66.67% (2 / 3)      Lines: 50% (8 / 16)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 281 1     1   1           1         1       1       1    
(function (root, factory) {
    Iif (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['exports', 'echarts'], factory);
    } else Eif (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
        // CommonJS
        factory(exports, require('echarts'));
    } else {
        // Browser globals
        factory({}, root.echarts);
    }
}(this, function (exports, echarts) {
    var log = function (msg) {
        if (typeof console !== 'undefined') {
            console && console.error && console.error(msg);
        }
    }
    Iif (!echarts) {
        log('ECharts is not Loaded');
        return;
    }
    Iif (!echarts.registerMap) {
        log('ECharts Map is not loaded')
        return;
    }
    echarts.registerMap('world', {"type":"FeatureCollection","features":[{"geometry":{"type":"Polygon","coordinates":[[[74.54140625000002,37.02216796875],[74.03886718750002,36.825732421874996],[73.116796875,36.868554687499994],[72.24980468750002,36.734716796875],[71.23291015625,36.12177734375],[71.18505859375,36.04208984375],[71.57197265625001,35.546826171875],[71.62050781250002,35.183007812499994],[70.965625,34.53037109375],[71.095703125,34.369433593749996],[71.05156250000002,34.049707031249994],[70.65400390625001,33.952294921874994],[69.8896484375,34.007275390625],[70.26113281250002,33.289013671875],[69.5015625,33.020068359374996],[69.24140625000001,32.433544921875],[69.279296875,31.936816406249996],[68.86894531250002,31.634228515624997],[68.59765625,31.802978515625],[68.16103515625002,31.802978515625],[67.57822265625,31.506494140624994],[67.737890625,31.343945312499997],[67.45283203125001,31.234619140625],[66.82929687500001,31.263671875],[66.346875,30.802783203124996],[66.23125,29.86572265625],[65.09550781250002,29.559472656249994],[64.39375,29.544335937499994],[64.09873046875,29.391943359375],[63.56757812500001,29.497998046874997],[62.4765625,29.408349609374994],[62.0009765625,29.530419921874994],[61.22441406250002,29.749414062499994],[60.843359375,29.858691406249996],[61.331640625,30.363720703124997],[61.55947265625002,30.599365234375],[61.7841796875,30.831933593749994],[61.81083984375002,30.91328125],[61.81425781250002,31.072558593749996],[61.75507812500001,31.285302734374994],[61.66015625,31.382421875],[61.34648437500002,31.421630859375],[61.11074218750002,31.451123046874997],[60.854101562500006,31.483251953125],[60.82070312500002,31.495166015624996],[60.791601562500006,31.660595703124997],[60.804296875,31.73447265625],[60.7875,31.877197265625],[60.78994140625002,31.987109375],[60.827246093750006,32.16796875],[60.82929687500001,32.249414062499994],[60.71044921875,32.6],[60.57656250000002,32.994873046875],[60.560546875,33.137841796874994],[60.9169921875,33.505224609375],[60.573828125,33.588330078125],[60.4859375,33.7119140625],[60.48574218750002,34.094775390624996],[60.642675781250006,34.307177734374996],[60.88945312500002,34.31943359375],[60.80390625000001,34.418017578124996],[60.76259765625002,34.475244140624994],[60.73613281250002,34.491796875],[60.72626953125001,34.51826171875],[60.73945312500001,34.544726562499996],[60.80234375,34.554638671875],[60.8453125,34.587695312499996],[60.91474609375001,34.633984375],[60.951171875,34.653857421874996],[61.080078125,34.855615234374994],[61.1,35.272314453125],[61.18925781250002,35.31201171875],[61.24550781250002,35.474072265625],[61.27851562500001,35.51376953125],[61.281835937500006,35.55341796875],[61.26201171875002,35.619580078125],[61.3447265625,35.6294921875],[61.62099609375002,35.43232421875],[62.08964843750002,35.3796875],[62.30781250000001,35.170800781249994],[62.688085937500006,35.255322265625],[63.056640625,35.44580078125],[63.08417968750001,35.56806640625],[63.16972656250002,35.678125],[63.129980468750006,35.84619140625],[63.8625,36.012353515624994],[64.184375,36.14892578125],[64.51103515625002,36.340673828125],[64.56582031250002,36.427587890625],[64.6025390625,36.554541015625],[64.78242187500001,37.05927734375],[64.81630859375002,37.132080078125],[64.95156250000002,37.1935546875],[65.08964843750002,37.237939453124994],[65.30361328125002,37.24677734375],[65.55498046875002,37.251171875],[65.76503906250002,37.569140625],[66.471875,37.3447265625],[66.52226562500002,37.348486328125],[66.827734375,37.3712890625],[67.06884765625,37.334814453125],[67.19550781250001,37.235205078125],[67.31972656250002,37.2095703125],[67.44169921875002,37.2580078125],[67.51728515625001,37.266650390624996],[67.546484375,37.235644531249996],[67.607421875,37.222509765625],[67.7,37.22724609375],[67.7529296875,37.1998046875],[67.75898437500001,37.172216796875],[67.76601562500002,37.14013671875],[67.83447265625,37.064208984375],[67.9580078125,36.972021484375],[68.06777343750002,36.9498046875],[68.26093750000001,37.013085937499994],[68.284765625,37.036328125],[68.29951171875001,37.088427734374996],[68.38691406250001,37.1375],[68.66914062500001,37.2583984375],[68.7232421875,37.268017578125],[68.78203125000002,37.2580078125],[68.82373046875,37.270703125],[68.8384765625,37.30283203125],[68.85537109375002,37.316845703125],[68.88525390625,37.328076171875],[68.91181640625001,37.333935546875],[68.96044921875,37.325048828125],[69.18017578125,37.15830078125],[69.26484375000001,37.1083984375],[69.30390625000001,37.116943359375],[69.35380859375002,37.150048828124994],[69.41445312500002,37.207763671875],[69.4296875,37.290869140625],[69.39921875000002,37.399316406249994],[69.42011718750001,37.48671875],[69.49208984375002,37.553076171875],[69.62578125000002,37.594042968749996],[69.8208984375,37.6095703125],[69.9849609375,37.566162109375],[70.18867187500001,37.582470703125],[70.25146484375,37.66416015625],[70.25498046875,37.765380859375],[70.19941406250001,37.886035156249996],[70.21464843750002,37.9244140625],[70.41777343750002,38.075439453125],[70.7359375,38.42255859375],[71.255859375,38.306982421875],[71.33271484375001,38.170263671875],[71.27851562500001,37.918408203125],[71.319921875,37.90185546875],[71.3896484375,37.906298828124996],[71.48779296875,37.931884765625],[71.55195312500001,37.933154296874996],[71.58222656250001,37.910107421875],[71.43291015625002,37.1275390625],[71.530859375,36.845117187499994],[71.665625,36.696923828124994],[72.65742187500001,37.029052734375],[72.8955078125,37.267529296875],[73.21113281250001,37.408496093749996],[73.38291015625,37.462255859375],[73.48134765625002,37.4716796875],[73.60468750000001,37.446044921875],[73.65712890625002,37.43046875],[73.72060546875002,37.41875],[73.73378906250002,37.37578125],[73.71728515625,37.329443359375],[73.6275390625,37.261572265625],[73.65351562500001,37.23935546875],[73.749609375,37.231787109375],[74.16708984375,37.329443359375],[74.20351562500002,37.372460937499994],[74.25966796875002,37.415429687499994],[74.659375,37.394482421875],[74.73056640625,37.35703125],[74.83046875000002,37.2859375],[74.89130859375001,37.231640625],[74.84023437500002,37.225048828125],[74.76738281250002,37.249169921874994],[74.73896484375001,37.28564453125],[74.72666015625,37.29072265625],[74.6689453125,37.26669921875],[74.55898437500002,37.236621093749996],[74.37216796875,37.15771484375],[74.37617187500001,37.137353515624994],[74.49794921875002,37.0572265625],[74.52646484375,37.030664062499994],[74.54140625000002,37.02216796875]]]},"properties":{"name":"Afghanistan","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[17.57958984375,-8.099023437500009],[17.643359375000017,-8.090722656250009],[18.00878906250003,-8.107617187499983],[18.56269531250001,-7.9359375],[18.944433593750063,-8.001464843750028],[19.142675781250034,-8.001464843750028],[19.34082031249997,-7.966601562500031],[19.369921875000045,-7.706542968749986],[19.371679687500063,-7.655078124999989],[19.47988281250008,-7.472167968750028],[19.48378906250008,-7.279492187500026],[19.527636718750017,-7.144433593749952],[19.87519531250004,-6.986328124999986],[19.99746093750008,-6.976464843750023],[20.190039062500063,-6.9462890625],[20.482226562500074,-6.915820312500017],[20.59003906250001,-6.919921874999957],[20.598730468750006,-6.935156249999949],[20.536914062500045,-7.121777343749955],[20.535839843749983,-7.182812499999955],[20.558398437500045,-7.244433593749989],[20.60781250000008,-7.277734375000023],[20.910937500000017,-7.281445312499983],[21.190332031250023,-7.284960937499989],[21.751074218750034,-7.305468749999989],[21.80605468750005,-7.32861328125],[21.905371093750034,-8.693359374999943],[21.813183593750068,-9.46875],[22.19775390625,-10.040625],[22.30703125000005,-10.691308593750023],[22.203515625000023,-10.829492187500009],[22.226171875,-11.121972656250009],[22.27880859375,-11.19414062499996],[22.314941406250057,-11.198632812499994],[22.39296875000005,-11.159472656250003],[22.486132812500045,-11.086718750000017],[22.56103515625003,-11.05585937500004],[22.814746093750017,-11.08027343750004],[23.076269531250006,-11.087890624999986],[23.463964843750034,-10.969335937499991],[23.83388671875008,-11.013671874999972],[23.96650390625001,-10.871777343750011],[23.98388671875,-11.725],[23.909375,-12.636132812500009],[23.886523437500045,-12.743261718749991],[23.882421875,-12.799023437499983],[23.968066406250045,-12.956933593749994],[23.962988281250006,-12.988476562500026],[23.843164062500023,-13.0009765625],[22.209570312500006,-13.0009765625],[21.97890625000008,-13.0009765625],[21.979101562500034,-13.798730468749994],[21.979296875000074,-14.11962890625],[21.979394531249994,-14.440527343750006],[21.97978515624999,-15.955566406250014],[22.193945312500006,-16.628125],[23.380664062500017,-17.640625],[22.32421875,-17.8375],[20.74550781250008,-18.019726562499983],[20.194335937500057,-17.86367187499999],[18.95527343750004,-17.80351562499999],[18.39638671875005,-17.3994140625],[16.14843750000003,-17.39023437499999],[14.017480468750023,-17.40888671874997],[13.475976562500023,-17.04003906249997],[13.179492187500017,-16.971679687499986],[12.548144531250017,-17.212695312499974],[12.35927734375008,-17.205859375],[12.318457031250006,-17.21337890625003],[12.213378906250028,-17.209960937500043],[12.013964843750074,-17.168554687500034],[11.902539062500011,-17.226562499999957],[11.743066406250023,-17.24921875000004],[11.780078125000017,-16.87128906249997],[11.818945312500034,-16.704101562500014],[11.750878906250023,-15.831933593749966],[12.016113281250057,-15.513671874999957],[12.55048828125004,-13.437792968750003],[12.983203124999989,-12.775683593750017],[13.4169921875,-12.52041015624998],[13.597949218750017,-12.286132812500028],[13.785351562499983,-11.81279296874996],[13.833593750000063,-10.9296875],[13.33222656250004,-9.998925781250009],[12.99853515625,-9.048046875],[13.358984375,-8.687207031250026],[13.378515625000063,-8.369726562500006],[12.82343750000004,-6.954785156249955],[12.283300781250063,-6.12431640624996],[13.184375,-5.85625],[13.346484375000017,-5.863378906250006],[13.978515625,-5.857226562500003],[16.315234375000074,-5.865625],[16.431445312500045,-5.90019531249996],[16.53710937499997,-5.9658203125],[16.697265625,-6.164257812500026],[16.74296874999999,-6.618457031250003],[16.813085937500063,-6.772558593749963],[16.919433593750057,-6.93398437499998],[16.98476562500005,-7.257421874999977],[17.57958984375,-8.099023437500009]]],[[[12.50146484375,-4.5875],[12.848144531250028,-4.428906249999983],[12.881054687500068,-4.445117187499989],[12.971386718750068,-4.551757812499957],[13.048046875000068,-4.619238281250034],[13.072753906250028,-4.634765625],[13.057324218750011,-4.651074218750026],[12.947460937500011,-4.695312499999986],[12.829687499999977,-4.73662109374996],[12.451464843750017,-5.071484374999969],[12.453222656250034,-5.090625],[12.52236328125008,-5.148925781250028],[12.484570312500011,-5.71875],[12.213671875000074,-5.758691406249994],[12.177148437499994,-5.324804687499977],[12.018359375000074,-5.004296874999966],[12.50146484375,-4.5875]]]]},"properties":{"name":"Angola","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[20.06396484375,42.54726562499999],[20.485449218750006,42.223388671875],[20.566210937500017,41.873681640624994],[20.48896484375001,41.272607421874994],[20.709277343750017,40.928369140624994],[20.964257812500023,40.849902343749996],[20.95576171875001,40.775292968749994],[21.030859375,40.622460937499994],[20.881640625000017,40.467919921874994],[20.65742187500001,40.1173828125],[20.4560546875,40.065576171874994],[20.408007812500017,40.049462890624994],[20.383691406250023,40.0171875],[20.338476562500006,39.991064453125],[20.311132812500006,39.979443359375],[20.311328125000017,39.95078125],[20.381640625000017,39.841796875],[20.382421875,39.802636718749994],[20.206835937500017,39.653515625],[20.13105468750001,39.66162109375],[20.05976562500001,39.699121093749994],[20.022558593750006,39.710693359375],[20.001269531250017,39.709423828125],[19.851855468750017,40.0435546875],[19.322265625,40.407080078125],[19.45917968750001,40.40537109375],[19.3375,40.663818359375],[19.57568359375,41.640429687499996],[19.577539062500023,41.7875],[19.342382812500006,41.869091796875],[19.280664062500023,42.17255859375],[19.65449218750001,42.628564453124994],[19.78828125000001,42.476171875],[20.06396484375,42.54726562499999]]]},"properties":{"name":"Albania","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[19.66230468750001,60.187158203124994],[19.53652343750005,60.14497070312501],[19.551367187500063,60.24384765625001],[19.66230468750001,60.187158203124994]]],[[[19.989550781250074,60.351171875],[20.258886718750063,60.26127929687499],[19.799804687500057,60.08173828125001],[19.68691406250005,60.267626953125045],[19.84765625000003,60.22055664062506],[19.823046875000074,60.390185546875045],[19.989550781250074,60.351171875]]]]},"properties":{"name":"Aland","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[1.7060546875,42.503320312499994],[1.534082031250023,42.441699218749996],[1.448828125,42.437451171875],[1.428125,42.46132812499999],[1.414843750000017,42.548388671874996],[1.428320312500006,42.5958984375],[1.501367187500023,42.642724609374994],[1.568164062500017,42.635009765625],[1.709863281250023,42.604443359375],[1.739453125000011,42.575927734375],[1.740234375,42.55673828125],[1.713964843750006,42.525634765625],[1.7060546875,42.503320312499994]]]},"properties":{"name":"Andorra","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[53.927832031250006,24.177197265624983],[53.63447265625004,24.169775390624977],[53.83378906250002,24.258935546875023],[53.927832031250006,24.177197265624983]]],[[[53.3322265625001,24.258593750000045],[53.19091796874997,24.290917968749966],[53.412402343750074,24.411035156250023],[53.3322265625001,24.258593750000045]]],[[[56.29785156250003,25.650683593750045],[56.38798828125002,24.97919921875004],[56.06386718750005,24.73876953125],[56.00058593750006,24.953222656249977],[55.795703125000074,24.868115234374955],[55.76083984375006,24.24267578125],[55.92861328125005,24.215136718750074],[55.98515625000002,24.063378906249966],[55.4684570312501,23.94111328125001],[55.53164062499999,23.81904296875001],[55.1999023437501,23.034765625000034],[55.185839843750074,22.7041015625],[55.104296875000074,22.621484375000023],[52.55507812500005,22.932812499999955],[51.592578125000074,24.07885742187503],[51.56835937500003,24.286181640625074],[51.76757812500003,24.25439453125],[51.84316406250005,24.010888671875023],[52.118554687499994,23.97109375],[52.64824218750002,24.154638671875006],[53.80175781249997,24.069482421874966],[54.14794921875003,24.17119140624999],[54.39707031250006,24.278173828125034],[54.74677734375004,24.810449218750023],[55.94121093750002,25.793994140625017],[56.08046875,26.06264648437505],[56.16748046875003,26.047460937499977],[56.144628906250006,25.690527343750006],[56.29785156250003,25.650683593750045]]]]},"properties":{"name":"United Arab Emirates","childNum":3}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-64.54916992187498,-54.71621093749998],[-63.81542968749997,-54.725097656250014],[-64.637353515625,-54.90253906250001],[-64.75732421875,-54.82656249999999],[-64.54916992187498,-54.71621093749998]]],[[[-68.65322265624994,-54.85361328124999],[-68.62993164062499,-52.65263671875004],[-68.24013671875,-53.08183593749999],[-68.43115234375,-53.0552734375],[-68.48852539062497,-53.260937499999976],[-68.16113281249997,-53.30644531250001],[-68.00849609374995,-53.5640625],[-67.29423828125002,-54.049804687500014],[-66.23564453124999,-54.53349609374997],[-65.17900390624993,-54.678125],[-65.47114257812495,-54.91464843749999],[-66.5111328125,-55.032128906249945],[-67.127099609375,-54.90380859375001],[-68.65322265624994,-54.85361328124999]]],[[[-61.084716796875,-23.65644531250001],[-60.83984375000003,-23.85810546874997],[-59.89248046874994,-24.093554687499974],[-59.18725585937497,-24.56230468749999],[-57.82167968749994,-25.136425781249983],[-57.56313476562494,-25.473730468749963],[-57.943115234375,-26.05292968750001],[-58.18149414062498,-26.30742187499999],[-58.222070312499994,-26.65],[-58.618603515624955,-27.13212890624996],[-58.64174804687494,-27.196093750000017],[-58.60483398437498,-27.314355468750037],[-58.16826171874993,-27.27343749999997],[-56.437158203124966,-27.553808593749977],[-56.16406250000003,-27.321484374999983],[-55.95146484374996,-27.325683593749957],[-55.789990234374926,-27.416406249999966],[-55.71464843749996,-27.41484375],[-55.632910156250006,-27.35712890624997],[-55.59379882812502,-27.288085937500014],[-55.597265625,-27.207617187499963],[-55.56489257812498,-27.15],[-55.496728515624966,-27.11533203124999],[-55.45063476562498,-27.068359375000014],[-55.426660156249994,-27.00927734374997],[-55.13593750000001,-26.931152343749957],[-54.934472656249994,-26.70253906250001],[-54.677734375,-26.308789062499997],[-54.631933593750006,-26.005761718749994],[-54.615869140624994,-25.576074218750023],[-54.44394531249998,-25.625],[-54.15458984374999,-25.523046874999963],[-53.89116210937499,-25.66884765625001],[-53.668554687500006,-26.288183593749977],[-53.83818359375002,-27.121093750000014],[-54.32700195312495,-27.423535156249997],[-54.82910156250003,-27.55058593750003],[-55.10151367187501,-27.866796874999963],[-55.72548828125002,-28.20410156250003],[-55.68725585937497,-28.38164062499996],[-55.890527343749994,-28.370019531249994],[-56.938623046874994,-29.594824218750034],[-57.22465820312499,-29.782128906249994],[-57.40522460937501,-30.03388671875004],[-57.563867187499994,-30.139941406249974],[-57.60888671875003,-30.187792968750045],[-57.65087890624997,-30.295019531250034],[-57.71269531249996,-30.38447265624997],[-57.83120117187502,-30.495214843749963],[-57.87250976562501,-30.591015625000026],[-57.81059570312499,-30.85859375000001],[-57.88632812499998,-30.937402343749994],[-57.86840820312497,-31.104394531249994],[-57.89335937499999,-31.195312499999957],[-58.03339843750001,-31.416601562500006],[-58.053857421874994,-31.494921874999974],[-58.009667968749966,-31.534375],[-57.98798828124998,-31.576171875],[-58.00698242187494,-31.684960937499966],[-58.04233398437495,-31.769238281249997],[-58.16748046874997,-31.87265625],[-58.18901367187499,-31.924218750000037],[-58.16040039062503,-31.986523437500026],[-58.156347656250006,-32.0515625],[-58.17700195312494,-32.11904296875002],[-58.16479492187494,-32.18486328125002],[-58.119726562500006,-32.24892578125002],[-58.12304687499997,-32.321875],[-58.201171875,-32.471679687500014],[-58.219970703125,-32.563964843749986],[-58.17099609374998,-32.95927734374996],[-58.424462890624994,-33.11152343749998],[-58.54721679687498,-33.66347656249998],[-58.392480468749966,-34.192968750000034],[-58.52548828124998,-34.29619140625002],[-58.28334960937494,-34.68349609375005],[-57.54785156250003,-35.018945312499994],[-57.170654296875,-35.3625],[-57.35390624999994,-35.72031249999998],[-57.33544921875,-36.026757812499966],[-57.07617187499994,-36.296777343749994],[-56.74946289062501,-36.346484375],[-56.67202148437494,-36.85126953124998],[-57.546972656250034,-38.085644531250026],[-58.17919921874994,-38.435839843750045],[-59.82832031250001,-38.83818359375003],[-61.112207031249994,-38.99296875000003],[-61.84790039062497,-38.961816406249994],[-62.33476562499993,-38.80009765625],[-62.29506835937502,-39.24326171874996],[-62.053662109374955,-39.373828125],[-62.179345703124994,-39.38046875000002],[-62.076806640624966,-39.46152343750002],[-62.131542968749926,-39.82539062499998],[-62.28691406249996,-39.89531250000002],[-62.40185546875003,-40.19658203125002],[-62.24633789062494,-40.674609374999974],[-62.39501953124997,-40.89082031249997],[-62.95903320312493,-41.10966796875006],[-63.621777343749955,-41.15976562499996],[-64.86948242187503,-40.735839843750014],[-65.13339843749998,-40.88066406250003],[-64.98637695312496,-42.102050781249986],[-64.53774414062494,-42.25458984374998],[-64.57099609374998,-42.416015625],[-64.42041015625003,-42.43378906249998],[-64.10087890624993,-42.395117187500006],[-64.06118164062494,-42.266113281250014],[-64.228515625,-42.21826171874996],[-63.795556640624994,-42.113867187500006],[-63.6298828125,-42.28271484375003],[-63.61733398437502,-42.695800781249986],[-64.03476562499998,-42.88125],[-64.48784179687499,-42.51347656250006],[-64.97070312499997,-42.66630859375002],[-65.02690429687496,-42.75888671874996],[-64.31914062499999,-42.968945312500026],[-64.83994140624998,-43.18886718749998],[-65.25234374999997,-43.571875],[-65.26552734375,-44.2796875],[-65.64760742187502,-44.661425781250045],[-65.63876953125,-45.0078125],[-66.19013671874995,-44.96474609375002],[-66.94140625,-45.25732421875003],[-67.59956054687495,-46.05253906250003],[-67.5064453125,-46.44277343749995],[-66.77685546874994,-47.005859375],[-65.99853515625,-47.09375],[-65.73808593749999,-47.34492187499998],[-65.81430664062495,-47.63818359374996],[-66.22524414062502,-47.826757812500006],[-65.93422851562497,-47.826757812500006],[-65.81005859374997,-47.941113281250026],[-67.46630859375,-48.95175781250004],[-67.68486328125002,-49.2466796875],[-67.82597656249999,-49.91962890625005],[-68.2572265625,-50.104589843749984],[-68.66757812500003,-49.75253906250003],[-68.66162109374997,-49.93574218750005],[-68.97958984375,-50.003027343749984],[-68.59794921874996,-50.00947265624997],[-68.421875,-50.15791015625001],[-69.04477539062495,-50.49912109374998],[-69.35859374999993,-51.028125],[-69.20102539062498,-50.99365234375001],[-69.03530273437497,-51.48896484375002],[-69.46542968750003,-51.58447265625003],[-68.96533203125003,-51.67714843749999],[-68.443359375,-52.35664062500004],[-69.96025390624993,-52.00820312500002],[-71.91865234374995,-51.98955078125004],[-72.40766601562501,-51.54082031250002],[-72.34023437499997,-50.68183593749999],[-72.50981445312496,-50.607519531250034],[-73.15292968749998,-50.73828125000003],[-73.50126953124996,-50.125292968750024],[-73.55419921875,-49.463867187500014],[-73.46157226562497,-49.31386718750001],[-73.13525390625,-49.30068359374999],[-73.03364257812501,-49.014355468750004],[-72.65126953125,-48.84160156249998],[-72.582861328125,-48.47539062499999],[-72.35473632812497,-48.36582031250005],[-72.32832031250001,-48.11005859374998],[-72.517919921875,-47.87636718749998],[-72.34594726562497,-47.49267578124997],[-71.90498046875001,-47.201660156250014],[-71.94023437499999,-46.83125],[-71.69965820312501,-46.6513671875],[-71.87568359374998,-46.160546875],[-71.63154296874998,-45.95371093749998],[-71.74619140624998,-45.57890625],[-71.34931640624995,-45.33193359374995],[-71.5962890625,-44.97919921875004],[-72.04169921874998,-44.90419921875004],[-72.06372070312503,-44.771875],[-71.26113281250002,-44.763085937499966],[-71.15971679687496,-44.56025390625004],[-71.21259765624998,-44.44121093750003],[-71.82001953124993,-44.38310546875],[-71.68007812500002,-43.92958984374998],[-71.90498046875001,-43.34755859374998],[-71.750634765625,-43.237304687499986],[-72.14643554687498,-42.990039062499974],[-72.10820312499993,-42.25185546874995],[-71.75,-42.04677734375001],[-71.91127929687497,-41.650390624999986],[-71.93212890624994,-40.69169921874999],[-71.70898437499997,-40.381738281249994],[-71.81831054687493,-40.17666015624995],[-71.65976562499998,-40.02080078125],[-71.71992187499995,-39.63525390624997],[-71.53945312499997,-39.60244140624995],[-71.40156249999995,-38.93505859374996],[-70.858642578125,-38.60449218750003],[-71.16757812499998,-37.76230468749996],[-71.19218750000002,-36.84365234375004],[-71.05551757812498,-36.52373046874996],[-70.40478515625,-36.06171874999998],[-70.41572265625001,-35.52304687500002],[-70.55517578125,-35.246875],[-70.39316406250003,-35.146875],[-70.05205078124999,-34.30078124999997],[-69.85244140625,-34.224316406250026],[-69.81962890624999,-33.28378906249999],[-70.08486328125002,-33.20175781249998],[-70.02197265625,-32.88457031250002],[-70.36376953125,-32.08349609374997],[-70.25439453125,-31.957714843750026],[-70.585205078125,-31.569433593749963],[-70.51958007812493,-31.1484375],[-70.30908203124994,-31.02265625000004],[-70.15322265625,-30.360937499999963],[-69.95634765624996,-30.35820312500003],[-69.84428710937493,-30.175],[-69.95996093749997,-30.078320312500026],[-70.02680664062501,-29.324023437500017],[-69.82788085937497,-29.10322265624997],[-69.65693359374995,-28.413574218749986],[-69.17441406249998,-27.924707031250037],[-68.84633789062494,-27.153710937499994],[-68.59208984375002,-27.140039062499966],[-68.31865234374999,-26.973242187500006],[-68.59160156249999,-26.47041015624997],[-68.41450195312498,-26.153710937500023],[-68.59208984375002,-25.420019531250034],[-68.38422851562495,-25.091894531249977],[-68.56201171875,-24.74736328125003],[-68.25029296875002,-24.391992187500023],[-67.35620117187503,-24.033789062499963],[-67.00878906249994,-23.00136718750005],[-67.19487304687493,-22.821679687500037],[-66.99111328125,-22.509863281250006],[-66.71171874999999,-22.216308593749986],[-66.36518554687501,-22.113769531249957],[-66.32246093750001,-22.053125],[-66.28212890624997,-21.94746093750001],[-66.24760742187496,-21.83046875],[-66.22016601562495,-21.802539062499974],[-66.174658203125,-21.805664062499986],[-66.09858398437495,-21.83505859375002],[-66.05859375,-21.87949218750002],[-65.86015624999999,-22.019726562499983],[-65.77104492187493,-22.099609375000014],[-65.68618164062497,-22.11025390625005],[-65.51879882812497,-22.094531250000045],[-64.99262695312498,-22.109667968750017],[-64.60551757812499,-22.228808593750045],[-64.52363281250001,-22.37158203125],[-64.47773437499998,-22.485351562499986],[-64.44550781249998,-22.585351562500023],[-64.37397460937498,-22.761035156250017],[-64.32529296875,-22.82763671875],[-64.30791015624993,-22.7953125],[-64.26640625000002,-22.60332031249996],[-63.97612304687502,-22.072558593750003],[-63.92167968749993,-22.028613281250017],[-62.843359375,-21.997265625000026],[-62.62597656250003,-22.29042968749998],[-62.54155273437496,-22.349609374999957],[-62.37250976562498,-22.439160156249997],[-62.21416015624996,-22.612402343750034],[-61.798535156249955,-23.18203125],[-61.084716796875,-23.65644531250001]]]]},"properties":{"name":"Argentina","childNum":3}},{"geometry":{"type":"Polygon","coordinates":[[[46.490625,38.90668945312498],[46.1144531250001,38.877783203125034],[45.977441406249994,39.24389648437503],[45.76630859375004,39.37846679687499],[45.78447265625002,39.54560546875001],[45.456835937500074,39.494482421875006],[45.15283203125003,39.58266601562502],[45.03164062500005,39.76513671874997],[44.76826171875004,39.70351562500005],[44.28925781250004,40.040380859375006],[43.66621093750004,40.12636718750002],[43.56933593750003,40.48237304687498],[43.72265624999997,40.71953124999999],[43.43945312500003,41.10712890625001],[44.077246093750006,41.182519531249994],[44.81132812500002,41.259375],[45.001367187499994,41.29096679687498],[45.188574218750006,41.14741210937504],[45.07050781250004,41.075585937499966],[45.5875,40.846923828125],[45.37890624999997,40.67358398437506],[45.45439453125002,40.532373046874966],[45.96464843750002,40.233789062499966],[45.8859375000001,40.024853515624955],[45.57978515625004,39.9775390625],[46.202050781249994,39.59448242187503],[46.48144531249997,39.55517578125003],[46.36523437500003,39.402490234374994],[46.584765625000074,39.22368164062499],[46.400292968749994,39.1921875],[46.490625,38.90668945312498]]]},"properties":{"name":"Armenia","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-170.72626953125,-14.351171875],[-170.8205078125,-14.312109375],[-170.568115234375,-14.266796875000011],[-170.72626953125,-14.351171875]]]},"properties":{"name":"American Samoa","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[69.2824218750001,-49.05888671875002],[69.16718750000004,-48.88291015624996],[69.36875,-48.89042968749998],[69.2824218750001,-49.05888671875002]]],[[[69.18486328125002,-49.10957031250004],[69.59277343749997,-48.97099609375005],[69.64404296875003,-49.11738281250003],[69.40507812500002,-49.18173828125],[69.5423828125,-49.25566406250005],[70.32021484375005,-49.05859374999996],[70.55546875000007,-49.201464843750024],[70.38613281250005,-49.433984374999966],[70.16582031250002,-49.34296874999998],[69.75996093750004,-49.430175781249986],[69.98642578125006,-49.58164062500003],[70.2477539062501,-49.53066406250003],[70.12431640625002,-49.70439453124999],[69.153125,-49.5296875],[68.99296875000007,-49.704980468750016],[68.81474609375002,-49.69960937499999],[68.88339843750006,-49.16494140624995],[68.76953125000003,-49.06591796875003],[69.00244140624997,-48.661230468750006],[69.13613281250005,-48.86103515625003],[69.05214843750005,-49.08193359375001],[69.18486328125002,-49.10957031250004]]],[[[51.83457031250006,-46.43994140625],[51.65927734375006,-46.37363281249999],[51.7418945312501,-46.32685546874997],[51.83457031250006,-46.43994140625]]]]},"properties":{"name":"Fr. S. Antarctic Lands","childNum":3}},{"geometry":{"type":"Polygon","coordinates":[[[-61.71606445312503,17.037011718749994],[-61.85966796874996,17.013330078124966],[-61.887109374999966,17.09814453125],[-61.81728515624994,17.168945312500057],[-61.71606445312503,17.037011718749994]]]},"properties":{"name":"Antigua and Barb.","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[147.35605468750006,-43.396972656250014],[147.30888671875007,-43.50078125000002],[147.10498046875003,-43.43115234374996],[147.28388671875004,-43.278906250000034],[147.35605468750006,-43.396972656250014]]],[[[145.04296875000003,-40.78671875],[145.28300781250002,-40.76992187500002],[146.31748046875006,-41.16347656250001],[146.72343750000002,-41.07802734375001],[146.84814453124997,-41.16806640624996],[146.98984375000006,-40.99238281249997],[147.45478515625004,-41.00166015624998],[147.62167968750012,-40.844726562499986],[147.87294921875005,-40.87255859374997],[147.96875,-40.779589843750045],[148.215234375,-40.85488281250002],[148.34257812500007,-42.21533203124997],[148.21367187500002,-41.97001953125],[147.92441406250006,-42.5724609375],[147.94541015625006,-43.18183593749997],[147.7858398437501,-43.22001953125002],[147.69892578125004,-43.12255859374997],[147.64794921874997,-43.02060546874999],[147.8,-42.928125],[147.57382812500006,-42.84570312499997],[147.4523437500001,-43.03339843750001],[147.29794921875006,-42.790917968749994],[147.24501953125005,-43.21591796874999],[146.99697265625005,-43.15634765625002],[147.07734375000004,-43.27587890625003],[146.87392578125,-43.6125],[146.54853515625004,-43.50888671874999],[146.04316406250004,-43.547167968749974],[145.99443359375007,-43.37607421875002],[146.20800781249997,-43.31621093749999],[145.8732421875001,-43.29238281250002],[145.48759765625002,-42.92666015625004],[145.19882812500006,-42.23085937500004],[145.46826171874997,-42.492871093750026],[145.51660156249997,-42.3544921875],[145.33105468750003,-42.14707031250002],[145.23486328124997,-42.19697265624997],[145.23818359375,-42.01962890624999],[144.76611328125003,-41.39003906249998],[144.64609375000006,-40.980859375],[144.71855468750002,-40.67226562500002],[145.04296875000003,-40.78671875]]],[[[148.23691406250006,-40.515136718749986],[148.18779296875007,-40.592578125000045],[148.11728515625012,-40.52148437499996],[148.23691406250006,-40.515136718749986]]],[[[144.784375,-40.506738281249966],[144.74804687499997,-40.589453125000034],[144.7833984375001,-40.434863281249974],[144.784375,-40.506738281249966]]],[[[148.32626953125006,-40.30693359375003],[148.40400390625004,-40.486523437500026],[148.02011718750012,-40.40419921874995],[148.32626953125006,-40.30693359375003]]],[[[148.000390625,-39.75761718750003],[148.29736328125003,-39.985742187499966],[148.31357421875012,-40.173535156250026],[148.10566406250004,-40.26210937499995],[147.76718750000012,-39.87031249999998],[148.000390625,-39.75761718750003]]],[[[143.92792968750004,-40.116113281249966],[143.83857421875004,-39.90410156250003],[144.00078125000007,-39.580175781250034],[144.14101562500005,-39.953808593750026],[143.92792968750004,-40.116113281249966]]],[[[145.31445312500003,-38.49082031249996],[145.35507812500012,-38.55703124999995],[145.12841796875003,-38.52763671875],[145.31445312500003,-38.49082031249996]]],[[[137.59648437500007,-35.73867187499998],[137.92890625000004,-35.72607421875],[138.12343750000005,-35.85234375],[137.67089843749997,-35.897949218750014],[137.44843750000004,-36.07480468749999],[137.20957031250012,-35.982421875],[136.7550781250001,-36.03310546875002],[136.540625,-35.89013671875003],[136.63867187499997,-35.74882812500002],[137.33408203125006,-35.59248046875004],[137.58496093749997,-35.620214843750006],[137.59648437500007,-35.73867187499998]]],[[[153.53876953125004,-27.436425781250037],[153.42656250000002,-27.70644531249998],[153.43544921875,-27.40537109375002],[153.53876953125004,-27.436425781250037]]],[[[113.18300781250005,-26.053125],[112.96425781250005,-25.78310546875001],[112.94707031250002,-25.531542968750017],[113.18300781250005,-26.053125]]],[[[153.07744140625002,-25.75078125],[152.97666015625012,-25.551367187499963],[153.03808593750003,-25.193164062500003],[153.22753906249997,-25.00576171875001],[153.14375,-24.814843750000023],[153.25693359375012,-24.72890625],[153.35019531250012,-25.063085937499963],[153.07744140625002,-25.75078125]]],[[[151.14658203125006,-23.49082031250002],[151.24013671875,-23.529687500000037],[151.23828124999997,-23.77578125],[151.03330078125006,-23.530175781250037],[151.14658203125006,-23.49082031250002]]],[[[115.44619140625005,-20.78779296875001],[115.31806640625004,-20.850585937500014],[115.43457031249997,-20.66796875000003],[115.44619140625005,-20.78779296875001]]],[[[149.04375,-20.29150390624997],[148.93886718750005,-20.283691406249986],[148.98105468750012,-20.153515625000026],[149.04375,-20.29150390624997]]],[[[146.27832031249997,-18.23125],[146.29882812499997,-18.48476562500005],[146.09882812500004,-18.251757812500003],[146.27832031249997,-18.23125]]],[[[139.45917968750004,-17.11455078124996],[139.49277343750006,-16.990429687499983],[139.57089843750006,-17.09443359375004],[139.45917968750004,-17.11455078124996]]],[[[139.50781250000003,-16.57304687499996],[139.1595703125,-16.74169921875003],[139.29296875000003,-16.467285156249986],[139.58789062499997,-16.39521484374997],[139.69775390624997,-16.514941406250017],[139.50781250000003,-16.57304687499996]]],[[[137.09365234375005,-15.778125],[136.94267578125002,-15.711718749999989],[137.00957031250007,-15.594824218749977],[137.09365234375005,-15.778125]]],[[[124.59726562500006,-15.40195312500002],[124.52421875000002,-15.421484375],[124.51933593750002,-15.26748046874998],[124.59726562500006,-15.40195312500002]]],[[[125.19882812500006,-14.57949218749998],[125.0912109375,-14.59169921874998],[125.15996093750002,-14.456054687499972],[125.19882812500006,-14.57949218749998]]],[[[136.71464843750002,-13.803906249999983],[136.89082031250004,-13.786621093750014],[136.74531250000004,-14.072656250000023],[136.95078125000006,-14.184277343750026],[136.89433593750002,-14.293066406249977],[136.33544921875003,-14.211816406250037],[136.42470703125,-13.864843749999963],[136.6556640625,-13.675878906250006],[136.71464843750002,-13.803906249999983]]],[[[136.23740234375006,-13.824511718750003],[136.12265625000012,-13.816601562499983],[136.21542968750012,-13.664746093750054],[136.23740234375006,-13.824511718750003]]],[[[136.33867187500007,-11.602343749999989],[136.18027343750006,-11.676757812499957],[136.47929687500002,-11.465917968749991],[136.33867187500007,-11.602343749999989]]],[[[130.45927734375007,-11.679296875000034],[130.60625,-11.816601562500026],[130.04326171875007,-11.787304687500011],[130.19755859375007,-11.658203125],[130.15283203124997,-11.477539062499972],[130.29492187499997,-11.33681640624998],[130.45927734375007,-11.679296875000034]]],[[[130.6188476562501,-11.376074218749991],[131.02304687500006,-11.334375],[131.26826171875004,-11.18984375],[131.53857421874997,-11.436914062500037],[130.95097656250007,-11.926464843750026],[130.51191406250004,-11.617871093749955],[130.38457031250002,-11.1921875],[130.6188476562501,-11.376074218749991]]],[[[136.59853515625,-11.378906249999943],[136.52656250000004,-11.438867187499994],[136.78027343749997,-11.0125],[136.59853515625,-11.378906249999943]]],[[[132.59335937500006,-11.302832031249991],[132.48378906250005,-11.037304687499983],[132.57880859375004,-10.968847656249977],[132.59335937500006,-11.302832031249991]]],[[[143.17890625000004,-11.954492187499966],[143.11025390625,-12.303515625000017],[143.40156250000004,-12.639941406249989],[143.5866210937501,-13.443652343750031],[143.54843750000012,-13.74101562499996],[143.75634765625003,-14.348828124999969],[143.96181640625005,-14.462890625000028],[144.473046875,-14.231835937500023],[144.64804687500006,-14.492480468750017],[145.28769531250006,-14.943164062499989],[145.42607421875002,-16.406152343749966],[145.75478515625,-16.879492187500034],[145.91210937499997,-16.9125],[146.12587890625005,-17.63525390625],[146.03222656249997,-18.272851562500037],[146.3332031250001,-18.55371093749997],[146.38339843750006,-18.97705078124997],[147.13876953125006,-19.39316406250002],[147.41855468750012,-19.378125],[147.7423828125001,-19.770117187499977],[148.759375,-20.28955078125003],[148.88476562499997,-20.480859375],[148.72998046874997,-20.4677734375],[148.68369140625012,-20.58017578124999],[149.20488281250007,-21.125097656249977],[149.45410156249997,-21.57871093750002],[149.70390625000002,-22.440527343750006],[149.82246093750004,-22.389843749999983],[149.97441406250007,-22.55068359374998],[149.94189453125003,-22.30810546875003],[150.07617187500003,-22.16445312499998],[150.54130859375002,-22.55908203125],[150.56855468750004,-22.38398437500004],[150.67246093750012,-22.418164062499983],[150.84316406250005,-23.4580078125],[151.15380859375003,-23.784082031249994],[151.83164062500006,-24.12294921875001],[152.12988281250003,-24.59755859374998],[152.45634765625007,-24.802441406249983],[152.65429687499997,-25.201953125000017],[152.91347656250005,-25.432128906250014],[152.98496093750012,-25.816210937500003],[153.16494140625,-25.964160156250045],[153.11679687500006,-27.194433593750034],[153.57568359375003,-28.24052734374999],[153.6168945312501,-28.673046875],[153.03056640625002,-30.563378906249994],[152.94394531250012,-31.43486328124999],[152.5592773437501,-32.045703125],[152.4704101562501,-32.439062500000034],[152.13652343750002,-32.678125],[152.1642578125001,-32.75742187499996],[151.812890625,-32.90107421875001],[151.29208984375012,-33.580957031249966],[151.28027343750003,-33.92666015625005],[151.12480468750007,-34.00527343749998],[151.23154296875006,-34.0296875],[150.8712890625001,-34.49912109374996],[150.80458984375,-35.01289062500001],[150.19531249999997,-35.83359374999996],[149.93271484375012,-37.528515625000026],[149.480859375,-37.77119140625],[147.87675781250002,-37.93417968749998],[146.8568359375,-38.663476562499966],[146.21748046875004,-38.72744140625004],[146.33662109375004,-38.89423828125],[146.46660156250007,-38.84033203125003],[146.40000000000012,-39.14550781250003],[146.1583984375001,-38.86572265624996],[145.93535156250002,-38.90175781250002],[145.79082031250007,-38.66699218749997],[145.39726562500002,-38.53535156249998],[145.54218750000004,-38.39384765625002],[145.4757812500001,-38.24375],[145.29277343750002,-38.237597656249974],[144.95957031250012,-38.500781250000045],[144.71777343749997,-38.34033203125004],[144.91142578125007,-38.34404296874999],[145.11992187500007,-38.091308593750014],[144.89130859375004,-37.899804687499994],[144.39550781250003,-38.13691406249998],[144.6652343750001,-38.20996093750003],[143.53896484375005,-38.82089843749998],[142.45585937500002,-38.38632812499999],[141.725,-38.27138671875002],[141.5939453125001,-38.38779296875002],[141.42421875,-38.36347656250004],[141.0109375000001,-38.07695312500003],[140.39042968750007,-37.89667968749998],[139.78427734375012,-37.24580078124998],[139.85732421875,-36.662109375],[139.72900390625003,-36.37138671875002],[138.9689453125001,-35.58076171874997],[139.17802734375007,-35.52304687500002],[139.289453125,-35.61132812499997],[139.28251953125002,-35.375390624999966],[138.521875,-35.6423828125],[138.184375,-35.612695312499994],[138.5111328125,-35.02441406249996],[138.48994140625004,-34.76357421875002],[138.0892578125,-34.16982421875002],[137.69169921875002,-35.14296875000004],[136.88359375000007,-35.23974609375004],[137.01425781250012,-34.91582031250003],[137.39101562500005,-34.91328124999997],[137.49384765625004,-34.16113281250003],[137.9318359375001,-33.57910156250003],[137.85234375000007,-33.20078124999996],[137.99257812500005,-33.094238281250014],[137.78320312500003,-32.578125],[137.79091796875,-32.82324218749996],[137.44228515625,-33.1935546875],[137.23730468750003,-33.62949218749999],[136.43066406249997,-34.02998046875004],[135.891015625,-34.660937499999974],[135.96972656249997,-34.98183593749998],[135.7923828125,-34.863281249999986],[135.64755859375006,-34.93964843750001],[135.12304687499997,-34.58574218750003],[135.21679687499997,-34.48730468749996],[135.45,-34.58105468749996],[135.21894531250004,-33.959765625000045],[134.88876953125012,-33.62636718749998],[134.79101562499997,-33.32832031250001],[134.60771484375002,-33.19013671875001],[134.30126953124997,-33.16503906249996],[134.17353515625004,-32.979101562500006],[134.10039062500007,-32.748632812500034],[134.22714843750006,-32.73056640624999],[134.23417968750007,-32.54853515625004],[133.66533203125007,-32.207226562500054],[133.21210937500004,-32.18378906249998],[132.75742187500012,-31.95625],[132.21464843750002,-32.00712890624996],[131.14365234375006,-31.49570312500005],[130.78300781250002,-31.604003906249986],[129.1876953125001,-31.659960937500017],[127.31982421874997,-32.2640625],[125.91718750000004,-32.296972656250034],[124.75878906250003,-32.882714843749994],[124.24375,-33.01523437499999],[123.50683593749997,-33.916210937500054],[122.15097656250006,-33.99179687499999],[122.06113281250006,-33.874414062499966],[121.40507812500007,-33.826757812500034],[119.85410156250012,-33.97470703124998],[119.45058593750005,-34.368261718750034],[118.89531250000007,-34.47988281250004],[118.13554687500002,-34.98662109374999],[117.58193359375005,-35.09775390624998],[116.51718750000012,-34.98789062499998],[115.98671875000005,-34.795019531250034],[115.56503906250012,-34.42578125000003],[115.00878906250003,-34.25585937499997],[114.9938476562501,-33.51533203125],[115.3587890625,-33.63994140624999],[115.68300781250005,-33.19287109375003],[115.6984375000001,-31.694531250000054],[115.07792968750007,-30.560449218750023],[114.85683593750005,-29.14296875],[114.16513671875012,-28.08066406250002],[114.028125,-27.34726562499999],[113.18476562500004,-26.182226562499963],[113.32324218749997,-26.243847656249997],[113.35605468750012,-26.080468750000023],[113.58164062500006,-26.558105468749986],[113.73369140625002,-26.59511718749998],[113.83642578125003,-26.50058593749999],[113.85283203125007,-26.33212890625005],[113.39531250000002,-25.71328125],[113.4513671875001,-25.599121093750014],[113.7130859375001,-25.83076171875004],[113.72373046875006,-26.129785156250037],[113.85390625,-26.01445312499999],[113.99199218750007,-26.32148437500001],[114.09033203124997,-26.393652343749963],[114.21572265625,-26.289453124999966],[114.2142578125,-25.851562500000014],[113.41767578125004,-24.435644531250034],[113.48984375000012,-23.869628906250014],[113.7570312500001,-23.418164062500054],[113.79511718750004,-22.91455078125003],[113.68281250000004,-22.637792968749963],[114.02285156250005,-21.881445312499977],[114.12392578125005,-21.828613281249957],[114.14160156250003,-22.483105468749983],[114.37773437500007,-22.341503906249997],[114.70927734375002,-21.82343749999997],[115.45615234375012,-21.49169921874997],[116.0109375000001,-21.030371093749963],[116.7067382812501,-20.653808593749986],[117.40625,-20.72119140625003],[118.19921875000003,-20.37519531249997],[118.75146484374997,-20.261914062499983],[119.10449218749997,-19.995312500000026],[119.58593750000003,-20.03828125],[120.99794921875,-19.604394531249966],[121.33769531250002,-19.31992187500002],[121.83378906250002,-18.477050781249986],[122.34541015625004,-18.11191406250002],[122.14746093749997,-17.54902343750001],[122.2609375000001,-17.135742187500014],[122.72041015625004,-16.78769531249999],[122.97070312499997,-16.436816406250003],[123.56308593750006,-17.520898437499966],[123.59355468750007,-17.03037109375005],[123.83105468750003,-17.120800781249997],[123.8744140625,-16.918652343750026],[123.4904296875001,-16.49072265624997],[123.62597656249997,-16.416308593750003],[123.60703125000006,-16.224023437499994],[123.72890625,-16.192480468749963],[123.85917968750007,-16.38232421875],[124.04443359374997,-16.264941406249974],[124.30039062500006,-16.388281249999977],[124.77197265624997,-16.40263671874996],[124.40488281250006,-16.298925781249977],[124.41640625,-16.133496093750026],[124.5768554687501,-16.11367187499998],[124.64853515625012,-15.870214843750034],[124.50429687500005,-15.972460937499989],[124.38164062500002,-15.758203125000037],[124.43955078125012,-15.493554687500037],[124.56162109375012,-15.496289062499969],[124.69257812500004,-15.273632812499997],[125.06298828125003,-15.44228515624998],[125.0729492187501,-15.306738281249991],[124.90917968750003,-15.310058593749957],[124.83906250000004,-15.160742187500006],[125.03818359375012,-15.004101562499969],[125.35566406250004,-15.119824218750011],[125.17871093749997,-14.714746093749994],[125.57978515625004,-14.483203124999989],[125.62773437500002,-14.256640625000017],[125.70458984374997,-14.29140625],[125.66162109375003,-14.529492187500011],[125.81953125000004,-14.469140624999966],[125.890625,-14.61796875],[126.0207031250001,-14.49453125],[126.0539062500001,-13.977246093750026],[126.1842773437501,-14.00205078125002],[126.25849609375004,-14.163574218749972],[126.403125,-14.018945312499994],[126.5697265625,-14.160937499999974],[126.7806640625,-13.955175781249977],[126.77558593750004,-13.788476562500037],[126.90322265625,-13.744140624999972],[127.45761718750006,-14.031445312499969],[128.18046875000007,-14.711621093749983],[128.06943359375012,-15.329296874999969],[128.15546875000004,-15.225585937499972],[128.25468750000002,-15.298535156250011],[128.175,-15.043164062500026],[128.57578125000006,-14.774511718750006],[129.05820312500012,-14.884375],[129.21582031249997,-15.160253906249991],[129.26757812500003,-14.871484375000051],[129.63476562499997,-15.139746093749991],[129.637109375,-14.850976562500037],[129.84873046875012,-14.828906249999989],[129.60468750000004,-14.647070312499977],[129.69794921875004,-14.557421875000017],[129.37871093750002,-14.39248046874998],[129.70986328125,-13.979980468749972],[129.83886718749997,-13.572949218749997],[130.25976562500003,-13.30224609375],[130.1349609375001,-13.145507812499957],[130.1681640625001,-12.957421875],[130.39990234374997,-12.68789062499999],[130.61748046875007,-12.646875],[130.62265625000006,-12.43105468749998],[130.8673828125001,-12.557812499999955],[130.87382812500007,-12.367187500000028],[131.29160156250006,-12.067871093749972],[131.43828125000002,-12.27695312500002],[132.06406250000006,-12.28076171875],[132.25322265625007,-12.186035156249972],[132.41103515625,-12.295117187499997],[132.51054687500002,-12.134863281250034],[132.71279296875,-12.1234375],[132.63046875000012,-12.035156249999972],[132.67421875000005,-11.649023437499991],[132.47519531250006,-11.491503906249974],[132.07285156250006,-11.474707031250006],[131.82246093750004,-11.302441406249997],[131.96152343750006,-11.180859375000011],[132.15546875000004,-11.311132812499991],[132.33398437499997,-11.223535156249994],[132.6828125000001,-11.505566406249997],[132.96103515625012,-11.407324218749963],[133.18525390625004,-11.705664062499991],[133.90419921875,-11.832031249999972],[134.4173828125,-12.052734375],[134.73027343750002,-11.984375],[135.02968750000005,-12.19375],[135.2179687500001,-12.221679687499957],[135.92246093750012,-11.825781250000034],[135.70439453125007,-12.209863281250037],[136.00849609375004,-12.19140625],[136.08183593750007,-12.422460937500006],[136.26064453125,-12.433789062499997],[136.32851562500005,-12.305566406249994],[136.24990234375,-12.173046875],[136.44335937499997,-11.951464843749974],[136.7194335937501,-12.226464843749952],[136.89746093749997,-12.243554687499966],[136.94746093750004,-12.34990234374996],[136.53701171875,-12.784277343749991],[136.59433593750012,-13.003808593750051],[136.46103515625006,-13.225195312500034],[136.29414062500004,-13.137988281250031],[135.92734375000012,-13.304296874999977],[135.95449218750005,-13.934863281250017],[135.40517578125005,-14.758203124999966],[135.4533203125001,-14.923144531250003],[136.20537109375002,-15.403417968749963],[136.29140625000005,-15.570117187500003],[136.70488281250007,-15.685253906250011],[136.78466796874997,-15.89423828125004],[137.00214843750004,-15.878320312499994],[137.70371093750006,-16.233007812499963],[138.24501953125005,-16.718359374999977],[139.00986328125006,-16.899316406249994],[139.2484375,-17.328613281249957],[140.03583984375004,-17.702636718749957],[140.51113281250005,-17.62451171875003],[140.83046875,-17.414453125000037],[141.29140625,-16.46347656250002],[141.62548828124997,-15.056640625000014],[141.52294921875003,-14.470117187499994],[141.59433593750006,-14.152832031250014],[141.47255859375,-13.797558593750011],[141.64541015625,-13.259082031250003],[141.61357421875002,-12.943457031250006],[141.92978515625006,-12.73984375],[141.67773437500003,-12.491406250000011],[141.68857421875012,-12.351074218750028],[141.87050781250005,-11.9755859375],[141.96113281250004,-12.054296874999963],[142.168359375,-10.946582031249974],[142.45644531250005,-10.707324218749989],[142.60507812500012,-10.748242187499983],[142.55273437500003,-10.874414062500023],[142.7796875,-11.115332031249977],[142.87255859374997,-11.821386718750034],[143.17890625000004,-11.954492187499966]]],[[[142.2748046875,-10.704785156250011],[142.19140624999997,-10.762011718750031],[142.1310546875001,-10.640625],[142.19794921875004,-10.59199218750004],[142.2748046875,-10.704785156250011]]]]},"properties":{"name":"Australia","childNum":30}},{"geometry":{"type":"Polygon","coordinates":[[[16.953125,48.598828125],[16.86542968750001,48.3869140625],[17.147363281250023,48.00595703125],[17.06660156250001,47.707568359374996],[16.421289062500023,47.674462890624994],[16.676562500000017,47.536035156249994],[16.44287109375,47.39951171875],[16.453417968750017,47.006787109375],[16.093066406250017,46.86328125],[15.957617187500006,46.677636718749994],[14.893261718750011,46.605908203125],[14.5498046875,46.399707031249996],[13.7,46.520263671875],[13.490039062500017,46.555566406249994],[13.3515625,46.557910156249996],[13.16875,46.57265625],[12.479199218750011,46.672509765624994],[12.38828125,46.70263671875],[12.330078125,46.759814453124996],[12.267968750000023,46.835888671875],[12.154101562500017,46.93525390625],[12.130761718750023,46.98476562499999],[12.16552734375,47.028173828125],[12.201269531250006,47.060888671875],[12.197167968750023,47.075],[12.16943359375,47.08212890625],[11.775683593750017,46.986083984375],[11.527539062500011,46.997412109375],[11.433203125,46.983056640624994],[11.244433593750017,46.97568359375],[11.133886718750006,46.936181640624994],[11.0634765625,46.859130859375],[11.025097656250011,46.79697265625],[10.993261718750006,46.777001953124994],[10.92734375,46.769482421875],[10.828906250000017,46.775244140625],[10.759765625,46.793310546875],[10.689257812500017,46.84638671875],[10.579785156250011,46.8537109375],[10.479394531250023,46.855126953124994],[10.452832031250011,46.86494140625],[10.45458984375,46.8994140625],[10.414941406250023,46.964404296874996],[10.349414062500017,46.98476562499999],[10.133496093750011,46.851513671875],[9.580273437500011,47.057373046875],[9.527539062500011,47.270751953125],[9.625878906250023,47.467041015625],[9.524023437500006,47.52421875],[9.748925781250023,47.575537109375],[9.839160156250017,47.552294921874996],[9.971582031250023,47.505322265625],[10.034082031250023,47.473583984375],[10.059863281250017,47.449072265625],[10.066308593750023,47.393359375],[10.200292968750006,47.363427734374994],[10.183007812500023,47.27880859375],[10.369140625,47.366064453125],[10.40390625,47.4169921875],[10.439453125,47.5515625],[10.482812500000023,47.541796875],[10.65869140625,47.547216796875],[10.741601562500023,47.52412109375],[10.873046875,47.52021484375],[11.0419921875,47.393115234374996],[12.185644531250006,47.61953125],[12.203808593750011,47.646728515625],[12.196875,47.70908203125],[12.209277343750017,47.71826171875],[12.268359375000017,47.702734375],[12.363183593750023,47.68818359375],[12.48291015625,47.6373046875],[12.685839843750017,47.669335937499994],[12.771386718750023,47.639404296875],[12.796191406250017,47.60703125],[12.781152343750023,47.5904296875],[12.7828125,47.56416015625],[12.809375,47.5421875],[12.87890625,47.5064453125],[12.968066406250017,47.47568359375],[13.014355468750011,47.478076171874996],[13.031542968750017,47.5080078125],[13.047949218750006,47.579150390624996],[13.054101562500023,47.655126953125],[12.897656250000011,47.721875],[12.953515625000023,47.890625],[12.760351562500006,48.106982421874996],[13.215234375000023,48.301904296874994],[13.322851562500006,48.33125],[13.409375,48.394140625],[13.459863281250023,48.56455078125],[13.4716796875,48.571826171874996],[13.486621093750017,48.581835937499996],[13.675195312500023,48.523046875],[13.785351562500011,48.587451171874996],[13.798828125,48.6216796875],[13.802929687500011,48.747509765625],[13.814746093750017,48.766943359375],[14.049121093750017,48.602490234375],[14.691308593750023,48.59921875],[15.066796875000023,48.997851562499996],[16.057226562500006,48.754785156249994],[16.543554687500006,48.796240234375],[16.953125,48.598828125]]]},"properties":{"name":"Austria","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[46.1144531250001,38.877783203125034],[45.4796875000001,39.00625],[44.81718750000002,39.65043945312496],[44.76826171875004,39.70351562500005],[45.03164062500005,39.76513671874997],[45.15283203125003,39.58266601562502],[45.456835937500074,39.494482421875006],[45.78447265625002,39.54560546875001],[45.76630859375004,39.37846679687499],[45.977441406249994,39.24389648437503],[46.1144531250001,38.877783203125034]]],[[[48.572851562500006,41.84448242187503],[49.45673828125004,40.79985351562502],[49.77597656250006,40.583984375],[50.18251953125005,40.50478515625002],[50.3659179687501,40.279492187499955],[49.91884765625005,40.31640625000003],[49.55117187499999,40.19414062499999],[49.3244140625001,39.60834960937501],[49.36279296875003,39.349560546874955],[49.16533203125002,39.03027343750003],[49.013476562500074,39.13398437500001],[48.85449218750003,38.83881835937501],[48.86875,38.43549804687498],[48.59267578125005,38.41108398437498],[47.99648437499999,38.85375976562503],[48.292089843750006,39.01884765624999],[48.10439453125005,39.241113281249994],[48.322167968749994,39.39907226562502],[47.995898437500074,39.683935546875034],[46.490625,38.90668945312498],[46.400292968749994,39.1921875],[46.584765625000074,39.22368164062499],[46.36523437500003,39.402490234374994],[46.48144531249997,39.55517578125003],[46.202050781249994,39.59448242187503],[45.57978515625004,39.9775390625],[45.8859375000001,40.024853515624955],[45.96464843750002,40.233789062499966],[45.45439453125002,40.532373046874966],[45.37890624999997,40.67358398437506],[45.5875,40.846923828125],[45.07050781250004,41.075585937499966],[45.188574218750006,41.14741210937504],[45.001367187499994,41.29096679687498],[45.2171875,41.423193359375006],[45.28095703125004,41.449560546875034],[46.086523437500006,41.183837890625],[46.43095703125002,41.077050781249994],[46.534375,41.08857421875004],[46.62636718750005,41.15966796875006],[46.66240234375002,41.24550781250002],[46.67255859375004,41.28681640625001],[46.61894531250002,41.34375],[46.30546875000002,41.507714843749994],[46.18427734375004,41.70214843749997],[46.42988281250004,41.890966796875006],[46.74931640625002,41.812597656250006],[47.31767578125002,41.28242187500001],[47.79101562499997,41.19926757812502],[48.572851562500006,41.84448242187503]]]]},"properties":{"name":"Azerbaijan","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[30.553613281250023,-2.400097656250011],[30.53369140625,-2.42626953125],[30.441992187500006,-2.613476562500011],[30.424218750000023,-2.6416015625],[30.47333984375001,-2.6943359375],[30.42402343750001,-2.824023437500003],[30.433496093750023,-2.87451171875],[30.515039062500023,-2.917578125],[30.604296875000017,-2.935253906250011],[30.70947265625,-2.977246093750011],[30.7802734375,-2.98486328125],[30.811132812500006,-3.116406250000011],[30.79023437500001,-3.274609375000011],[30.4,-3.65390625],[29.947265625,-4.307324218750011],[29.7177734375,-4.455859375],[29.403222656250023,-4.449316406250006],[29.211816406250023,-3.833789062500003],[29.224414062500017,-3.053515625],[29.01435546875001,-2.72021484375],[29.10205078125,-2.595703125],[29.390234375,-2.80859375],[29.698046875000017,-2.794726562500003],[29.8681640625,-2.71640625],[29.93017578125,-2.339550781250011],[30.117285156250006,-2.416601562500006],[30.408496093750017,-2.31298828125],[30.553613281250023,-2.400097656250011]]]},"properties":{"name":"Burundi","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[5.693554687500011,50.774755859375006],[5.993945312500017,50.75043945312504],[6.340917968750006,50.451757812500034],[6.116503906250045,50.120996093749966],[6.08906250000004,50.15458984374996],[6.054785156249977,50.154296875],[5.976269531250068,50.167187499999955],[5.866894531250068,50.08281250000002],[5.817382812500028,50.01269531250003],[5.7880859375,49.96123046875002],[5.744042968749994,49.91962890624998],[5.789746093749983,49.53828125000001],[5.50732421875,49.51088867187502],[4.867578125000051,49.78813476562502],[4.818652343750045,50.153173828125034],[4.545019531250063,49.96025390624999],[4.149316406250023,49.971582031249994],[4.174609375000017,50.24648437500005],[3.689355468750023,50.30605468750002],[3.595410156250068,50.47734374999999],[3.27333984375008,50.53154296875002],[3.10683593750008,50.779443359374994],[2.759375,50.750634765624994],[2.52490234375,51.097119140624955],[3.35009765625,51.37768554687503],[3.43251953125008,51.24575195312505],[3.902050781250011,51.20766601562502],[4.226171875000034,51.38647460937503],[5.03095703125004,51.46909179687498],[5.214160156250045,51.278955078124966],[5.796484375000034,51.153076171875],[5.693554687500011,50.774755859375006]]]},"properties":{"name":"Belgium","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[3.595410156250011,11.6962890625],[3.553906250000011,11.631884765624989],[3.490527343750017,11.49921875],[3.48779296875,11.395410156249994],[3.638867187500011,11.176855468749991],[3.65625,11.154589843749989],[3.6953125,11.1203125],[3.71640625,11.07958984375],[3.7568359375,10.76875],[3.83447265625,10.607421875],[3.771777343750017,10.417626953124994],[3.646582031250006,10.408984374999989],[3.60205078125,10.004541015624994],[3.3251953125,9.778466796874994],[3.044921875,9.083837890624991],[2.774804687500023,9.048535156249997],[2.703125,8.371826171875],[2.68603515625,7.873730468749997],[2.719335937500006,7.616259765624989],[2.7509765625,7.541894531249994],[2.78515625,7.476855468749989],[2.783984375000017,7.443408203124989],[2.765820312500011,7.422509765624994],[2.75048828125,7.395068359374989],[2.756738281250023,7.067919921874989],[2.721386718750011,6.980273437499989],[2.731738281250017,6.852832031249989],[2.7529296875,6.771630859374994],[2.774609375000011,6.711718749999989],[2.753710937500017,6.661767578124994],[2.735644531250017,6.595703125],[2.706445312500023,6.369238281249991],[1.62265625,6.216796875],[1.777929687500006,6.294628906249997],[1.530957031250011,6.992431640625],[1.624707031250011,6.997314453125],[1.600195312500006,9.050048828125],[1.3857421875,9.361669921874991],[1.330078125,9.996972656249994],[0.763378906250011,10.386669921874997],[0.900488281250006,10.993261718749991],[1.4267578125,11.447119140624991],[1.980371093750023,11.418408203124997],[2.38916015625,11.897070312499991],[2.366015625000017,12.221923828125],[2.805273437500006,12.383837890624989],[3.595410156250011,11.6962890625]]]},"properties":{"name":"Benin","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[0.217480468750011,14.911474609374991],[0.163867187500017,14.497216796874994],[0.382519531250011,14.245800781249997],[0.42919921875,13.972119140624997],[0.6181640625,13.703417968750003],[1.201171875,13.357519531249991],[0.988476562500011,13.36484375],[0.9873046875,13.041894531249994],[1.56494140625,12.635400390624994],[2.104589843750006,12.701269531249991],[2.226269531250011,12.466064453125],[2.072949218750011,12.309375],[2.38916015625,11.897070312499991],[1.980371093750023,11.418408203124997],[1.4267578125,11.447119140624991],[0.900488281250006,10.993261718749991],[0.49267578125,10.954980468749994],[-0.068603515625,11.115625],[-0.299462890624994,11.166894531249994],[-0.627148437499983,10.927392578124994],[-1.04248046875,11.010058593749989],[-2.829931640624977,10.998388671874991],[-2.914892578124977,10.592333984374989],[-2.791162109374994,10.432421874999989],[-2.780517578125,9.745849609375],[-2.765966796874977,9.658056640624991],[-2.706201171874994,9.533935546875],[-2.695849609374989,9.481347656249994],[-2.7171875,9.457128906249991],[-2.7666015625,9.424707031249994],[-2.816748046874977,9.425830078124989],[-2.875146484374994,9.500927734374997],[-2.90087890625,9.534619140624997],[-2.948144531249994,9.610742187499994],[-2.98828125,9.687353515624991],[-3.042626953124994,9.720898437499997],[-3.095800781249977,9.752099609374994],[-3.160693359374989,9.849169921874989],[-3.223535156249994,9.895458984374997],[-3.289697265624994,9.882226562499994],[-3.581152343749977,9.92431640625],[-3.790625,9.9171875],[-4.18115234375,9.78173828125],[-4.267187499999977,9.743261718749991],[-4.332226562499983,9.645703125],[-4.406201171874983,9.647998046874989],[-4.526611328125,9.723486328124991],[-4.625830078124977,9.713574218749997],[-4.721777343749977,9.756542968749997],[-5.262304687499977,10.319677734374991],[-5.523535156249977,10.426025390625],[-5.490478515625,11.042382812499994],[-5.250244140625,11.375781249999989],[-5.288134765624989,11.827929687499989],[-4.699316406249977,12.076171875],[-4.4287109375,12.337597656249997],[-4.480615234374994,12.672216796874991],[-4.227099609374989,12.793701171875],[-4.328710937499977,13.119042968749994],[-4.151025390624994,13.306201171875003],[-3.947314453124989,13.402197265624991],[-3.527636718749989,13.182714843749991],[-3.3017578125,13.28076171875],[-3.248632812499977,13.658349609374994],[-2.950830078124994,13.6484375],[-2.873925781249994,13.950732421875003],[-2.586718749999989,14.227587890625003],[-2.113232421874983,14.16845703125],[-1.97304687499999,14.45654296875],[-1.049560546875,14.81953125],[-0.760449218749983,15.047753906249994],[-0.235888671874989,15.059423828124991],[0.217480468750011,14.911474609374991]]]},"properties":{"name":"Burkina Faso","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[91.94921875000003,21.50805664062503],[91.85947265625012,21.532958984375057],[91.90771484374997,21.722949218750017],[91.94921875000003,21.50805664062503]]],[[[91.87382812500002,21.832128906249977],[91.8375976562501,21.750244140625],[91.85068359375012,21.927050781250045],[91.87382812500002,21.832128906249977]]],[[[91.15078125000005,22.175195312499966],[91.04472656250002,22.10517578125001],[91.0794921875,22.519726562499983],[91.15078125000005,22.175195312499966]]],[[[91.55673828125006,22.38222656250005],[91.41132812500004,22.475683593750006],[91.45605468749997,22.61650390624999],[91.55673828125006,22.38222656250005]]],[[[90.77763671875007,22.089306640624983],[90.51503906250005,22.06513671875001],[90.68046875000007,22.327490234375006],[90.50292968749997,22.835351562499994],[90.59648437500002,22.863525390625057],[90.86816406250003,22.48486328125],[90.77763671875007,22.089306640624983]]],[[[88.94072265625002,26.24536132812497],[88.97041015625004,26.250878906250023],[88.95195312500002,26.412109375],[89.01865234375012,26.410253906249977],[89.28925781250004,26.03759765625],[89.54990234375006,26.005273437499994],[89.57275390625003,26.13232421875003],[89.67089843750003,26.21381835937504],[89.8229492187501,25.94140625000003],[89.82490234375004,25.56015625],[89.80087890625012,25.33613281250001],[89.81406250000006,25.305371093749955],[89.86630859375012,25.293164062499955],[90.11962890625003,25.21997070312497],[90.61308593750002,25.16772460937497],[92.04970703125005,25.16948242187499],[92.46835937500006,24.94414062499999],[92.38496093750004,24.848779296875023],[92.25126953125007,24.895068359375045],[92.22832031250002,24.88134765625],[92.22666015625012,24.77099609374997],[92.11748046875002,24.493945312500017],[92.06416015625004,24.374365234375006],[91.84619140624997,24.17529296875003],[91.72656250000003,24.20507812499997],[91.35019531250012,24.06049804687501],[91.16044921875007,23.66064453125],[91.359375,23.06835937500003],[91.43623046875004,23.19990234375001],[91.55351562500002,22.991552734375006],[91.61953125,22.97968750000001],[91.75097656250003,23.053515625000017],[91.75419921875007,23.287304687499955],[91.79003906249997,23.361035156249983],[91.937890625,23.504687500000017],[91.92949218750007,23.598242187499977],[91.92958984375,23.68598632812501],[91.97851562500003,23.691992187499977],[92.04404296875006,23.677783203125017],[92.24609375000003,23.683593750000057],[92.33378906250002,23.242382812499955],[92.36162109375002,22.929003906250074],[92.46445312500006,22.734423828125045],[92.49140625000004,22.685400390625006],[92.5612304687501,22.04804687500001],[92.57490234375004,21.978076171875045],[92.58281250000002,21.940332031249994],[92.5934570312501,21.46733398437499],[92.63164062500002,21.306201171875045],[92.33056640624997,21.439794921874977],[92.17958984375005,21.293115234375023],[92.32412109375,20.791845703125063],[92.0560546875,21.1748046875],[91.86337890625012,22.350488281249966],[91.7970703125001,22.297460937500006],[91.48007812500006,22.884814453125045],[91.2162109375,22.642236328124994],[90.94560546875002,22.597021484375034],[90.65625,23.025488281250006],[90.60400390624997,23.59135742187499],[90.55566406249997,23.42153320312505],[90.26914062500012,23.455859375000017],[90.59091796875012,23.266406250000045],[90.43505859374997,22.751904296874955],[90.61611328125,22.362158203125034],[90.23056640625006,21.82978515625004],[90.07119140625005,21.887255859375017],[90.20957031250006,22.156591796875006],[89.95419921875006,22.022851562500023],[89.91806640625012,22.11616210937501],[89.98515625000002,22.466406250000063],[89.81191406250005,21.983496093750006],[89.56855468750004,21.767431640625034],[89.48320312500007,22.275537109374994],[89.50058593750006,21.914355468750045],[89.35371093750004,21.72109375],[89.09394531250004,21.872753906249983],[89.05,22.274609374999983],[88.92070312500002,22.632031249999955],[88.89970703125002,22.843505859375057],[88.85058593749997,23.040527343750057],[88.928125,23.186621093750063],[88.72441406250002,23.254980468750034],[88.69765625,23.493017578125034],[88.63574218749997,23.55],[88.56738281249997,23.674414062500034],[88.69980468750006,24.002539062500006],[88.71376953125,24.069628906250017],[88.72656250000003,24.186230468749955],[88.7335937500001,24.23090820312501],[88.72353515625,24.27490234375],[88.64228515625004,24.325976562500017],[88.49853515625003,24.34663085937504],[88.3375,24.45385742187503],[88.225,24.460644531249983],[88.14550781250003,24.485791015624955],[88.07910156249997,24.549902343750063],[88.02343750000003,24.62783203125005],[88.03027343749997,24.66445312500005],[88.0451171875001,24.713037109374994],[88.1498046875,24.914648437500034],[88.1888671875,24.92060546875001],[88.27949218750004,24.881933593750034],[88.31337890625005,24.8818359375],[88.37294921875,24.961523437499977],[88.45625,25.18842773437504],[88.57382812500006,25.18789062499999],[88.92978515625012,25.222998046875063],[88.94414062500002,25.290771484375],[88.85478515625002,25.333544921875017],[88.76914062500006,25.490478515625],[88.50244140624997,25.537011718749994],[88.14746093749997,25.811425781250023],[88.1066406250001,25.841113281250045],[88.15078125000005,26.08715820312497],[88.33398437499997,26.257519531249955],[88.44042968749997,26.369482421875034],[88.38623046875003,26.471533203125034],[88.35146484375005,26.482568359374966],[88.36992187500002,26.564111328124994],[88.51826171875004,26.517773437499955],[88.68281250000004,26.291699218749983],[88.94072265625002,26.24536132812497]]]]},"properties":{"name":"Bangladesh","childNum":6}},{"geometry":{"type":"Polygon","coordinates":[[[28.585351562500023,43.742236328124996],[28.465429687500006,43.389306640624994],[28.133691406250023,43.39560546875],[27.92890625000001,43.1861328125],[27.88886718750001,42.74970703125],[27.484765625000023,42.468066406249996],[28.014453125000017,41.969042968749996],[27.47480468750001,41.946875],[27.294921875,42.079541015625],[27.24433593750001,42.09326171875],[27.01171875,42.058642578124996],[26.96875,42.02685546875],[26.884863281250006,41.991845703124994],[26.615332031250006,41.964892578124996],[26.549707031250023,41.896728515625],[26.51142578125001,41.8263671875],[26.3603515625,41.8015625],[26.327246093750006,41.772802734375],[26.31796875,41.744677734374996],[26.320898437500006,41.716552734375],[26.200585937500023,41.743798828124994],[26.107421875,41.72568359375],[26.085546875,41.704150390624996],[26.066015625,41.673242187499994],[26.1435546875,41.521533203124996],[26.155175781250023,41.434863281249996],[26.135351562500006,41.3857421875],[26.06640625,41.35068359375],[25.92333984375,41.311914062499994],[25.784960937500017,41.330419921875],[25.52705078125001,41.2998046875],[25.381933593750006,41.26435546875],[25.25117187500001,41.243554687499994],[24.773730468750017,41.356103515624994],[24.595996093750017,41.442724609375],[24.5693359375,41.4673828125],[24.51826171875001,41.552539062499996],[24.487890625,41.555224609374996],[24.056054687500023,41.527246093749994],[24.03291015625001,41.469091796875],[24.011328125,41.46005859375],[23.635156250000023,41.386767578124996],[23.53583984375001,41.386035156249996],[23.433398437500017,41.398730468749996],[23.3720703125,41.3896484375],[23.23984375,41.3849609375],[23.15595703125001,41.322070312499996],[22.916015625,41.336279296875],[23.00361328125001,41.73984375],[22.836816406250023,41.993603515625],[22.344042968750017,42.31396484375],[22.42207031250001,42.328857421875],[22.445703125000023,42.359130859375],[22.523535156250006,42.440966796874996],[22.53242187500001,42.481201171875],[22.524218750000017,42.50390625],[22.43623046875001,42.6291015625],[22.466796875,42.84248046875],[22.799902343750006,42.985742187499994],[22.976855468750017,43.18798828125],[22.85957031250001,43.25234375],[22.819726562500023,43.300732421875],[22.767578125,43.354150390624994],[22.554589843750023,43.454492187499994],[22.36962890625,43.781298828124996],[22.36542968750001,43.862109375],[22.399023437500006,43.96953125],[22.420800781250023,44.007421875],[22.469042968750017,44.018017578125],[22.597460937500017,44.07529296875],[22.705078125,44.23779296875],[23.02851562500001,44.077978515625],[22.868261718750006,43.947900390624994],[22.919042968750006,43.83447265625],[25.4970703125,43.670800781249994],[26.2158203125,44.007275390625],[27.0869140625,44.167382812499994],[27.425390625,44.0205078125],[27.88427734375,43.987353515624996],[28.221972656250017,43.772851562499994],[28.585351562500023,43.742236328124996]]]},"properties":{"name":"Bulgaria","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[50.60722656250002,25.883105468750003],[50.57490234375001,25.806787109374994],[50.465917968750006,25.965527343749997],[50.46992187500001,26.228955078124997],[50.5859375,26.24072265625],[50.60722656250002,25.883105468750003]]]},"properties":{"name":"Bahrain","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-73.02685546874994,21.19238281250003],[-73.16455078125003,20.979150390625023],[-73.68115234375003,20.9755859375],[-73.68037109374995,21.103320312500017],[-73.52309570312497,21.190820312499966],[-73.23535156249997,21.15449218750004],[-73.05849609375,21.313378906249994],[-73.02685546874994,21.19238281250003]]],[[[-73.041015625,22.429052734375006],[-72.74726562500001,22.32739257812497],[-73.16191406250002,22.380712890625006],[-73.041015625,22.429052734375006]]],[[[-74.20673828124998,22.213769531250023],[-74.27690429687499,22.183691406250006],[-73.906396484375,22.527441406250063],[-73.95419921874995,22.71552734375001],[-73.84995117187503,22.731054687500063],[-73.83652343749998,22.538427734374977],[-74.20673828124998,22.213769531250023]]],[[[-74.05751953124997,22.723486328125034],[-74.27460937499995,22.71166992187503],[-74.30703125,22.83959960937497],[-74.05751953124997,22.723486328125034]]],[[[-74.84047851562494,22.894335937500017],[-75.22333984374995,23.165332031250074],[-75.13056640624998,23.267919921875006],[-75.31596679687502,23.668359374999966],[-74.84047851562494,22.894335937500017]]],[[[-75.66455078124997,23.45014648437501],[-76.03710937500003,23.60278320312503],[-76.01044921875001,23.671386718750057],[-75.66455078124997,23.45014648437501]]],[[[-74.42944335937497,24.068066406249955],[-74.55092773437502,23.96894531250001],[-74.52690429687502,24.105078125000034],[-74.42944335937497,24.068066406249955]]],[[[-77.65771484374994,24.249462890624955],[-77.75527343750002,24.163476562500023],[-77.61538085937494,24.216357421875045],[-77.5615234375,24.136816406250006],[-77.57373046875,23.739160156249994],[-77.77128906249999,23.752539062499977],[-77.99990234374994,24.219824218750063],[-77.65771484374994,24.249462890624955]]],[[[-75.30839843749999,24.2],[-75.50322265624996,24.139062500000023],[-75.40893554687503,24.265771484374994],[-75.72666015625,24.68935546875005],[-75.30839843749999,24.2]]],[[[-77.34755859375,25.013867187499983],[-77.56191406249997,25.030029296875],[-77.27558593750001,25.055761718750006],[-77.34755859375,25.013867187499983]]],[[[-77.74384765625001,24.70742187499999],[-77.74521484375,24.463476562500034],[-78.04492187499997,24.287451171875063],[-78.14580078125002,24.493457031250017],[-78.36650390624993,24.544189453125057],[-78.435302734375,24.627587890624994],[-78.24272460937493,24.65380859375],[-78.21137695312495,25.191259765624977],[-77.97529296874998,25.084814453125063],[-77.74384765625001,24.70742187499999]]],[[[-76.64882812499994,25.487402343750006],[-76.34379882812496,25.33203124999997],[-76.12661132812497,25.14052734375005],[-76.16953125,24.6494140625],[-76.319970703125,24.81767578124999],[-76.21376953124994,24.822460937499983],[-76.160400390625,25.119335937499983],[-76.36928710937502,25.312597656250006],[-76.62070312499998,25.43164062500003],[-76.78066406249997,25.426855468750006],[-76.71083984374997,25.564892578124983],[-76.64882812499994,25.487402343750006]]],[[[-78.49287109375001,26.729052734375017],[-77.92246093749998,26.69111328125001],[-78.74365234374994,26.50068359375004],[-78.98564453124996,26.689501953125045],[-78.79804687500001,26.58242187499999],[-78.59711914062493,26.797949218750006],[-78.49287109375001,26.729052734375017]]],[[[-77.22563476562496,25.904199218750023],[-77.40317382812498,26.02470703124996],[-77.24677734374998,26.156347656250034],[-77.238623046875,26.561132812500006],[-77.510595703125,26.845996093750045],[-77.94375,26.90356445312503],[-77.53388671874995,26.903417968750006],[-77.06635742187501,26.530175781249994],[-77.03828124999998,26.333447265624983],[-77.16728515624996,26.240332031250006],[-77.22563476562496,25.904199218750023]]]]},"properties":{"name":"Bahamas","childNum":14}},{"geometry":{"type":"Polygon","coordinates":[[[19.007128906250045,44.86918945312502],[19.348632812500057,44.88090820312502],[19.118457031250074,44.359960937500006],[19.583789062500017,44.04345703125003],[19.245019531249994,43.96503906250004],[19.495117187500057,43.642871093750045],[19.19433593749997,43.533300781250006],[19.164355468750017,43.53544921874999],[19.11279296874997,43.52773437500002],[19.080078125000057,43.51772460937502],[19.0283203125,43.53251953125002],[18.97421875,43.54233398437498],[18.95068359375,43.52666015624999],[19.036718750000034,43.35732421875002],[19.026660156250017,43.292431640624955],[18.97871093750001,43.28540039062503],[18.934667968750006,43.339453125000034],[18.85107421875003,43.34633789062502],[18.749218750000068,43.283544921875006],[18.67421875000008,43.230810546875006],[18.623632812500063,43.027685546875034],[18.488476562500068,43.01215820312498],[18.44384765625003,42.96845703125004],[18.46601562500001,42.777246093749994],[18.54589843750003,42.64160156249997],[18.436328125000017,42.559716796874994],[17.667578125000063,42.897119140624994],[17.585156250000068,42.93837890625005],[17.650488281250063,43.006591796875],[17.27382812500005,43.44575195312501],[16.300097656250017,44.12451171875],[16.10341796875008,44.52099609375006],[15.736621093750045,44.76582031250001],[15.788085937500057,45.17895507812497],[16.028320312500057,45.18959960937502],[16.29335937500005,45.00883789062496],[16.53066406250008,45.21669921875002],[16.918652343749983,45.27656249999998],[17.812792968750074,45.078125],[18.66259765625,45.07744140624999],[18.83642578125,44.883251953124955],[19.007128906250045,44.86918945312502]]]},"properties":{"name":"Bosnia and Herz.","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[28.14794921875,56.142919921875],[28.284277343750006,56.055908203125],[29.375,55.938720703125],[29.353417968750023,55.784375],[29.412988281250023,55.724853515625],[29.482226562500017,55.6845703125],[29.63007812500001,55.751171875],[29.6845703125,55.7697265625],[29.744140625,55.77041015625],[29.82392578125001,55.7951171875],[29.881640625000017,55.832324218749996],[29.93701171875,55.845263671874996],[30.04267578125001,55.83642578125],[30.23359375000001,55.84521484375],[30.625585937500006,55.666259765625],[30.906835937500006,55.57001953125],[30.90058593750001,55.397412109375],[30.82099609375001,55.3302734375],[30.810546875,55.306982421875],[30.814453125,55.2787109375],[30.87744140625,55.2234375],[30.958886718750023,55.13759765625],[30.97773437500001,55.08779296875],[30.97773437500001,55.05048828125],[30.829882812500017,54.914990234375],[30.804492187500017,54.8609375],[30.791015625,54.806005859375],[30.798828125,54.783251953124996],[30.984179687500017,54.6958984375],[31.12128906250001,54.648486328124996],[31.152148437500017,54.625341796875],[31.074804687500006,54.491796875],[31.18476562500001,54.452978515625],[31.299121093750017,54.29169921875],[31.403613281250017,54.195947265625],[31.62841796875,54.111181640625],[31.7919921875,54.055908203125],[31.825976562500017,54.030712890625],[31.837792968750023,54.00078125],[31.825292968750006,53.935009765625],[31.783007812500017,53.85498046875],[31.754199218750017,53.81044921875],[31.82080078125,53.791943359375],[31.9921875,53.796875],[32.20039062500001,53.78125],[32.45097656250002,53.6533203125],[32.70429687500001,53.336328125],[32.64443359375002,53.32890625],[32.57802734375002,53.31240234375],[32.469335937500006,53.2703125],[32.14199218750002,53.091162109375],[31.849707031250006,53.106201171875],[31.668261718750017,53.200927734375],[31.417871093750023,53.196044921875],[31.38837890625001,53.184814453125],[31.364550781250017,53.138964843749996],[31.30292968750001,53.060888671875],[31.2587890625,53.01669921875],[31.29511718750001,52.989794921874996],[31.35302734375,52.933447265625],[31.442773437500023,52.86181640625],[31.53515625,52.7982421875],[31.564843750000023,52.759228515625],[31.585546875,52.532470703125],[31.57734375000001,52.312304687499996],[31.6015625,52.284814453125],[31.64990234375,52.26220703125],[31.690625,52.220654296875],[31.758593750000017,52.125830078125],[31.76337890625001,52.10107421875],[31.57373046875,52.10810546875],[31.345996093750017,52.10537109375],[31.21796875000001,52.050244140625],[30.98066406250001,52.046191406249996],[30.845703125,51.953076171875],[30.755273437500023,51.895166015625],[30.667285156250017,51.814111328125],[30.583886718750023,51.68896484375],[30.533007812500017,51.596337890624994],[30.56074218750001,51.531494140625],[30.602343750000017,51.471240234374996],[30.611718750000023,51.40634765625],[30.63251953125001,51.355419921875],[30.449511718750017,51.274316406249994],[30.160742187500006,51.477880859375],[29.346484375000017,51.382568359375],[29.10205078125,51.6275390625],[29.06074218750001,51.625439453125],[29.013085937500023,51.598925781249996],[28.97773437500001,51.57177734375],[28.927539062500017,51.562158203124994],[28.849511718750023,51.540185546874994],[28.73125,51.433398437499996],[28.690234375000017,51.438867187499994],[28.647753906250017,51.45654296875],[28.599023437500023,51.542626953124994],[28.532031250000017,51.562451171875],[27.85859375000001,51.5923828125],[27.7,51.477978515625],[27.689746093750017,51.572412109374994],[27.296289062500023,51.597412109375],[27.270117187500006,51.613574218749996],[27.141992187500023,51.75205078125],[27.074121093750023,51.76083984375],[26.95283203125001,51.75400390625],[26.7734375,51.770703125],[25.785742187500006,51.923828125],[24.361914062500006,51.867529296875],[24.280078125000017,51.774707031249996],[24.126855468750023,51.6646484375],[23.978320312500017,51.59130859375],[23.951171875,51.58505859375],[23.8642578125,51.623974609375],[23.79169921875001,51.637109375],[23.706835937500017,51.64130859375],[23.61376953125,51.525390625],[23.605273437500017,51.517919921875],[23.652441406250006,52.040380859375],[23.175097656250017,52.28662109375],[23.915429687500023,52.770263671875],[23.484667968750017,53.939794921875],[23.55908203125,53.91982421875],[23.733691406250017,53.912255859375],[24.191308593750023,53.950439453125],[24.236621093750017,53.919970703124996],[24.31796875,53.89296875],[24.620703125,53.979833984375],[24.768164062500006,53.974658203124996],[24.78925781250001,53.9982421875],[24.82568359375,54.118994140625],[24.869531250000023,54.145166015625],[25.04609375000001,54.133056640625],[25.111425781250006,54.154931640625],[25.179492187500017,54.2142578125],[25.46113281250001,54.292773437499996],[25.505664062500017,54.264941406249996],[25.52734375,54.215136718749996],[25.497363281250017,54.175244140625],[25.573046875000017,54.139892578125],[25.765234375,54.17978515625],[25.702539062500023,54.29296875],[25.61689453125001,54.310107421874996],[25.557519531250023,54.310693359375],[25.54736328125,54.331835937499996],[25.56757812500001,54.37705078125],[25.62031250000001,54.460400390625],[25.68515625,54.535791015625],[25.72480468750001,54.564257812499996],[25.73164062500001,54.590380859374996],[25.722460937500017,54.71787109375],[25.859277343750023,54.919287109375],[25.964453125,54.94716796875],[26.09296875000001,54.9623046875],[26.175195312500023,55.003271484375],[26.250781250000017,55.12451171875],[26.291796875000017,55.139599609375],[26.601171875,55.130175781249996],[26.6484375,55.20419921875],[26.775683593750017,55.273095703125],[26.760156250000023,55.293359375],[26.68125,55.306445312499996],[26.49531250000001,55.318017578125],[26.457617187500006,55.34248046875],[26.469531250000017,55.371923828125],[26.51923828125001,55.44814453125],[26.56660156250001,55.546484375],[26.5908203125,55.62265625],[26.593554687500017,55.667529296874996],[27.052539062500017,55.83056640625],[27.576757812500006,55.798779296875],[28.14794921875,56.142919921875]]]},"properties":{"name":"Belarus","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-87.8529296875,17.4228515625],[-87.92998046874996,17.283007812500017],[-87.826416015625,17.546289062499994],[-87.8529296875,17.4228515625]]],[[[-88.89404296875,15.890625],[-89.2328125,15.888671875],[-89.16147460937503,17.81484375],[-89.13354492187503,17.970800781249977],[-88.80634765624998,17.965527343749983],[-88.52299804687499,18.445898437500063],[-88.29565429687494,18.47241210937503],[-88.34926757812494,18.358837890624983],[-88.1302734375,18.350732421875023],[-88.08525390624999,18.226123046875045],[-88.27172851562494,17.60986328125],[-88.203466796875,17.5166015625],[-88.31342773437501,16.632763671874983],[-88.89404296875,15.890625]]]]},"properties":{"name":"Belize","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[-64.73027343749999,32.29345703125],[-64.86284179687499,32.273876953125],[-64.66831054687499,32.38193359375],[-64.73027343749999,32.29345703125]]]},"properties":{"name":"Bermuda","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-58.15976562499999,-20.164648437500006],[-58.18017578125,-19.81787109375],[-59.09052734375,-19.286230468750006],[-60.00737304687499,-19.29755859375001],[-61.7568359375,-19.6453125],[-62.276318359375,-20.5625],[-62.27666015624999,-21.066015625],[-62.65097656249999,-22.233691406250003],[-62.84335937499999,-21.99726562500001],[-63.92167968749999,-22.028613281250003],[-63.97612304687499,-22.072558593750003],[-64.26640624999999,-22.603320312500003],[-64.30791015624999,-22.7953125],[-64.32529296874999,-22.82763671875],[-64.373974609375,-22.761035156250003],[-64.4455078125,-22.58535156250001],[-64.477734375,-22.4853515625],[-64.5236328125,-22.37158203125],[-64.60551757812499,-22.228808593750003],[-64.992626953125,-22.109667968750003],[-65.518798828125,-22.09453125],[-65.686181640625,-22.11025390625001],[-65.77104492187499,-22.099609375],[-65.86015624999999,-22.01972656250001],[-66.05859375,-21.879492187500006],[-66.098583984375,-21.835058593750006],[-66.17465820312499,-21.8056640625],[-66.220166015625,-21.802539062500003],[-66.24760742187499,-21.83046875],[-66.28212890625,-21.94746093750001],[-66.3224609375,-22.053125],[-66.365185546875,-22.11376953125],[-66.71171874999999,-22.21630859375],[-66.99111328125,-22.509863281250006],[-67.19487304687499,-22.82167968750001],[-67.362255859375,-22.85517578125001],[-67.57993164062499,-22.891699218750006],[-67.79443359375,-22.879492187500006],[-67.87944335937499,-22.82294921875001],[-67.88173828125,-22.49335937500001],[-68.18642578125,-21.61855468750001],[-68.197021484375,-21.30029296875],[-68.558251953125,-20.901953125],[-68.484326171875,-20.62841796875],[-68.74516601562499,-20.45859375],[-68.75932617187499,-20.115527343750003],[-68.560693359375,-19.967089843750003],[-68.559375,-19.90234375],[-68.578271484375,-19.856542968750006],[-68.69619140625,-19.74072265625],[-68.69829101562499,-19.72109375],[-68.57529296874999,-19.56015625],[-68.462890625,-19.43281250000001],[-68.470166015625,-19.409960937500003],[-68.49199218749999,-19.381933593750006],[-68.85795898437499,-19.093359375],[-68.96831054687499,-18.96796875000001],[-68.97885742187499,-18.81298828125],[-69.026806640625,-18.65625],[-69.09228515625,-18.28242187500001],[-69.145458984375,-18.14404296875],[-69.0939453125,-18.05048828125001],[-69.28232421874999,-17.96484375],[-69.31337890625,-17.943164062500003],[-69.5109375,-17.50605468750001],[-69.51108398437499,-17.5048828125],[-69.510986328125,-17.46035156250001],[-69.521923828125,-17.388964843750003],[-69.645703125,-17.24853515625],[-69.62485351562499,-17.2001953125],[-69.020703125,-16.6421875],[-69.03291015625,-16.47597656250001],[-68.8427734375,-16.337890625],[-69.21757812499999,-16.14912109375001],[-69.4208984375,-15.640625],[-69.17246093749999,-15.236621093750003],[-69.37470703125,-14.962988281250006],[-69.35947265624999,-14.7953125],[-68.87089843749999,-14.169726562500003],[-69.07412109375,-13.682812500000011],[-68.97861328124999,-12.880078125000011],[-68.68525390625,-12.501953125],[-69.57861328125,-10.951757812500006],[-69.228515625,-10.955664062500006],[-68.84833984375,-11.011132812500009],[-68.678369140625,-11.11279296875],[-68.39799804687499,-11.01875],[-68.0716796875,-10.703125],[-67.99169921875,-10.674414062500006],[-67.83500976562499,-10.662792968750011],[-67.72177734374999,-10.68310546875],[-67.416943359375,-10.389843750000011],[-66.575341796875,-9.89990234375],[-65.396142578125,-9.71240234375],[-65.298583984375,-10.146777343750003],[-65.31308593749999,-10.253027343750006],[-65.395458984375,-10.392285156250011],[-65.4369140625,-10.449023437500003],[-65.44711914062499,-10.507421875],[-65.33403320312499,-10.892773437500011],[-65.32377929687499,-11.024804687500009],[-65.389892578125,-11.246289062500011],[-65.1857421875,-11.74951171875],[-64.783447265625,-12.059375],[-64.42050781249999,-12.439746093750003],[-63.68857421874999,-12.47802734375],[-63.3466796875,-12.680078125],[-63.06748046874999,-12.669140625000011],[-62.76547851562499,-12.997265625000011],[-62.11801757812499,-13.159765625],[-62.09477539062499,-13.241992187500003],[-61.944726562499994,-13.40625],[-61.87412109374999,-13.470410156250011],[-61.789941406249994,-13.525585937500011],[-61.57568359375,-13.524804687500009],[-61.51157226562499,-13.541210937500011],[-61.41606445312499,-13.526562500000011],[-61.129150390625,-13.49853515625],[-61.07700195312499,-13.48974609375],[-60.506591796875,-13.78984375],[-60.372705078124994,-14.41875],[-60.273339843749994,-15.088769531250009],[-60.402001953124994,-15.0927734375],[-60.583203125,-15.098339843750011],[-60.53046875,-15.143164062500006],[-60.38046875,-15.318261718750009],[-60.242333984374994,-15.479589843750006],[-60.20664062499999,-15.901953125],[-60.18720703125,-16.132128906250003],[-60.17558593749999,-16.269335937500003],[-58.53793945312499,-16.328222656250006],[-58.49658203125,-16.32666015625],[-58.42368164062499,-16.307910156250003],[-58.37539062499999,-16.28359375],[-58.345605468749994,-16.284375],[-58.35039062499999,-16.490820312500006],[-58.470605468749994,-16.650195312500003],[-58.478125,-16.70068359375],[-58.45981445312499,-16.910742187500006],[-58.417382812499994,-17.08056640625],[-58.39599609375,-17.23427734375001],[-58.34775390624999,-17.28212890625001],[-57.99091796875,-17.51289062500001],[-57.905029296875,-17.532324218750006],[-57.832470703125,-17.512109375],[-57.78886718749999,-17.573046875],[-57.780175781249994,-17.67177734375001],[-57.66166992187499,-17.947363281250006],[-57.58647460937499,-18.12226562500001],[-57.49565429687499,-18.214648437500003],[-57.57402343749999,-18.279296875],[-57.725,-18.733203125],[-57.783105468749994,-18.91425781250001],[-57.716796875,-19.044042968750006],[-58.131494140624994,-19.74453125],[-57.860742187499994,-19.979589843750006],[-57.887597656249994,-20.02041015625001],[-57.96015625,-20.04072265625001],[-58.021142578124994,-20.05517578125],[-58.09375,-20.15107421875001],[-58.15976562499999,-20.164648437500006]]]},"properties":{"name":"Bolivia","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-48.48588867187493,-27.76699218749998],[-48.554589843749994,-27.81220703125004],[-48.542187499999955,-27.57480468749999],[-48.41489257812495,-27.399609375],[-48.48588867187493,-27.76699218749998]]],[[[-48.584423828124955,-26.401562499999983],[-48.665771484375,-26.289648437500006],[-48.53974609374998,-26.170312500000023],[-48.584423828124955,-26.401562499999983]]],[[[-45.26025390624997,-23.889160156249986],[-45.451416015625,-23.895605468749977],[-45.30234375,-23.727539062500014],[-45.26025390624997,-23.889160156249986]]],[[[-44.12929687499994,-23.14189453124999],[-44.36015624999999,-23.17207031250001],[-44.24287109374998,-23.074121093750037],[-44.12929687499994,-23.14189453124999]]],[[[-38.90356445312497,-13.473437499999974],[-38.97758789062496,-13.523535156249963],[-39.02216796874998,-13.445605468749989],[-38.907128906249994,-13.401074218749983],[-38.90356445312497,-13.473437499999974]]],[[[-38.743847656249955,-13.097070312500037],[-38.668115234374966,-12.880175781249989],[-38.601171875,-12.99257812499998],[-38.743847656249955,-13.097070312500037]]],[[[-44.49931640625002,-2.939648437499983],[-44.597753906250006,-3.037597656249943],[-44.4814453125,-2.717578125000031],[-44.49931640625002,-2.939648437499983]]],[[[-44.88310546874996,-1.317871093749986],[-45.020849609375034,-1.372363281249974],[-44.978662109374966,-1.267285156249983],[-44.88310546874996,-1.317871093749986]]],[[[-51.83251953124997,-1.433789062499969],[-51.938378906249966,-1.452636718749986],[-51.680029296875006,-1.086132812500026],[-51.546044921874966,-0.649609375],[-51.25400390624998,-0.54140625],[-51.16074218749998,-0.666699218750011],[-51.27631835937498,-1.02177734374996],[-51.83251953124997,-1.433789062499969]]],[[[-49.62866210937497,-0.229199218749969],[-49.11699218749999,-0.163574218750014],[-48.39267578124995,-0.29736328125],[-48.83359375,-1.390039062500023],[-49.038476562499994,-1.5140625],[-49.17270507812498,-1.41259765625],[-49.233984375000034,-1.59951171874998],[-49.50664062499999,-1.511621093750023],[-49.587890625,-1.712402343749972],[-49.805126953124955,-1.790234375000026],[-50.06572265625002,-1.703808593749997],[-50.50761718749999,-1.787988281250009],[-50.759765625,-1.240234374999972],[-50.72949218749997,-1.126757812499946],[-50.57695312499999,-1.103125],[-50.709619140624994,-1.07773437499999],[-50.796093749999955,-0.90625],[-50.6455078125,-0.27285156249998],[-50.24824218749998,-0.11640625],[-49.62866210937497,-0.229199218749969]]],[[[-50.65288085937499,-0.131640624999989],[-50.926367187500034,-0.327343749999983],[-51.03808593749994,-0.225878906250003],[-50.84218750000002,-0.050195312500009],[-50.65288085937499,-0.131640624999989]]],[[[-49.44389648437499,-0.112402343749977],[-49.83007812499997,-0.093896484375023],[-49.50346679687496,0.083691406250011],[-49.37231445312497,0.001074218749963],[-49.44389648437499,-0.112402343749977]]],[[[-49.73823242187498,0.26816406250002],[-49.917089843750006,-0.023193359375014],[-50.339453125,0.043359375000051],[-50.27265624999998,0.231738281249974],[-49.73823242187498,0.26816406250002]]],[[[-50.42612304687498,0.139257812500048],[-50.44394531249998,-0.007666015624949],[-50.623925781249966,0.054394531249983],[-50.372753906249955,0.590869140625031],[-50.33227539062497,0.259033203125028],[-50.42612304687498,0.139257812500048]]],[[[-50.152929687500006,0.393017578125054],[-50.26132812499998,0.359179687500003],[-50.281689453124955,0.51650390624998],[-50.05883789062503,0.638037109374963],[-50.152929687500006,0.393017578125054]]],[[[-50.29897460937502,1.93852539062496],[-50.45610351562496,1.910498046875034],[-50.49101562499996,2.128613281249969],[-50.34199218749998,2.14174804687498],[-50.29897460937502,1.93852539062496]]],[[[-59.69970703125,4.353515625],[-59.73857421874993,4.226757812500026],[-59.62021484374998,4.023144531250026],[-59.557763671874966,3.960009765625031],[-59.551123046875034,3.933544921874969],[-59.854394531249994,3.5875],[-59.99433593749998,2.689990234375031],[-59.88964843749997,2.362939453125009],[-59.75522460937495,2.27412109375004],[-59.74350585937498,2.12163085937496],[-59.75175781249996,1.962402343750028],[-59.75620117187498,1.900634765624972],[-59.666601562500006,1.746289062499969],[-59.53569335937499,1.7],[-59.23120117187494,1.376025390625031],[-58.82177734374994,1.201220703125031],[-58.787207031250006,1.208496093750014],[-58.73032226562498,1.247509765625054],[-58.68461914062499,1.28105468749996],[-58.511865234374966,1.284667968749986],[-58.506054687499926,1.438671875000011],[-58.39580078124993,1.481738281249989],[-58.38037109375,1.530224609375011],[-58.34067382812498,1.587548828125051],[-58.03466796875,1.520263671875014],[-57.9828125,1.648437500000014],[-57.87343750000002,1.667285156250045],[-57.79565429687497,1.7],[-57.59443359375001,1.704101562499986],[-57.54575195312495,1.726074218750028],[-57.31748046874998,1.963476562499991],[-57.27558593749998,1.959228515625014],[-57.189599609374966,1.981591796875037],[-57.11889648437494,2.013964843749974],[-57.09267578125002,2.005810546874997],[-57.03759765625,1.936474609374997],[-56.96953124999999,1.91640625],[-56.48281249999994,1.942138671874986],[-56.019921874999966,1.842236328124983],[-55.96333007812498,1.85708007812498],[-55.929638671874955,1.8875],[-55.92163085937503,1.976660156250006],[-55.91533203124999,2.039550781250028],[-55.96196289062496,2.09511718749998],[-56.02006835937499,2.15815429687504],[-56.073632812499994,2.236767578124969],[-56.13769531249997,2.259033203124986],[-56.12939453124997,2.299511718749969],[-56.08779296875002,2.341308593750043],[-56.045117187499955,2.364404296875037],[-56.02036132812498,2.392773437500054],[-55.993505859375006,2.497509765624983],[-55.9755859375,2.515966796875006],[-55.957470703124955,2.52045898437504],[-55.730566406250006,2.406152343750023],[-55.385351562500006,2.440625],[-55.34399414062503,2.488769531249972],[-55.28603515625002,2.49965820312498],[-55.18769531249998,2.547509765625037],[-55.114111328125006,2.539208984375037],[-55.07031249999994,2.548339843750028],[-55.005810546874955,2.592968749999983],[-54.97866210937502,2.597656250000043],[-54.968408203124966,2.548339843750028],[-54.92656249999999,2.497363281250045],[-54.876074218750006,2.450390624999969],[-54.72221679687499,2.441650390624972],[-54.69741210937502,2.359814453124997],[-54.66186523437497,2.327539062499994],[-54.61625976562499,2.326757812500006],[-54.59194335937502,2.313769531250031],[-54.55048828125001,2.293066406249991],[-54.51508789062498,2.245458984374963],[-54.43310546875,2.207519531250057],[-54.13007812499998,2.121044921875026],[-53.76777343749998,2.354833984375048],[-52.90346679687502,2.211523437499977],[-52.58300781250003,2.528906249999977],[-52.327880859375,3.18173828125002],[-51.65253906249998,4.061279296874972],[-51.54707031250001,4.31088867187502],[-51.219921874999955,4.093603515624991],[-50.71440429687502,2.134033203125],[-50.458886718749994,1.829589843749972],[-49.957128906250006,1.65986328125004],[-49.898876953124955,1.16298828124998],[-50.29443359374997,0.835742187500003],[-50.755078124999955,0.222558593749966],[-51.28291015625001,-0.085205078125028],[-51.98081054687498,-1.367968749999974],[-52.22924804687497,-1.3625],[-52.664160156250034,-1.551757812500028],[-51.94755859374996,-1.586718749999946],[-50.89492187500002,-0.937597656249963],[-50.690039062500006,-1.761718749999986],[-50.40322265625002,-2.015527343750009],[-49.999218749999955,-1.831835937499974],[-49.71953125000002,-1.926367187499963],[-49.31367187500001,-1.731738281250003],[-49.63652343749996,-2.656933593750026],[-49.45751953125,-2.504589843749983],[-49.21103515624998,-1.916503906249986],[-48.99130859374998,-1.829785156249997],[-48.71000976562496,-1.487695312500023],[-48.46293945312499,-1.613964843749997],[-48.349804687499926,-1.482128906249955],[-48.46806640624996,-1.393847656250003],[-48.44980468749998,-1.145507812499943],[-48.11508789062498,-0.7375],[-47.557324218749955,-0.669921874999957],[-47.418652343749955,-0.765917968749974],[-47.39809570312502,-0.626660156250026],[-45.45859374999995,-1.35625],[-45.32915039062496,-1.71728515625],[-45.07636718749998,-1.466406249999949],[-44.72114257812498,-1.733496093750006],[-44.778515624999955,-1.798828125],[-44.651269531249966,-1.745800781250026],[-44.537792968749955,-2.052734374999943],[-44.75634765624997,-2.265527343749952],[-44.66240234375002,-2.373242187499955],[-44.435449218749966,-2.168066406249991],[-44.38183593749997,-2.365527343749989],[-44.52011718749998,-2.40546875000004],[-44.589013671874994,-2.573437499999983],[-44.72304687500002,-3.204785156249997],[-44.43754882812496,-2.944433593749977],[-44.228613281250006,-2.471289062499949],[-44.105566406250006,-2.493457031250031],[-44.19267578124999,-2.809570312499943],[-43.93291015624999,-2.583496093749986],[-43.45512695312499,-2.502050781250006],[-43.38007812499998,-2.376074218750006],[-42.93671874999998,-2.465039062500011],[-42.24960937499998,-2.7919921875],[-41.876171874999926,-2.746582031249986],[-41.479931640624955,-2.916503906249972],[-40.474560546874926,-2.795605468750026],[-39.96469726562498,-2.861523437499955],[-38.475781249999955,-3.717480468749997],[-38.04882812500003,-4.216406250000034],[-37.626318359375006,-4.592089843750003],[-37.30146484375001,-4.713085937499969],[-37.174658203125006,-4.912402343749974],[-36.590722656249966,-5.097558593749952],[-35.549414062500006,-5.129394531249957],[-35.39257812499994,-5.250878906250009],[-34.833886718749994,-7.024414062500014],[-34.83466796874998,-7.97148437499996],[-35.34086914062499,-9.230664062499983],[-35.76396484374993,-9.702539062500023],[-35.890820312499926,-9.687011718749957],[-35.88544921875001,-9.84765625],[-36.39833984374994,-10.484082031249983],[-36.768310546875,-10.671679687500017],[-37.18281249999998,-11.06845703125002],[-37.35600585937502,-11.403906249999977],[-37.35922851562495,-11.252539062499963],[-37.68872070312503,-12.1],[-38.019238281249955,-12.591308593750028],[-38.401757812499994,-12.966210937500023],[-38.69096679687502,-12.623925781250009],[-38.85175781250001,-12.790136718750034],[-38.76372070312502,-12.9072265625],[-38.835302734375034,-13.147167968750026],[-39.030908203124994,-13.365136718750023],[-39.08935546875,-13.588183593749989],[-38.988623046875006,-13.61503906249996],[-39.04814453124996,-14.043945312500028],[-38.94233398437498,-14.030664062499994],[-39.05957031249997,-14.654785156249957],[-38.88061523437503,-15.864257812499972],[-39.20288085937503,-17.178125],[-39.154003906249926,-17.70390625000003],[-39.650781249999966,-18.252343750000037],[-39.78330078124998,-19.571777343749986],[-40.001367187499994,-19.74199218750003],[-40.39594726562501,-20.56943359375002],[-40.78925781250001,-20.90605468750003],[-40.954541015624926,-21.237890624999963],[-41.04726562499999,-21.505664062499974],[-41.00029296875002,-21.99902343750003],[-41.70551757812498,-22.30966796874999],[-41.980419921874955,-22.580664062499963],[-42.042382812499966,-22.947070312500003],[-42.95830078124996,-22.96708984374999],[-43.154296875,-22.725195312500006],[-43.22416992187502,-22.991210937500014],[-43.898828124999966,-23.10146484375001],[-43.97382812499998,-23.057324218749983],[-43.675976562499955,-23.00947265625001],[-43.86616210937498,-22.910546875000023],[-44.63725585937496,-23.05546875],[-44.67382812499994,-23.206640625000034],[-44.56967773437495,-23.27402343749999],[-45.32539062499998,-23.59970703124999],[-45.464306640624955,-23.802539062500017],[-45.97207031250002,-23.795507812500006],[-46.86728515624998,-24.236328125000014],[-47.989160156249994,-25.03574218749999],[-47.92939453124998,-25.16826171874999],[-48.20273437499998,-25.41650390625003],[-48.18593749999994,-25.309863281249974],[-48.402490234374994,-25.27207031249999],[-48.47612304687499,-25.44296875],[-48.73173828124993,-25.36875],[-48.6921875,-25.49150390625003],[-48.40117187500002,-25.59736328125001],[-48.665771484375,-25.844335937499963],[-48.576318359374994,-25.935449218749966],[-48.61943359374996,-26.17939453125001],[-48.74829101562503,-26.26865234374999],[-48.55415039062498,-27.195996093749997],[-48.62080078124998,-28.075585937499966],[-48.799658203125006,-28.575292968749977],[-49.27128906249999,-28.87119140625005],[-49.745996093749966,-29.363183593749994],[-50.299511718749955,-30.42578125000003],[-50.92138671874997,-31.25839843750002],[-52.039208984374994,-32.11484374999996],[-52.063232421875,-31.830371093750017],[-51.68066406249994,-31.774609375000026],[-51.272167968749955,-31.476953125000037],[-51.16142578124996,-31.11884765625001],[-50.980078125000034,-31.09423828124997],[-50.94082031249994,-30.903710937499966],[-50.68930664062495,-30.70419921874999],[-50.71630859374994,-30.425976562499983],[-50.58193359375002,-30.438867187500037],[-50.56352539062499,-30.25361328125004],[-51.02495117187493,-30.36865234375003],[-51.29804687499998,-30.03486328124997],[-51.15727539062499,-30.364257812500014],[-51.283056640625034,-30.751562499999963],[-51.35908203124998,-30.674511718749983],[-51.506298828124955,-31.104492187500014],[-51.97246093749999,-31.383789062499986],[-52.19355468749998,-31.885546874999974],[-52.12739257812501,-32.1677734375],[-52.652246093749994,-33.137792968750006],[-53.37060546874997,-33.74218750000003],[-53.39755859374995,-33.737304687500014],[-53.46357421875001,-33.70986328125002],[-53.531347656250034,-33.65546875000004],[-53.531347656250034,-33.1708984375],[-53.511865234374966,-33.10869140625003],[-53.482861328124926,-33.068554687500026],[-53.39521484375001,-33.01035156249998],[-53.31010742187499,-32.927050781249974],[-53.21406249999998,-32.82109375],[-53.12558593749998,-32.73671875],[-53.15727539062496,-32.680078125],[-53.601708984374994,-32.40302734374997],[-53.76171875,-32.05683593749997],[-53.920605468749926,-31.95234375],[-54.220556640625034,-31.855175781249997],[-54.58764648437503,-31.48515625000003],[-55.036035156249994,-31.27900390625004],[-55.091162109375034,-31.31396484374997],[-55.173535156249926,-31.279589843749974],[-55.557324218749955,-30.8759765625],[-55.60302734375003,-30.85078125000001],[-55.62714843749998,-30.858105468749997],[-55.650488281250034,-30.89208984375],[-55.66523437500001,-30.92490234375002],[-55.807763671874994,-31.036718749999977],[-55.87368164062502,-31.069628906250017],[-55.95200195312498,-31.08085937499999],[-56.0046875,-31.079199218750006],[-56.01845703125002,-30.991894531249983],[-55.998974609374955,-30.837207031250003],[-56.4072265625,-30.44746093750001],[-56.83271484374998,-30.107226562499974],[-57.120507812499994,-30.144433593749994],[-57.21445312499995,-30.283398437499983],[-57.55229492187496,-30.261230468749986],[-57.60888671875003,-30.187792968750045],[-57.563867187499994,-30.139941406249974],[-57.40522460937501,-30.03388671875004],[-57.22465820312499,-29.782128906249994],[-56.938623046874994,-29.594824218750034],[-55.890527343749994,-28.370019531249994],[-55.68725585937497,-28.38164062499996],[-55.72548828125002,-28.20410156250003],[-55.10151367187501,-27.866796874999963],[-54.82910156250003,-27.55058593750003],[-54.32700195312495,-27.423535156249997],[-53.83818359375002,-27.121093750000014],[-53.668554687500006,-26.288183593749977],[-53.89116210937499,-25.66884765625001],[-54.15458984374999,-25.523046874999963],[-54.44394531249998,-25.625],[-54.615869140624994,-25.576074218750023],[-54.61054687499998,-25.432714843750034],[-54.47314453124997,-25.22021484375],[-54.43623046875001,-25.12128906250001],[-54.281005859375,-24.30605468750001],[-54.31826171874994,-24.128125],[-54.26689453124996,-24.06582031250001],[-54.241796875,-24.047265624999966],[-54.44023437500002,-23.90175781249998],[-54.62548828125,-23.8125],[-54.98266601562494,-23.974511718749966],[-55.081884765625006,-23.997656249999977],[-55.1943359375,-24.017480468750023],[-55.28691406249993,-24.00429687499999],[-55.366308593750034,-23.99101562499996],[-55.41591796875002,-23.95136718749997],[-55.4423828125,-23.86533203125002],[-55.4423828125,-23.792578125000034],[-55.458886718749966,-23.686718750000054],[-55.51845703124994,-23.627246093750017],[-55.53828124999998,-23.580957031249994],[-55.61767578125,-22.67148437499999],[-55.74663085937499,-22.51269531249997],[-55.753271484375006,-22.410156250000043],[-55.84916992187499,-22.307617187500014],[-55.991406249999926,-22.28115234375005],[-56.18984374999994,-22.28115234375005],[-56.246044921874926,-22.26464843749997],[-56.39487304687498,-22.092675781250023],[-56.44780273437502,-22.07617187500003],[-56.77519531249999,-22.261328125],[-57.955908203125034,-22.109179687500003],[-57.94267578124999,-21.79833984375],[-57.830224609374994,-20.99794921875001],[-57.91513671874998,-20.690332031249966],[-57.97905273437493,-20.65732421874999],[-58.00224609374996,-20.465429687499977],[-58.02539062499997,-20.41582031249999],[-58.05844726562495,-20.38613281249998],[-58.091503906249926,-20.33320312500004],[-58.124609375000034,-20.293457031250014],[-58.13779296874995,-20.237304687500043],[-58.15976562499998,-20.164648437499977],[-58.09375,-20.15107421874997],[-58.021142578124994,-20.05517578124997],[-57.96015625000001,-20.04072265625004],[-57.887597656249966,-20.020410156249994],[-57.860742187499994,-19.97958984375002],[-58.029931640624994,-19.83271484375004],[-58.131494140624994,-19.74453125],[-57.71679687499997,-19.044042968750034],[-57.73085937499999,-18.91718750000004],[-57.783105468749994,-18.91425781249997],[-57.725,-18.73320312500003],[-57.57402343749993,-18.279296875000014],[-57.49565429687496,-18.21464843749999],[-57.58647460937499,-18.122265625],[-57.66166992187493,-17.94736328124999],[-57.78017578125002,-17.67177734374998],[-57.78886718750002,-17.573046875000017],[-57.83247070312501,-17.512109375000037],[-57.90502929687497,-17.53232421874999],[-57.990917968749955,-17.512890625000026],[-58.20556640625,-17.363085937499974],[-58.347753906250006,-17.282128906249994],[-58.39599609374997,-17.234277343750023],[-58.417382812499994,-17.08056640624997],[-58.459814453125006,-16.910742187500006],[-58.478125,-16.70068359375003],[-58.470605468749994,-16.650195312500045],[-58.35039062500002,-16.49082031249999],[-58.34560546875002,-16.284375],[-58.375390624999966,-16.283593749999966],[-58.423681640625034,-16.30791015625003],[-58.49658203124994,-16.32666015625003],[-58.537939453125034,-16.32822265624999],[-60.17558593749996,-16.26933593749999],[-60.187207031249955,-16.132128906250017],[-60.206640625,-15.90195312500002],[-60.242333984374994,-15.479589843750034],[-60.38046874999998,-15.318261718750023],[-60.53046874999998,-15.143164062499977],[-60.58320312499998,-15.098339843749983],[-60.273339843749994,-15.088769531249994],[-60.372705078124994,-14.41875],[-60.506591796875,-13.78984375],[-61.077001953125034,-13.489746093750014],[-61.129150390625,-13.498535156250028],[-61.41606445312502,-13.526562499999969],[-61.511572265625006,-13.541210937500011],[-61.789941406249966,-13.525585937500026],[-61.87412109374998,-13.470410156249983],[-61.944726562499966,-13.40625],[-62.09477539062499,-13.241992187499989],[-62.118017578125006,-13.15976562500002],[-62.765478515625034,-12.99726562500004],[-63.01518554687502,-12.80556640624998],[-63.067480468750006,-12.669140624999983],[-63.34667968749994,-12.68007812499999],[-63.68857421874998,-12.478027343749957],[-64.42050781249995,-12.439746093749974],[-64.783447265625,-12.059375],[-65.18574218749998,-11.749511718749957],[-65.389892578125,-11.246289062500011],[-65.33403320312499,-10.892773437500026],[-65.44711914062503,-10.507421875000034],[-65.4369140625,-10.449023437499946],[-65.39545898437498,-10.392285156250026],[-65.31308593749998,-10.253027343749991],[-65.29858398437497,-10.146777343750017],[-65.39614257812494,-9.712402343749986],[-66.57534179687502,-9.899902343749986],[-67.41694335937495,-10.389843749999969],[-67.72177734374998,-10.683105468749943],[-67.83500976562496,-10.662792968749983],[-67.99169921875,-10.674414062499949],[-68.07167968749994,-10.703125],[-68.39799804687499,-11.01875],[-68.678369140625,-11.11279296875],[-68.84833984374998,-11.01113281249998],[-69.228515625,-10.955664062499963],[-69.46254882812497,-10.948144531250023],[-69.57861328125,-10.951757812499963],[-69.67402343749998,-10.9541015625],[-69.83979492187501,-10.93339843749996],[-69.96035156249997,-10.92988281250004],[-70.06630859374997,-10.982421875],[-70.22006835937503,-11.04765625],[-70.29038085937498,-11.064257812499974],[-70.34199218750001,-11.066699218750017],[-70.39228515624995,-11.058593749999972],[-70.45087890624998,-11.024804687500009],[-70.53325195312496,-10.946875],[-70.59653320312498,-10.976855468750017],[-70.642333984375,-11.010253906249986],[-70.59916992187499,-9.620507812500009],[-70.54111328124998,-9.4375],[-70.60791015625,-9.463671875000031],[-70.63691406249995,-9.478222656249969],[-71.041748046875,-9.81875],[-71.11528320312499,-9.852441406250009],[-71.33940429687499,-9.988574218750031],[-72.18159179687495,-10.003710937500003],[-72.37905273437497,-9.51015625],[-73.20942382812493,-9.411425781249946],[-73.08984375,-9.26572265625002],[-72.970361328125,-9.120117187500028],[-72.97402343750002,-8.9931640625],[-73.07050781249995,-8.8828125],[-73.203125,-8.719335937499991],[-73.30244140624995,-8.654003906250011],[-73.36040039062496,-8.479296875000031],[-73.39814453125001,-8.458984374999986],[-73.54912109374993,-8.34580078125002],[-73.73203125,-7.875390625],[-73.72041015624993,-7.782519531250017],[-73.76689453124999,-7.753515624999963],[-73.82207031249996,-7.738964843750026],[-73.89462890624998,-7.654785156250014],[-73.946875,-7.611230468750023],[-73.98173828124996,-7.58505859375002],[-74.00205078125003,-7.556054687499966],[-73.98173828124996,-7.535742187500006],[-73.95849609374994,-7.506640625000031],[-73.96430664062498,-7.378906250000028],[-73.74946289062498,-7.335351562500037],[-73.72041015624993,-7.309277343749969],[-73.758203125,-7.172753906249952],[-73.79301757812499,-7.135058593750003],[-73.75810546874999,-6.90576171875],[-73.137353515625,-6.4658203125],[-73.23554687500001,-6.098437500000017],[-73.209375,-6.028710937500023],[-73.16289062499996,-5.933398437499974],[-72.97988281249997,-5.634863281249991],[-72.88706054687498,-5.122753906250026],[-72.83193359374994,-5.09375],[-72.69873046874997,-5.067187499999989],[-72.60834960937495,-5.009570312499974],[-72.46899414062497,-4.901269531250023],[-72.35283203124993,-4.786035156249994],[-72.25678710937501,-4.74892578124998],[-71.8447265625,-4.504394531249986],[-70.97368164062499,-4.350488281249994],[-70.86601562499999,-4.229589843749963],[-70.79951171874995,-4.173339843749957],[-70.72158203124997,-4.15888671875004],[-70.53066406249997,-4.167578125000034],[-70.40463867187498,-4.150097656250026],[-70.34365234375,-4.193652343750017],[-70.31689453124994,-4.246972656250037],[-70.23916015625002,-4.30117187499998],[-70.12880859375,-4.286621093749943],[-70.05332031249998,-4.333105468750006],[-70.00395507812496,-4.327246093749963],[-69.97202148437503,-4.30117187499998],[-69.96591796875003,-4.2359375],[-69.94819335937498,-4.200585937500009],[-69.66904296875003,-2.667675781249997],[-69.40024414062498,-1.194921874999977],[-69.63398437500001,-0.50927734375],[-70.07050781249993,-0.13886718750004],[-70.05390624999993,0.578613281250028],[-69.47211914062498,0.72993164062504],[-69.15332031249994,0.65878906250002],[-69.31181640624999,1.050488281249969],[-69.85214843750003,1.05952148437504],[-69.84858398437493,1.708740234375043],[-68.17656249999999,1.719824218749991],[-68.25595703125,1.845507812500017],[-68.19379882812495,1.987011718749983],[-67.93623046874998,1.748486328124969],[-67.40043945312499,2.116699218750028],[-67.11923828124998,1.703613281249986],[-67.082275390625,1.185400390625006],[-66.87602539062499,1.223046875000037],[-66.34711914062498,0.7671875],[-66.06005859375003,0.78535156250004],[-65.68144531249999,0.983447265624989],[-65.52299804687493,0.843408203124966],[-65.55605468750002,0.687988281250014],[-65.47338867187497,0.691259765624977],[-65.10375976562497,1.108105468749983],[-64.20502929687493,1.52949218750004],[-64.00849609374995,1.931591796874969],[-63.43251953124994,2.155566406250045],[-63.389257812500006,2.411914062500045],[-64.04658203124998,2.502392578124997],[-64.22109375000002,3.587402343749972],[-64.66899414062496,4.01181640625002],[-64.788671875,4.276025390625023],[-64.57636718750001,4.139892578125],[-64.19248046874995,4.126855468750009],[-64.02148437500003,3.929101562500051],[-63.33867187500002,3.943896484375045],[-62.85698242187502,3.593457031249969],[-62.71210937499998,4.01791992187502],[-62.41064453124994,4.156738281249972],[-62.153125,4.098388671874986],[-61.82084960937496,4.197021484375],[-61.28007812500002,4.516894531249974],[-61.00283203125002,4.535253906249991],[-60.603857421875006,4.94936523437498],[-60.671972656250034,5.164355468749989],[-60.71196289062499,5.191552734375023],[-60.742138671874926,5.202050781250037],[-60.6513671875,5.221142578125011],[-60.45952148437499,5.188085937500034],[-60.40878906249998,5.21015625],[-60.33520507812497,5.199316406250006],[-60.241650390624926,5.257958984374966],[-60.14204101562498,5.238818359374974],[-59.990673828124955,5.082861328124991],[-60.14863281249998,4.533251953125031],[-59.69970703125,4.353515625]]]]},"properties":{"name":"Brazil","childNum":17}},{"geometry":{"type":"Polygon","coordinates":[[[-59.493310546874994,13.081982421874997],[-59.611328125,13.102099609374989],[-59.6466796875,13.303125],[-59.427636718749994,13.152783203124997],[-59.493310546874994,13.081982421874997]]]},"properties":{"name":"Barbados","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[115.02675781250005,4.899707031249989],[115.1400390625,4.899755859374991],[115.290625,4.352587890624989],[115.10703125000006,4.390429687499974],[115.02675781250005,4.899707031249989]]],[[[115.02675781250005,4.899707031249989],[114.74667968750006,4.718066406250017],[114.84023437500005,4.393212890625009],[114.65410156250007,4.037646484375045],[114.0638671875,4.592675781249966],[114.42441406250006,4.660400390625],[114.99541015625002,5.022363281250023],[115.02675781250005,4.899707031249989]]]]},"properties":{"name":"Brunei","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[91.63193359375003,27.759960937499997],[91.5947265625,27.557666015624996],[91.74306640625002,27.442529296874994],[91.85126953125001,27.438623046874994],[91.95097656249999,27.458300781249996],[91.99082031250003,27.4501953125],[92.044921875,27.364697265624997],[92.08339843750002,27.290625],[92.03115234375002,27.214306640624997],[92.00253906250003,27.147363281249994],[91.99228515625003,27.099902343749996],[91.99863281250003,27.079296875],[92.03085937500003,27.040820312499996],[92.06816406249999,26.9751953125],[92.07343750000001,26.91484375],[92.04970703125002,26.874853515625],[91.99833984374999,26.85498046875],[91.84208984374999,26.852978515624997],[91.67158203125001,26.802001953125],[91.517578125,26.807324218749997],[91.45585937499999,26.866894531249997],[91.4267578125,26.867089843749994],[91.28652343750002,26.789941406249994],[90.73964843750002,26.771679687499997],[90.34589843750001,26.890332031249997],[90.2060546875,26.847509765625],[90.12294921875002,26.754589843749997],[89.94316406249999,26.723925781249996],[89.76386718750001,26.7015625],[89.60996093750003,26.719433593749997],[89.58613281250001,26.778955078124994],[89.33212890625003,26.8486328125],[89.14824218749999,26.816162109375],[89.04091796875002,26.865039062499996],[88.85761718750001,26.961474609374996],[88.73876953125,27.175585937499996],[88.76035156250003,27.218115234375],[88.88164062499999,27.2974609375],[88.89140624999999,27.316064453124994],[88.94755859374999,27.464013671874994],[89.48066406250001,28.059960937499994],[89.53691406249999,28.107421875],[89.65273437500002,28.15830078125],[89.74980468749999,28.188183593749997],[89.81689453125,28.256298828124997],[89.89785156250002,28.294140625],[89.98105468750003,28.311181640624994],[90.34824218750003,28.243945312499996],[90.36298828125001,28.216503906249997],[90.33310546875003,28.093994140625],[90.35273437500001,28.080224609374994],[90.47734374999999,28.070849609374996],[90.63007812500001,28.078564453124997],[90.71572265625002,28.071728515624997],[91.02080078124999,27.970068359375],[91.07773437500003,27.974462890625],[91.22587890624999,28.071240234374997],[91.27304687500003,28.078369140625],[91.30683593750001,28.064013671874996],[91.36757812500002,28.021630859374994],[91.64189453124999,27.923242187499994],[91.63193359375003,27.759960937499997]]]},"properties":{"name":"Bhutan","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[25.2587890625,-17.793554687500006],[25.242285156250006,-17.969042968750003],[25.939355468750023,-18.93867187500001],[26.168066406250006,-19.53828125000001],[27.17822265625,-20.10097656250001],[27.28076171875,-20.47871093750001],[27.679296875,-20.503027343750006],[27.66943359375,-21.064257812500003],[28.014062500000023,-21.55419921875],[29.02558593750001,-21.796875],[29.042382812500023,-22.018359375],[29.237207031250023,-22.07949218750001],[29.315234375000017,-22.15771484375],[29.36484375,-22.193945312500006],[29.1298828125,-22.21328125],[29.013476562500017,-22.278417968750006],[28.94580078125,-22.395117187500006],[28.83984375,-22.480859375],[28.21015625000001,-22.693652343750003],[27.812597656250006,-23.108007812500006],[27.7685546875,-23.14892578125],[27.085546875,-23.577929687500003],[26.835058593750006,-24.240820312500006],[26.617773437500006,-24.3955078125],[26.451757812500006,-24.58271484375001],[26.39716796875001,-24.613574218750003],[26.130859375,-24.671484375],[26.031835937500006,-24.702441406250003],[25.912109375,-24.74746093750001],[25.518164062500006,-25.66279296875001],[25.21337890625,-25.75625],[24.33056640625,-25.74287109375001],[24.19296875,-25.632910156250006],[23.969531250000017,-25.626074218750006],[23.89375,-25.600878906250003],[23.389257812500006,-25.29140625],[23.148730468750017,-25.288671875],[22.878808593750023,-25.45791015625001],[22.59765625,-26.13271484375001],[22.548632812500017,-26.17841796875001],[22.47089843750001,-26.219042968750003],[22.217578125000017,-26.38886718750001],[22.090917968750006,-26.580175781250006],[22.01093750000001,-26.635839843750006],[21.78828125000001,-26.710058593750006],[21.738085937500017,-26.80683593750001],[21.694726562500023,-26.840917968750006],[20.73984375,-26.84882812500001],[20.641406250000017,-26.7421875],[20.79316406250001,-25.915625],[20.4306640625,-25.147070312500006],[19.98046875,-24.77675781250001],[19.977343750000017,-22.00019531250001],[20.9794921875,-21.9619140625],[20.97412109375,-18.31884765625],[23.219335937500006,-17.99970703125001],[23.599707031250006,-18.4599609375],[24.243945312500017,-18.0234375],[24.530566406250017,-18.052734375],[24.909082031250023,-17.821386718750006],[25.2587890625,-17.793554687500006]]]},"properties":{"name":"Botswana","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[22.86005859375001,10.919677734375],[23.646289062500017,9.822900390624994],[23.62265625,9.340625],[23.46826171875,9.11474609375],[23.53730468750001,8.815820312499994],[24.147363281250023,8.665625],[24.291406250000023,8.29140625],[24.853320312500017,8.137548828124991],[25.20039062500001,7.807910156249989],[25.18134765625001,7.557226562499991],[25.27890625,7.427490234375],[26.36181640625,6.635302734374989],[26.30859375,6.455322265625],[26.514257812500006,6.069238281249994],[27.143945312500023,5.722949218749989],[27.4033203125,5.109179687499989],[27.071875,5.199755859374989],[26.822070312500017,5.062402343749994],[25.52509765625001,5.31210937499999],[25.065234375000017,4.967431640624994],[24.31982421875,4.994140625],[23.41718750000001,4.663134765624989],[22.864550781250017,4.723876953125],[22.422167968750017,4.134960937499997],[20.55810546875,4.462695312499989],[20.226367187500017,4.829638671874989],[19.806542968750023,5.089306640624997],[19.5009765625,5.127490234374989],[19.06855468750001,4.891406249999989],[18.594140625000023,4.346240234374989],[18.6103515625,3.478417968749994],[18.474414062500017,3.622998046874997],[18.160937500000017,3.499804687499989],[17.491601562500023,3.687304687499989],[16.610742187500023,3.50537109375],[16.468554687500017,2.831738281249997],[16.183398437500017,2.270068359374989],[16.0634765625,2.90859375],[15.128710937500017,3.826904296875],[15.063574218750006,4.284863281249997],[14.73125,4.602392578124991],[14.56298828125,5.279931640624994],[14.616894531250011,5.865136718749994],[14.43115234375,6.038720703124994],[14.7392578125,6.27978515625],[15.206738281250011,7.206152343749991],[15.480078125,7.523779296874991],[15.957617187500006,7.507568359375],[16.37890625,7.683544921874997],[16.545312500000023,7.865478515625],[16.784765625,7.550976562499997],[17.6494140625,7.98359375],[18.56416015625001,8.0458984375],[19.108691406250017,8.656152343749994],[18.886035156250017,8.836035156249991],[18.95625,8.938867187499994],[20.342089843750017,9.127099609374994],[20.773242187500017,9.405664062499994],[21.682714843750006,10.289843749999989],[21.771484375,10.642822265625],[22.49384765625001,10.996240234374994],[22.86005859375001,10.919677734375]]]},"properties":{"name":"Central African Rep.","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-59.78759765624997,43.939599609374994],[-60.11748046874996,43.95336914062506],[-59.727148437500006,44.002832031249994],[-59.78759765624997,43.939599609374994]]],[[[-66.7625,44.68178710937502],[-66.8970703125,44.62890625],[-66.80214843749994,44.80537109374998],[-66.7625,44.68178710937502]]],[[[-60.961572265624966,45.48994140625001],[-61.081738281249926,45.55781249999998],[-60.91245117187498,45.56728515625005],[-60.961572265624966,45.48994140625001]]],[[[-73.69531249999997,45.58549804687502],[-73.85771484375002,45.573583984375006],[-73.57236328124998,45.69448242187502],[-73.69531249999997,45.58549804687502]]],[[[-73.56650390625003,45.469091796875034],[-73.960546875,45.44140624999997],[-73.68745117187498,45.561425781249994],[-73.47607421874997,45.704736328124994],[-73.56650390625003,45.469091796875034]]],[[[-61.10517578124998,45.94472656250002],[-60.86523437499997,45.983496093750006],[-61.05903320312501,45.70336914062497],[-60.73789062499995,45.75141601562498],[-60.46059570312494,45.96870117187501],[-60.733300781249994,45.956591796875045],[-60.297949218750034,46.31123046874998],[-60.22646484374994,46.19555664062506],[-59.86503906249993,46.159521484375006],[-59.8421875,45.941552734374994],[-60.67294921874995,45.59082031250006],[-61.28369140624994,45.573876953124966],[-61.44980468749995,45.71621093750002],[-61.40864257812501,46.17036132812498],[-60.87016601562499,46.796777343749966],[-60.40820312500003,47.00351562499998],[-60.332910156249966,46.737011718749955],[-60.49453125000002,46.270263671875],[-61.10517578124998,45.94472656250002]]],[[[-63.811279296875,46.46870117187501],[-63.68144531249993,46.561914062499994],[-63.12939453125,46.422216796875034],[-62.02373046874999,46.42158203125001],[-62.52607421875001,46.20288085937503],[-62.531347656250034,45.977294921875],[-63.02207031249998,46.06660156249998],[-62.89453125000003,46.12358398437496],[-63.056347656249955,46.22392578124996],[-62.97846679687498,46.31635742187498],[-63.21347656249998,46.15986328124998],[-63.641015624999966,46.23046874999997],[-63.758642578125034,46.397607421874994],[-64.11083984375003,46.425439453124994],[-64.13603515624999,46.59970703125006],[-64.388037109375,46.640869140625],[-63.99355468750002,47.06157226562502],[-64.08789062499997,46.77543945312499],[-63.811279296875,46.46870117187501]]],[[[-61.91411132812496,47.284521484375034],[-61.77255859374998,47.25981445312499],[-62.00830078124994,47.23427734375002],[-61.924707031249966,47.425146484375006],[-61.3955078125,47.63764648437504],[-61.91411132812496,47.284521484375034]]],[[[-54.227148437500034,47.44135742187501],[-54.32597656250002,47.408105468749994],[-54.12817382812494,47.646826171875034],[-54.227148437500034,47.44135742187501]]],[[[-74.70888671874997,45.0038574218751],[-73.55810546875,45.425097656250045],[-73.1595703125,46.01005859375002],[-72.10927734374997,46.55122070312504],[-71.26118164062495,46.75625],[-70.51948242187501,47.032519531250045],[-69.47104492187503,47.96728515625006],[-68.23818359374994,48.62641601562504],[-66.17817382812493,49.21313476562503],[-64.83632812499994,49.191748046875006],[-64.2162109375,48.873632812500034],[-64.51372070312493,48.84111328124999],[-64.24609374999994,48.69111328124998],[-64.34882812500001,48.423193359375034],[-65.259423828125,48.02124023437503],[-65.92670898437495,48.188867187499994],[-66.70439453125002,48.0224609375],[-66.35961914062494,48.06064453125006],[-65.84941406250002,47.91103515625005],[-65.60722656249996,47.67001953125006],[-65.00166015624995,47.84682617187502],[-64.70322265625,47.72485351562503],[-64.91220703125003,47.36865234375003],[-65.31889648437502,47.101220703124994],[-64.831396484375,47.06079101562503],[-64.88251953124993,46.822851562500034],[-64.54150390625,46.240332031250034],[-63.91591796875002,46.165820312500045],[-63.831933593749966,46.107177734375],[-64.05639648437503,46.021337890625006],[-63.70288085937494,45.858007812500034],[-62.70068359374997,45.740576171875006],[-62.750097656250006,45.64824218750002],[-62.483056640624966,45.62182617187506],[-61.955517578124955,45.86816406249997],[-61.776513671874994,45.655615234375006],[-61.49228515624998,45.68701171875],[-61.350488281249966,45.57368164062501],[-61.28198242187494,45.441064453124994],[-61.46098632812502,45.36669921875003],[-61.03154296875002,45.29174804687506],[-63.306298828124994,44.64257812500003],[-63.60400390624997,44.68320312500006],[-63.60976562499999,44.47998046875006],[-63.999707031249926,44.64492187499999],[-64.10087890624993,44.487451171874966],[-64.1669921875,44.58666992187503],[-64.28608398437493,44.55034179687499],[-64.27568359374993,44.33408203124998],[-65.48168945312497,43.51806640625],[-65.73813476562498,43.56074218750001],[-65.88691406250001,43.79521484374999],[-66.125732421875,43.813818359375034],[-66.19306640624995,44.143847656250045],[-65.86801757812498,44.56879882812501],[-66.14638671875002,44.43593750000005],[-66.090625,44.50493164062499],[-64.44814453125,45.33745117187502],[-64.13549804687497,45.023046875],[-64.09316406249997,45.21708984375002],[-63.368017578125034,45.36479492187502],[-64.87314453124998,45.35458984375006],[-64.31464843749998,45.83569335937503],[-64.48222656250002,45.80634765624998],[-64.63271484375002,45.94663085937506],[-64.77851562499998,45.63842773437497],[-65.88447265624995,45.22290039062506],[-66.10976562500002,45.316601562499955],[-66.02656249999995,45.417578125],[-66.43984374999994,45.09589843750001],[-66.87246093749997,45.067285156249966],[-67.12485351562498,45.16943359375],[-67.366943359375,45.17377929687498],[-67.43266601562496,45.603125],[-67.80224609374994,45.7275390625],[-67.806787109375,47.08281249999999],[-68.23549804687502,47.34594726562503],[-68.93720703124998,47.21123046875002],[-69.0501953125,47.426611328125034],[-69.24287109374998,47.46298828124998],[-70.00771484375002,46.70893554687501],[-70.296240234375,45.90610351562506],[-70.86503906249999,45.27070312500001],[-71.327294921875,45.29008789062496],[-71.51752929687495,45.00756835937497],[-74.663232421875,45.00390625000003],[-74.70888671874997,45.0038574218751]]],[[[-126.09208984374995,49.35400390625003],[-126.06401367187499,49.26362304687501],[-126.22963867187498,49.29565429687506],[-126.09208984374995,49.35400390625003]]],[[[-54.55439453125001,49.5888671875],[-54.786523437499966,49.496142578125045],[-54.86357421875002,49.576074218749966],[-54.55439453125001,49.5888671875]]],[[[-54.093701171874955,49.74443359374999],[-53.98066406250001,49.66196289062498],[-54.28613281249997,49.595361328124994],[-54.27763671875002,49.71147460937502],[-54.093701171874955,49.74443359374999]]],[[[-126.64121093749999,49.605810546875006],[-126.93857421874999,49.71845703125004],[-126.92583007812497,49.837744140625006],[-126.73813476562502,49.84365234375005],[-126.64121093749999,49.605810546875006]]],[[[-61.801123046875034,49.093896484374966],[-63.04150390624994,49.224951171875034],[-64.485205078125,49.88696289062497],[-64.13144531249995,49.94165039062503],[-62.858544921874966,49.70546875000005],[-61.817138671875,49.28354492187498],[-61.69614257812495,49.139013671875006],[-61.801123046875034,49.093896484374966]]],[[[-125.18413085937497,50.09711914062498],[-125.301171875,50.4140625],[-125.07402343750002,50.22065429687501],[-125.18413085937497,50.09711914062498]]],[[[-127.19731445312495,50.640380859375],[-125.48208007812501,50.316796874999966],[-124.83061523437499,49.53007812500002],[-123.99580078125,49.22402343750002],[-123.49702148437498,48.58208007812499],[-123.38989257812501,48.67021484374999],[-123.31064453125003,48.41103515625002],[-123.57314453124995,48.32280273437499],[-123.91694335937501,48.386572265625034],[-125.12070312500002,48.76079101562496],[-124.84965820312496,49.02827148437501],[-124.81264648437497,49.212646484375],[-124.92734374999998,49.01420898437499],[-125.489453125,48.933789062499955],[-125.82851562499998,49.09184570312499],[-125.64423828125001,49.18579101562506],[-125.95166015625001,49.24804687500003],[-125.93540039062499,49.401464843750006],[-126.51914062499999,49.396777343750045],[-126.54189453125001,49.590478515624966],[-126.13408203124997,49.672314453124955],[-126.52524414062499,49.71958007812498],[-126.90332031250001,49.94414062499999],[-127.114306640625,49.879736328125034],[-127.24980468749999,50.13798828124996],[-127.34941406249995,50.05195312500001],[-127.46713867187503,50.163427734375006],[-127.86391601562495,50.12773437500002],[-127.90585937499998,50.44521484375002],[-127.48652343749998,50.404638671875034],[-127.46591796874996,50.58310546875006],[-128.05834960937494,50.498486328124955],[-128.34604492187503,50.744238281250006],[-127.91806640624998,50.86054687500001],[-127.19731445312495,50.640380859375]]],[[[-55.45874023437494,51.53652343750005],[-55.58339843749994,51.38857421875002],[-56.031103515625034,51.328369140625],[-55.8,51.033300781250034],[-56.732324218749966,50.007714843749994],[-56.822167968749966,49.613476562499955],[-56.179394531249955,50.114990234375],[-56.161279296874994,49.94013671874998],[-55.50292968749997,49.98315429687503],[-56.14018554687496,49.61914062500006],[-55.869824218749955,49.67016601562506],[-56.08730468750002,49.45195312499999],[-55.375927734374955,49.48974609374997],[-55.34384765624998,49.37290039062506],[-55.22954101562496,49.508154296875006],[-55.35317382812502,49.07944335937506],[-54.50219726562503,49.52734375],[-54.44824218749997,49.329443359375006],[-53.957714843749955,49.44184570312498],[-53.61943359374996,49.321630859375006],[-53.57343750000001,49.141210937500034],[-54.16127929687494,48.787695312500034],[-53.852880859375006,48.81132812499996],[-53.966015624999955,48.70668945312505],[-53.70634765624999,48.65551757812503],[-54.11445312499998,48.393603515625045],[-53.027587890625,48.634716796874955],[-53.1357421875,48.40185546875003],[-53.60976562500002,48.20771484375001],[-53.56943359374998,48.088085937499955],[-53.869580078124926,48.019677734374966],[-53.63823242187496,48.01464843750003],[-53.863671874999966,47.787011718749994],[-53.67236328125,47.64824218749999],[-53.28271484375,47.99785156249996],[-52.86601562499993,48.11298828124998],[-53.16982421875002,47.51210937500005],[-52.945019531249955,47.55283203124998],[-52.782421874999955,47.769433593749966],[-52.653662109375034,47.549414062500006],[-53.11484375,46.65581054687502],[-53.32304687499996,46.71835937499998],[-53.589794921874955,46.638867187499955],[-53.59736328124998,47.14599609374997],[-54.00957031249993,46.839599609375],[-54.173730468749994,46.88037109375003],[-53.84951171875002,47.440332031249994],[-53.98901367187503,47.756201171875034],[-54.191845703124955,47.85981445312501],[-54.488134765625006,47.40385742187502],[-54.47392578124996,47.54707031249998],[-54.856640624999955,47.385009765625],[-55.31572265624993,46.905712890624955],[-55.78852539062498,46.86723632812502],[-55.91923828124996,47.01689453124996],[-55.49150390624996,47.16064453125003],[-54.78461914062501,47.664746093749955],[-55.366308593750034,47.66108398437501],[-55.57612304687498,47.46523437499999],[-56.12724609374999,47.50283203125002],[-55.867089843749994,47.592333984375045],[-55.85791015625,47.81918945312498],[-56.774121093749955,47.56499023437499],[-58.33686523437501,47.73085937500002],[-59.11694335937494,47.57070312499999],[-59.32065429687498,47.736914062500006],[-59.272070312500034,47.99555664062504],[-58.330224609374994,48.52211914062502],[-59.16767578124998,48.558496093749966],[-58.84179687500003,48.74643554687498],[-58.906445312499955,48.65019531249999],[-58.716455078124994,48.59804687500002],[-58.403662109375034,49.08432617187498],[-57.99052734374996,48.987939453124966],[-58.09892578124993,49.07744140624999],[-57.98007812499998,49.229638671874994],[-58.19091796875003,49.25874023437498],[-58.21337890625,49.38666992187501],[-58.01582031249998,49.54248046874997],[-57.79130859374999,49.48999023437503],[-57.92617187499999,49.700830078124994],[-57.4326171875,50.50581054687504],[-57.179589843749966,50.614843750000034],[-57.29799804687502,50.69873046874997],[-57.03593750000002,51.01083984374998],[-56.68242187500002,51.332763671875],[-56.025585937499955,51.56835937500006],[-55.6904296875,51.471337890624994],[-55.666406249999966,51.57890624999999],[-55.45874023437494,51.53652343750005]]],[[[-127.92465820312498,51.47387695312497],[-128.14877929687498,51.62670898437503],[-128.03173828125006,51.708398437499966],[-127.92465820312498,51.47387695312497]]],[[[-79.38427734374997,51.951953125000045],[-79.64375,52.01005859374996],[-79.27128906249996,52.086816406249966],[-79.38427734374997,51.951953125000045]]],[[[-128.36875,52.40087890625],[-128.43979492187503,52.696386718750006],[-128.24726562499998,52.784375],[-128.36875,52.40087890625]]],[[[-80.73168945312494,52.74726562499998],[-82.03925781249998,53.04990234374998],[-81.84731445312494,53.18627929687497],[-81.135595703125,53.20581054687503],[-80.73168945312494,52.74726562499998]]],[[[-131.7537109375,53.195556640625],[-131.63466796874997,52.92216796874999],[-131.97177734374998,52.87983398437498],[-131.45522460937502,52.70170898437502],[-131.59057617187494,52.578222656250006],[-131.25971679687495,52.415917968749966],[-131.31992187499998,52.30307617187498],[-131.142626953125,52.291113281250034],[-131.221533203125,52.15361328124999],[-132.16508789062493,52.783300781250034],[-132.14375,52.99931640624999],[-132.54677734374997,53.1375],[-131.7537109375,53.195556640625]]],[[[-128.55244140624998,52.93974609375002],[-128.50991210937502,52.51860351562502],[-128.678955078125,52.289648437500006],[-128.74633789062494,52.763378906249955],[-128.89980468749997,52.67382812500003],[-129.175927734375,52.964941406250006],[-129.033251953125,53.27993164062505],[-128.63266601562498,53.1125],[-128.55244140624998,52.93974609375002]]],[[[-129.167724609375,53.11787109374998],[-129.32387695312502,53.142138671875045],[-129.23818359374997,53.33007812500006],[-129.167724609375,53.11787109374998]]],[[[-129.84858398437498,53.167919921874955],[-130.51757812500003,53.54423828124999],[-130.45200195312498,53.63115234375002],[-129.94472656250002,53.436376953125034],[-129.75483398437498,53.244775390624994],[-129.84858398437498,53.167919921874955]]],[[[-130.236279296875,53.95854492187502],[-130.38422851562504,53.84394531250001],[-130.703173828125,53.892236328124994],[-130.44799804687497,54.08901367187502],[-130.236279296875,53.95854492187502]]],[[[-132.65551757812503,54.12749023437496],[-132.30336914062497,54.098876953125],[-132.16611328124998,53.95522460937505],[-132.53466796875,53.651708984375034],[-132.18696289062504,53.68481445312503],[-132.134423828125,54.03427734374998],[-131.66762695312502,54.14135742187503],[-131.957421875,53.308691406250034],[-132.34726562500003,53.18920898437503],[-132.747509765625,53.310498046874955],[-132.425,53.33696289062502],[-132.84501953125,53.507714843749994],[-133.07949218749997,53.837011718750034],[-133.04838867187493,54.15893554687497],[-132.65551757812503,54.12749023437496]]],[[[-130.92714843749997,54.47905273437499],[-130.90683593750003,54.63178710937504],[-130.75800781249998,54.61376953125],[-130.92714843749997,54.47905273437499]]],[[[-130.57534179687497,54.769677734374966],[-130.2140625,55.02587890625003],[-130.34941406249996,54.814550781250034],[-130.57534179687497,54.769677734374966]]],[[[-79.97758789062499,56.20703125000006],[-80.057470703125,56.28735351562497],[-79.57973632812502,56.466357421875045],[-79.97758789062499,56.20703125000006]]],[[[-78.93559570312496,56.26606445312498],[-79.17548828124998,55.88505859374999],[-79.18212890625,56.21215820312503],[-79.4951171875,55.87475585937503],[-79.76474609374995,55.80678710937505],[-79.54472656249999,56.12836914062501],[-79.9875,55.89213867187502],[-79.45888671875,56.53974609374998],[-79.53632812499995,56.180078124999966],[-79.27241210937493,56.600439453125006],[-78.93559570312496,56.26606445312498]]],[[[-61.743603515624955,57.55458984375005],[-61.6375,57.41606445312499],[-62.01123046875003,57.54848632812505],[-61.743603515624955,57.55458984375005]]],[[[-79.71650390624998,57.515527343749994],[-79.80844726562498,57.44243164062502],[-79.74257812499997,57.60795898437499],[-79.71650390624998,57.515527343749994]]],[[[-69.16005859375,59.04023437500001],[-69.35283203125002,58.96074218749999],[-69.30322265625003,59.144873046875006],[-69.16005859375,59.04023437500001]]],[[[-64.40703125,60.367089843749966],[-64.44194335937496,60.2978515625],[-64.73793945312497,60.37563476562502],[-64.83642578124997,60.50102539062499],[-64.40703125,60.367089843749966]]],[[[-68.23378906250002,60.24091796875001],[-68.36787109374998,60.314746093750045],[-68.08759765624998,60.58784179687501],[-67.81884765624994,60.449511718750074],[-68.23378906250002,60.24091796875001]]],[[[-78.531640625,60.72856445312499],[-78.66889648437498,60.716894531250006],[-78.24169921875,60.818652343750045],[-78.531640625,60.72856445312499]]],[[[-64.83261718749998,61.366064453125006],[-65.43212890625,61.649511718750034],[-64.78964843750003,61.662207031250034],[-64.83261718749998,61.366064453125006]]],[[[-65.03056640624999,61.879052734374966],[-64.89658203124995,61.73330078125005],[-65.23535156249997,61.89770507812506],[-65.03056640624999,61.879052734374966]]],[[[-79.54531250000002,62.41171875000006],[-79.28647460937495,62.247656250000034],[-79.32392578124995,62.02607421875001],[-79.81611328124995,61.59462890625002],[-80.26518554687496,61.818212890625006],[-80.26005859374996,62.10903320312502],[-79.9267578125,62.39287109375002],[-79.54531250000002,62.41171875000006]]],[[[-64.82382812499998,62.558740234374994],[-64.46503906249998,62.535937500000045],[-64.47832031250002,62.417871093749966],[-64.901220703125,62.421044921874994],[-64.82382812499998,62.558740234374994]]],[[[-70.33706054687497,62.548730468749994],[-70.76606445312498,62.596875],[-71.22011718750002,62.873925781249966],[-70.44262695312497,62.73378906250002],[-70.33706054687497,62.548730468749994]]],[[[-82.00048828124997,62.95419921874998],[-82.02583007812498,62.73007812499998],[-82.56826171875002,62.403222656249994],[-83.01582031249998,62.20991210937498],[-83.69887695312497,62.16025390624998],[-83.91049804687498,62.45415039062499],[-83.37641601562498,62.904931640624994],[-82.00048828124997,62.95419921874998]]],[[[-77.87670898437497,63.470556640625034],[-77.53271484374997,63.233642578125],[-77.94243164062496,63.11440429687502],[-78.536767578125,63.423730468749994],[-77.87670898437497,63.470556640625034]]],[[[-76.67758789062503,63.393945312499966],[-77.36474609374994,63.588330078124955],[-77.13369140624997,63.68203125000002],[-76.65244140624998,63.503564453124994],[-76.67758789062503,63.393945312499966]]],[[[-84.91962890624995,65.26108398437503],[-84.50112304687497,65.45844726562501],[-84.08486328125,65.21782226562502],[-82.05,64.64428710937506],[-81.67612304687498,64.21264648437503],[-81.88710937499997,64.01640625000002],[-80.82895507812495,64.08994140625],[-80.30205078124999,63.76220703125003],[-81.04638671875003,63.461572265624966],[-82.378125,63.706787109375],[-82.46708984375002,63.92695312500001],[-83.30395507812497,64.14379882812506],[-84.63291015625,63.30922851562502],[-85.39262695312496,63.119677734375045],[-85.76894531249997,63.70034179687502],[-87.15190429687499,63.58564453125001],[-86.93203124999997,63.90166015625002],[-86.252099609375,64.13686523437497],[-86.37426757812503,64.56582031249997],[-86.074609375,65.533837890625],[-85.55468750000003,65.91865234374995],[-85.17622070312501,65.746875],[-85.23994140624993,65.51030273437499],[-84.91962890624995,65.26108398437503]]],[[[-84.67475585937498,65.575],[-85.096337890625,65.756201171875],[-85.14960937500001,66.01538085937506],[-84.75737304687496,65.85893554687505],[-84.67475585937498,65.575]]],[[[-83.72597656249997,65.796728515625],[-83.23374023437495,65.71503906249995],[-83.332421875,65.63105468749998],[-84.11826171874995,65.77177734375007],[-84.40717773437501,66.13100585937497],[-83.78696289062495,65.96577148437498],[-83.72597656249997,65.796728515625]]],[[[-108.09272460937501,67.00517578124999],[-107.80551757812493,66.99858398437507],[-107.94394531249999,66.8578125],[-108.09272460937501,67.00517578124999]]],[[[-62.681542968749966,67.05629882812502],[-62.87163085937499,67.06259765625006],[-62.41679687499996,67.18847656250003],[-62.681542968749966,67.05629882812502]]],[[[-107.89985351562497,67.40180664062495],[-107.95024414062503,67.31821289062498],[-108.15224609374997,67.429443359375],[-108.04897460937498,67.664892578125],[-107.89985351562497,67.40180664062495]]],[[[-73.621728515625,67.783837890625],[-74.573388671875,67.82866210937507],[-74.70654296875003,68.06708984374995],[-73.49375,68.00063476562502],[-73.40717773437498,67.79306640625],[-73.621728515625,67.783837890625]]],[[[-86.59555664062498,67.7359375],[-86.89252929687498,67.836572265625],[-86.95981445312503,68.10024414062497],[-86.70209960937501,68.30561523437498],[-86.42114257812497,68.18344726562503],[-86.59555664062498,67.7359375]]],[[[-75.67587890624998,68.32250976562506],[-75.078125,68.17314453124999],[-75.20195312499996,67.45917968750001],[-75.78007812499996,67.28354492187503],[-76.94418945312498,67.25029296875002],[-77.30439453125001,67.68510742187505],[-77.12587890624997,67.94707031250002],[-76.59580078124998,68.27895507812497],[-75.67587890624998,68.32250976562506]]],[[[-78.98271484374999,68.19282226562501],[-79.17475585937493,68.26445312500002],[-78.95258789062495,68.35302734375006],[-78.98271484374999,68.19282226562501]]],[[[-104.54067382812497,68.405908203125],[-105.05136718749999,68.55903320312501],[-104.60200195312503,68.56152343749997],[-104.54067382812497,68.405908203125]]],[[[-74.880859375,68.34868164062505],[-75.40024414062503,68.52548828125],[-75.28740234374996,68.68774414062503],[-74.98364257812497,68.64760742187502],[-74.880859375,68.34868164062505]]],[[[-101.84589843749994,68.58632812499997],[-102.30815429687497,68.681982421875],[-102.01337890624995,68.82539062500001],[-101.73295898437495,68.75341796875],[-101.84589843749994,68.58632812499997]]],[[[-100.21723632812497,68.80668945312502],[-100.59653320312496,68.76640625000007],[-100.56547851562495,69.02680664062501],[-100.21723632812497,68.80668945312502]]],[[[-99.99467773437502,69.01352539062503],[-100.19570312500002,68.991455078125],[-100.153125,69.12949218750003],[-99.99467773437502,69.01352539062503]]],[[[-79.21064453124995,68.845458984375],[-79.24267578125,69.04926757812495],[-78.33256835937496,69.38603515624999],[-78.77919921875,68.95048828124999],[-79.21064453124995,68.845458984375]]],[[[-90.1998046875,69.419091796875],[-90.33027343749993,69.252197265625],[-90.49204101562503,69.369873046875],[-90.1998046875,69.419091796875]]],[[[-76.99536132812503,69.14375],[-77.37939453125,69.2740234375],[-77.18754882812502,69.440087890625],[-76.66884765625002,69.36616210937504],[-76.99536132812503,69.14375]]],[[[-101.171728515625,69.39707031250003],[-101.31289062499998,69.57607421875],[-101.00063476562497,69.4619140625],[-101.171728515625,69.39707031250003]]],[[[-95.51367187499997,69.57363281250002],[-95.43745117187498,69.37846679687505],[-95.73012695312502,69.34755859374997],[-95.80620117187499,69.56049804687501],[-95.89345703125,69.35175781250004],[-95.87583007812495,69.60600585937505],[-95.51367187499997,69.57363281250002]]],[[[-67.91469726562494,69.54096679687504],[-68.22138671874998,69.61674804687502],[-67.908837890625,69.68183593749995],[-67.91469726562494,69.54096679687504]]],[[[-78.02910156249993,69.71489257812502],[-78.03999023437495,69.6083984375],[-78.84819335937502,69.4828125],[-78.02910156249993,69.71489257812502]]],[[[-79.43066406250003,69.78779296874995],[-79.55283203124995,69.63085937500006],[-80.04750976562502,69.63432617187505],[-79.97783203124993,69.50966796874997],[-80.794775390625,69.68925781250005],[-80.42421875000002,69.797607421875],[-79.43066406250003,69.78779296874995]]],[[[-97.439453125,69.64267578125006],[-96.29995117187494,69.34438476562505],[-95.7513671875,68.89765624999998],[-95.26777343749998,68.82607421874997],[-96.40156249999995,68.47070312500003],[-97.47202148437498,68.543701171875],[-98.320556640625,68.84272460937498],[-98.70380859374993,68.80278320312502],[-98.90449218749995,68.93242187500005],[-99.25400390625002,68.86318359374997],[-99.49467773437493,68.95957031249998],[-99.455712890625,69.13120117187503],[-98.45595703124997,69.33466796875001],[-98.54599609375,69.57290039062497],[-98.04135742187498,69.456640625],[-98.20048828124996,69.79697265625006],[-97.79072265624998,69.86162109374999],[-97.439453125,69.64267578125006]]],[[[-86.91303710937501,70.11323242187501],[-86.55766601562499,69.99531249999995],[-87.3232421875,70.08012695312502],[-86.91303710937501,70.11323242187501]]],[[[-74.70888671874997,45.0038574218751],[-74.76245117187494,44.99907226562502],[-74.99614257812496,44.970117187499966],[-75.40126953124997,44.77226562499999],[-75.81933593749997,44.468017578125],[-76.18579101562503,44.24223632812502],[-76.819970703125,43.62880859375011],[-77.59653320312492,43.62861328125007],[-78.45825195312497,43.63149414062511],[-78.72041015624993,43.62495117187501],[-78.84555664062492,43.58334960937506],[-79.171875,43.466552734375085],[-79.0830566406249,43.33139648437509],[-79.05922851562494,43.27807617187506],[-79.066064453125,43.10610351562502],[-79.02617187499996,43.01733398437506],[-78.98076171874993,42.98061523437502],[-78.91508789062496,42.90913085937504],[-79.17373046875,42.74853515625],[-80.24755859374991,42.366015625000045],[-81.02822265624997,42.247167968750006],[-81.50732421874997,42.10346679687504],[-81.97416992187496,41.88872070312499],[-82.43906249999989,41.6748535156251],[-82.69003906249995,41.675195312499994],[-83.141943359375,41.97587890624996],[-83.10952148437497,42.25068359375001],[-82.54531249999997,42.62470703124998],[-82.19038085937495,43.47407226562501],[-82.137841796875,43.570898437500034],[-82.48505859374993,45.08374023437503],[-82.55107421874987,45.3473632812501],[-82.91933593749994,45.51796875000002],[-83.59267578125,45.81713867187506],[-83.46948242187503,45.99467773437499],[-83.61596679687503,46.116845703124994],[-83.97778320312494,46.08491210937507],[-84.12319335937497,46.50292968749997],[-84.44047851562496,46.49814453125006],[-84.66577148437503,46.54326171875002],[-84.87597656249994,46.89990234375003],[-85.07006835937497,46.97993164062498],[-85.65224609375,47.21997070312503],[-86.67216796874996,47.636425781249955],[-87.20800781249997,47.848486328125006],[-87.74389648437497,48.06054687500003],[-88.37817382812497,48.30307617187506],[-89.45566406249992,47.99624023437508],[-90.79731445312495,48.13105468750001],[-91.04345703124991,48.19370117187498],[-91.38720703124997,48.05854492187498],[-92.00517578125002,48.301855468750006],[-92.3484375,48.276611328125],[-92.41459960937493,48.276611328125],[-92.50058593749995,48.43535156250002],[-92.83671875,48.567773437499994],[-93.25795898437497,48.62885742187501],[-93.37788085937498,48.61655273437498],[-93.70771484374995,48.525439453125074],[-93.85161132812496,48.607275390625034],[-94.6208984374999,48.7426269531251],[-94.71279296874997,48.863427734374994],[-94.80346679687497,49.0029296875],[-94.86040039062493,49.258593750000045],[-94.85434570312495,49.304589843749994],[-95.15527343749997,49.3696777343751],[-95.16206054687493,48.991748046875045],[-95.39790039062493,48.99316406249997],[-96.25068359374993,48.99316406249997],[-96.67705078124993,48.99316406249997],[-97.52983398437493,48.99316406249997],[-98.80898437499995,48.99316406249997],[-104.77832031249997,48.993115234375125],[-110.7476562499999,48.993066406250136],[-116.71704101562493,48.993066406250136],[-118.84892578124993,48.993066406250136],[-119.27534179687494,48.993066406250136],[-119.70170898437495,48.99301757812495],[-120.98085937499995,48.99301757812495],[-122.78876953124994,48.99301757812495],[-122.82670898437495,49.028417968750034],[-122.9241699218749,49.07465820312504],[-122.96269531249993,49.07460937500005],[-123.06328125,48.97773437500001],[-123.22944335937493,49.260498046875085],[-122.87910156249995,49.39892578125003],[-123.27675781249997,49.34394531250001],[-123.1875,49.680322265624994],[-123.53056640624989,49.39731445312506],[-124.02861328125002,49.602880859375006],[-123.99262695312497,49.736181640625006],[-123.81718749999993,49.58657226562508],[-123.58247070312498,49.68125],[-123.87441406250005,49.736816406250114],[-123.82543945312493,50.14423828124998],[-123.94589843749995,50.18393554687509],[-123.9849121093749,49.87558593749998],[-124.28125,49.77211914062502],[-124.78237304687492,50.02011718749992],[-125.05668945312495,50.418652343750125],[-124.8598632812499,50.872412109375006],[-125.05878906249993,50.51386718749998],[-125.4763183593749,50.49716796874995],[-125.53935546874996,50.64902343749998],[-125.64130859374994,50.46621093750005],[-126.09433593749995,50.497607421875045],[-126.44746093750004,50.58774414062492],[-125.90410156250002,50.704931640625006],[-126.51435546875,50.679394531250125],[-126.37460937499995,50.83735351562498],[-126.5217773437499,50.86606445312498],[-126.51733398437497,51.0568359375001],[-126.63178710937494,50.915136718750006],[-127.057568359375,50.86752929687509],[-127.70810546875,51.15117187499996],[-127.41967773437496,51.608056640625136],[-126.69145507812502,51.70341796875002],[-127.33872070312489,51.70737304687495],[-127.66870117187497,51.47758789062502],[-127.85053710937498,51.67319335937509],[-127.79536132812493,52.19101562500006],[-127.43793945312504,52.356152343750125],[-127.24223632812496,52.39511718750009],[-126.71396484374989,52.060693359374994],[-127.19399414062498,52.45766601562502],[-126.95136718749994,52.7510253906251],[-127.01933593750002,52.8424804687501],[-127.06621093749989,52.65268554687498],[-127.79189453124994,52.28935546875002],[-128.10224609374993,51.78842773437495],[-128.3576171875,52.1588867187501],[-128.0375,52.318164062500045],[-127.94023437499996,52.545166015625085],[-128.27153320312493,52.3629882812501],[-128.05327148437487,52.91069335937496],[-128.3650390624999,52.82578125000006],[-128.52470703125002,53.1406738281251],[-129.08090820312492,53.36728515625006],[-129.1715820312499,53.53359375000002],[-128.8545898437499,53.70454101562504],[-128.90561523437492,53.559326171875114],[-128.5421386718749,53.420654296875114],[-128.13271484375002,53.417773437500045],[-127.92783203125,53.274707031250045],[-128.2072265624999,53.483203125000074],[-128.67553710937494,53.55458984375005],[-128.76367187500003,53.746875],[-128.5321289062499,53.85810546875007],[-128.959375,53.84145507812505],[-129.2578613281249,53.417968750000085],[-129.56372070312506,53.251464843750114],[-130.33525390625002,53.723925781250074],[-130.04331054687495,54.13354492187503],[-129.62602539062493,54.23027343750002],[-130.08422851562503,54.18139648437503],[-130.4302734375,54.42099609374998],[-129.56064453124995,55.46254882812508],[-129.79516601562503,55.559570312500114],[-130.04848632812494,55.05727539062511],[-130.01406249999997,55.950537109375006],[-130.09785156249995,56.10927734375002],[-130.41313476562487,56.12250976562507],[-130.47709960937496,56.230566406250034],[-130.649072265625,56.26367187500003],[-131.471875,56.55673828125006],[-131.82426757812496,56.58999023437508],[-131.86616210937495,56.792822265625006],[-132.1042968749999,56.85678710937509],[-132.062890625,56.95336914062503],[-132.33798828124992,57.07944335937498],[-132.27939453124998,57.14536132812506],[-132.23217773437494,57.198535156250074],[-132.30166015625005,57.2763183593751],[-132.44248046874986,57.40673828125003],[-132.55048828124995,57.499902343749994],[-133.00141601562495,57.948974609375],[-133.27529296875,58.22285156250004],[-133.54638671874997,58.50346679687499],[-134.21850585937503,58.849902343750045],[-134.32963867187505,58.93969726562506],[-134.39306640625,59.009179687499994],[-134.67724609374997,59.19926757812499],[-134.94375,59.28828125000001],[-135.05102539062491,59.57866210937502],[-135.36787109374998,59.743310546874994],[-135.70258789062504,59.72875976562506],[-136.3218261718749,59.604833984375034],[-136.27797851562494,59.48032226562506],[-136.46635742187493,59.459082031250006],[-136.57875976562494,59.15224609375002],[-136.81328125000002,59.15004882812511],[-137.12622070312491,59.04096679687507],[-137.2775390624999,58.988183593749994],[-137.43857421874995,58.903125],[-137.52089843749994,58.91538085937506],[-137.59331054687493,59.22626953124998],[-138.317626953125,59.611132812500074],[-138.86875,59.94575195312501],[-139.18515624999986,60.083593750000034],[-139.13696289062494,60.17270507812506],[-139.07924804687497,60.279443359375136],[-139.07924804687497,60.3437011718751],[-139.23476562499997,60.339746093749994],[-139.67631835937505,60.32832031249998],[-139.97329101562497,60.183154296875074],[-140.45283203125004,60.29970703125002],[-140.5254394531249,60.21835937499995],[-140.76274414062505,60.25913085937509],[-141.00214843750004,60.300244140625125],[-141.00214843750004,60.884667968749994],[-141.00214843750004,61.761279296875045],[-141.00214843750004,63.22226562499998],[-141.00214843750004,64.09887695312506],[-141.00214843750004,65.55991210937498],[-141.00214843750004,66.43652343750006],[-141.00214843750004,67.89755859374998],[-141.00214843750004,68.77416992187506],[-141.00214843750004,69.65078125000011],[-139.18154296874997,69.51552734375008],[-137.25996093749998,68.96411132812503],[-136.12236328124993,68.88222656250002],[-135.258837890625,68.68432617187503],[-135.93901367187487,68.9741699218751],[-135.575537109375,69.02695312500003],[-135.91020507812487,69.11147460937502],[-135.6914550781249,69.31118164062502],[-135.29282226562486,69.30786132812506],[-135.1408203124999,69.46782226562496],[-134.45683593749993,69.47763671875],[-134.40893554687494,69.68178710937502],[-133.87978515624997,69.50771484375011],[-134.17431640624991,69.25283203125005],[-133.16313476562496,69.43388671874999],[-132.91533203125002,69.62963867187506],[-132.40390625,69.65874023437496],[-132.48847656249993,69.73808593749996],[-132.16342773437498,69.70498046875014],[-131.13637695312497,69.90688476562505],[-130.66547851562495,70.12705078124998],[-129.944970703125,70.09091796875006],[-129.675634765625,70.19296875000009],[-129.64829101562495,69.9977539062501],[-130.83208007812487,69.65146484375006],[-131.9377929687499,69.5347167968751],[-132.8174804687499,69.20576171875004],[-133.41831054687492,68.84428710937493],[-133.138037109375,68.74658203125011],[-133.33666992187497,68.83525390625005],[-132.57763671874997,68.84780273437514],[-132.71894531249998,69.07919921875],[-131.78837890625002,69.43198242187495],[-131.32470703124997,69.36118164062509],[-131.06342773437504,69.45068359375003],[-130.97065429687495,69.20908203125],[-130.1176269531249,69.720068359375],[-128.89892578124994,69.96616210937506],[-129.15791015624995,69.80009765624999],[-129.05434570312502,69.70107421875005],[-128.85302734375003,69.7510253906251],[-127.68378906249994,70.26035156249995],[-128.17011718749998,70.41845703125],[-127.99101562499992,70.57382812500003],[-127.22597656249992,70.29614257812497],[-126.25043945312495,69.54526367187492],[-125.52495117187495,69.35156250000009],[-125.171875,69.42797851562503],[-125.35693359374991,69.62597656250003],[-124.767919921875,69.99003906249996],[-124.99038085937494,70.02661132812511],[-124.55502929687488,70.15122070312509],[-124.40693359374991,69.76743164062506],[-124.12460937499995,69.6899902343751],[-124.33808593749991,69.36484374999995],[-123.5284179687499,69.38935546874995],[-123.02578125,69.81000976562504],[-122.07006835937499,69.81616210937506],[-120.96245117187502,69.66040039062511],[-120.13999023437488,69.38056640625013],[-117.22695312499998,68.913427734375],[-116.05947265625,68.83701171875006],[-116.2434082031249,68.9740722656251],[-115.44228515624994,68.94091796875009],[-114.62016601562496,68.74609375],[-113.96440429687495,68.39907226562502],[-114.09594726562491,68.26679687500007],[-114.76528320312494,68.27021484375004],[-115.12705078124992,68.13203124999995],[-115.43447265624994,67.90234375000006],[-115.13320312499994,67.819189453125],[-112.50302734374993,67.6819335937501],[-110.9900390624999,67.79082031250007],[-110.07392578124995,67.99291992187506],[-109.63037109374991,67.73271484374996],[-109.03803710937504,67.69116210937503],[-108.85200195312497,67.42197265625009],[-108.61333007812493,67.59804687500008],[-107.98872070312495,67.2563964843751],[-107.99130859374995,67.09516601562513],[-108.49604492187493,67.09228515625006],[-107.25947265624998,66.39853515624995],[-107.71035156250001,66.74003906250007],[-107.7250976562499,66.98413085937506],[-107.15649414062497,66.88173828124997],[-107.9583984375,67.81860351562506],[-107.79829101562498,68.03691406249996],[-106.42426757812491,68.20058593750008],[-105.7501953125,68.59228515625011],[-106.45805664062496,68.51645507812495],[-106.60849609374988,68.35737304687504],[-107.61933593749994,68.3310546875],[-107.73417968749989,68.17373046875011],[-108.3228027343749,68.15410156250002],[-108.71811523437488,68.29746093750009],[-108.31347656249996,68.61079101562498],[-106.16445312499992,68.91987304687507],[-105.68559570312489,68.82817382812505],[-105.3774414062499,68.413818359375],[-104.65317382812488,68.23007812500003],[-104.48681640624991,68.06318359374998],[-103.47412109374993,68.11503906250005],[-102.32036132812489,67.73564453125005],[-101.55498046874992,67.69316406250007],[-100.21293945312489,67.83857421875004],[-98.92045898437502,67.72578124999998],[-98.41210937499991,67.80717773437505],[-98.63154296875004,68.0725585937501],[-97.45493164062486,67.61699218750002],[-97.20654296874989,67.85507812500003],[-97.73911132812495,67.97817382812505],[-98.19252929687494,67.92299804687502],[-98.65048828124989,68.36352539062506],[-98.21855468750002,68.31743164062507],[-97.7942382812499,68.38759765625],[-97.9250976562499,68.523681640625],[-97.41035156249993,68.49653320312498],[-96.97670898437497,68.25541992187505],[-96.43066406249991,68.3105957031251],[-96.72207031250005,68.03876953124998],[-95.9703125,68.24912109375],[-96.36914062499991,67.50976562500003],[-96.14145507812489,67.27182617187503],[-95.71992187499998,67.31679687500014],[-95.77768554687495,67.18461914062505],[-95.41591796875005,67.15556640624999],[-95.41889648437504,67.01323242187493],[-96.42255859374995,67.05175781249997],[-95.7875488281249,66.616796875],[-96.03686523437489,66.9375],[-95.39965820312503,66.94946289062509],[-95.25874023437493,67.26254882812492],[-95.65048828124986,67.73745117187505],[-95.46069335937503,68.02138671875],[-94.74443359374993,68.07089843749995],[-93.44892578124998,68.61889648437503],[-93.85244140624994,69.00034179687495],[-94.06489257812495,68.78476562500006],[-94.600439453125,68.80322265625011],[-94.08364257812497,69.12309570312507],[-94.254736328125,69.31376953125002],[-93.61948242187492,69.41699218750009],[-93.74853515624991,69.2261230468751],[-93.5322753906249,69.48090820312495],[-94.2708007812499,69.45512695312505],[-94.63383789062496,69.64965820312506],[-94.82250976562494,69.577783203125],[-95.96494140624989,69.80278320312499],[-96.5513671875,70.21030273437506],[-96.29770507812492,70.51137695312511],[-95.87861328124998,70.54897460937514],[-95.88632812499986,70.69428710937507],[-96.25800781249993,70.64228515625013],[-96.54892578124995,70.80874023437511],[-96.44658203124996,71.23989257812502],[-96.06201171874997,71.41386718749993],[-95.5642578124999,71.33676757812503],[-95.40625,71.49165039062498],[-95.87231445312494,71.57314453125005],[-94.73486328124994,71.98295898437507],[-94.30834960937491,71.76489257812506],[-93.74628906249998,71.742822265625],[-92.94868164062493,71.26210937500011],[-92.98144531249994,70.8522460937501],[-91.56406249999995,70.1782714843751],[-92.32050781250004,70.2353515625],[-92.51186523437494,70.10385742187503],[-91.976708984375,70.03867187500009],[-92.88779296874989,69.66821289062511],[-92.31166992187494,69.67290039062499],[-91.91196289062495,69.53125],[-91.20180664062494,69.64477539062494],[-91.43994140624997,69.52568359375002],[-90.4155761718749,69.45698242187507],[-90.89228515625004,69.26728515624995],[-91.23720703125005,69.28554687500014],[-90.47900390624994,68.88115234374999],[-90.57363281250005,68.47470703124998],[-90.20478515625004,68.25747070312511],[-89.27954101562491,69.25546875000003],[-88.22353515625,68.91503906249997],[-87.81357421874986,68.34570312499997],[-87.89267578125,68.24814453125],[-88.34697265624993,68.28828125000001],[-88.313818359375,67.95034179687508],[-87.359375,67.17724609374997],[-86.56079101562491,67.48212890625007],[-85.64316406249992,68.69970703124997],[-84.86757812499994,68.77333984375005],[-85.10664062499995,68.84404296875007],[-84.86220703125,69.07397460937503],[-85.38676757812493,69.23188476562504],[-85.50737304687487,69.84526367187493],[-82.61835937499993,69.69106445312514],[-82.39023437499989,69.60087890625007],[-82.75483398437493,69.49438476562506],[-82.30986328124996,69.41000976562509],[-82.22753906249997,69.24887695312495],[-81.37783203125005,69.18564453125003],[-81.95791015624991,68.88364257812498],[-81.38090820312496,68.85004882812504],[-81.28154296874987,68.65722656250003],[-81.91484374999993,68.4587890625001],[-82.55268554687504,68.44648437500007],[-82.22241210937489,68.145263671875],[-82.0125,68.19389648437496],[-81.97646484374997,67.86201171875001],[-81.2943359375,67.497412109375],[-81.46757812499996,67.0698730468751],[-83.40644531249998,66.37124023437508],[-84.53847656249994,66.97280273437505],[-84.84575195312502,67.02871093750008],[-85.11372070312498,66.90693359375013],[-84.73774414062504,66.93359375000006],[-84.223046875,66.68247070312506],[-83.86904296875,66.2135742187501],[-84.29306640624995,66.29179687500005],[-84.628076171875,66.20771484374998],[-85.603857421875,66.56826171875005],[-86.708154296875,66.52304687500009],[-86.68510742187502,66.36040039062499],[-85.95874023437491,66.11904296875002],[-87.45288085937503,65.33896484375009],[-87.96997070312503,65.34892578124999],[-89.7494140625,65.93603515625006],[-89.88969726562487,65.86855468749997],[-91.42724609374994,65.94790039062497],[-91.04111328124989,65.82983398437509],[-90.98344726562496,65.91923828124999],[-89.92407226562497,65.78027343750011],[-88.97402343749994,65.34829101562502],[-87.02753906249995,65.19809570312498],[-88.10561523437497,64.18330078125001],[-88.81772460937489,63.99223632812499],[-89.20063476562493,64.11376953125006],[-89.13154296874998,63.96850585937494],[-89.61582031249995,64.030615234375],[-89.8113281249999,64.18056640625],[-90.04165039062494,64.14086914062509],[-89.85571289062497,63.9569824218751],[-90.16816406250004,63.978759765625085],[-90.15473632812498,63.68964843749998],[-90.81191406249991,63.580908203125034],[-91.98222656249996,63.82241210937502],[-92.33842773437496,63.787646484375045],[-93.69633789062493,64.14716796875013],[-93.55981445312491,63.865283203125074],[-93.27021484374998,63.840869140625074],[-93.37851562499992,63.94848632812497],[-92.15688476562491,63.691699218750045],[-92.46508789062491,63.55507812500011],[-91.84184570312496,63.69755859374999],[-90.97006835937489,63.442773437500136],[-90.69858398437492,63.06386718750005],[-91.44897460937503,62.804052734375034],[-92.3612792968749,62.81938476562496],[-91.93583984374993,62.59238281250009],[-92.55141601562491,62.546728515625034],[-92.76596679687492,62.34995117187509],[-92.52797851562494,62.16840820312504],[-93.20537109374993,62.364941406250125],[-92.90551757812503,62.21513671874996],[-93.3330566406249,61.93291015625002],[-93.58178710937494,61.94204101562511],[-93.31201171874997,61.76728515625004],[-93.91274414062497,61.48144531250006],[-94.509375,60.60454101562493],[-94.76171874999991,60.498242187500125],[-94.78828124999998,59.26787109374993],[-94.95732421874996,59.068847656250085],[-94.28706054687493,58.716015625000125],[-94.33222656249998,58.297363281250114],[-94.12319335937494,58.73671875000008],[-93.1787597656249,58.72563476562496],[-92.43281249999993,57.3203125],[-92.7981445312499,56.921972656250034],[-90.89746093750003,57.25693359375006],[-88.94848632812489,56.85131835937503],[-88.07509765624997,56.46728515624994],[-87.48242187499991,56.021289062500045],[-85.55932617187491,55.54018554687508],[-85.21801757812491,55.348974609375034],[-85.3652832031249,55.07929687499998],[-85.06093749999997,55.285644531250085],[-83.91059570312493,55.314648437499955],[-82.39326171874998,55.067822265625125],[-82.219384765625,54.8134765625],[-82.42416992187486,54.2445800781251],[-82.14145507812492,53.81762695312497],[-82.29155273437496,53.03071289062507],[-81.5994140624999,52.432617187500085],[-81.82788085937489,52.22421875000009],[-81.46621093749994,52.204492187500136],[-80.588037109375,51.667236328125114],[-80.4433105468749,51.38857421875002],[-80.85122070312497,51.125],[-80.47832031249993,51.30732421874998],[-80.10356445312487,51.282861328125136],[-79.34790039062494,50.76264648437504],[-79.737451171875,51.186279296875],[-79.33867187500002,51.62817382812497],[-79.04052734375003,51.46376953125005],[-78.90317382812495,51.200292968750034],[-78.73134765624994,51.497460937499994],[-78.98164062499993,51.774560546875136],[-78.44809570312495,52.26137695312502],[-78.74414062499994,52.65537109374998],[-79.10034179687497,53.65664062500005],[-78.99604492187493,54.00249023437499],[-79.241796875,54.098876953125085],[-79.14672851562491,54.16923828125002],[-79.71235351562495,54.6718261718751],[-77.77529296874994,55.291259765625],[-76.60405273437496,56.19956054687495],[-76.52558593749998,56.8917968750001],[-76.80981445312497,57.65795898437506],[-77.15678710937496,58.018896484375034],[-78.51508789062493,58.68237304687503],[-77.76069335937498,59.38002929687505],[-77.72617187499995,59.67587890624992],[-77.34907226562495,59.57895507812509],[-77.48530273437493,59.684570312500114],[-77.28920898437494,60.0220214843751],[-77.58588867187498,60.088183593750074],[-77.45288085937497,60.1458007812501],[-77.6814453124999,60.427099609375034],[-77.503564453125,60.54272460937497],[-77.7908203124999,60.63984375000004],[-77.58955078124993,60.808593750000114],[-78.18134765624995,60.81914062499996],[-77.51435546874998,61.55629882812505],[-78.02138671874997,61.8320800781251],[-78.13339843749986,62.28227539062496],[-77.372412109375,62.572509765625114],[-75.81689453124991,62.31586914062507],[-75.7898437499999,62.17958984375002],[-75.3412109375,62.312109375],[-74.63256835937497,62.115673828125125],[-74.6458007812499,62.21113281250004],[-73.70507812499991,62.47314453124994],[-72.68696289062498,62.12456054687499],[-72.771630859375,61.840429687500006],[-72.50556640624998,61.922656250000074],[-72.22612304687487,61.83159179687499],[-72.04003906249991,61.68027343750006],[-72.21586914062502,61.58725585937495],[-71.86611328125,61.68852539062499],[-71.63828124999995,61.6171875],[-71.85439453124991,61.43979492187492],[-71.42270507812489,61.158935546875085],[-70.27929687499991,61.06865234374999],[-69.99243164062491,60.8564941406251],[-69.50332031249994,61.04042968750011],[-69.40473632812493,60.84677734375009],[-69.75947265624998,60.440234375000045],[-69.67373046874994,60.07587890625007],[-70.65483398437496,60.02622070312506],[-69.73393554687493,59.918017578125045],[-69.68188476562489,59.34174804687507],[-69.3440429687499,59.303076171875006],[-69.53164062499994,58.86923828125009],[-69.64838867187493,58.82080078125],[-69.78417968749994,58.95571289062511],[-70.15434570312496,58.76059570312498],[-69.78989257812486,58.689306640625034],[-69.27109374999986,58.88393554687505],[-68.69819335937495,58.904541015625],[-68.38115234374993,58.74350585937506],[-68.22939453124994,58.48457031250007],[-68.35654296874989,58.163232421875136],[-69.04082031249996,57.902490234375136],[-68.41357421874997,58.0517578125],[-68.02104492187493,58.48530273437504],[-67.88828124999989,58.29575195312495],[-68.06386718750005,58.13896484374999],[-67.75595703124992,58.4045898437501],[-67.6782714843749,57.99111328125008],[-67.5696289062499,58.21347656250006],[-66.72216796874991,58.49101562499996],[-66.36240234374989,58.791162109374994],[-66.0023925781249,58.43120117187502],[-66.04306640624995,58.82065429687495],[-65.72099609374996,59.02377929687495],[-65.38354492187494,59.06020507812508],[-65.7,59.21333007812501],[-65.4117187499999,59.31499023437496],[-65.47509765624994,59.47031249999998],[-65.03823242187494,59.38789062500007],[-65.40742187499993,59.53935546875002],[-65.4333984374999,59.776513671874994],[-65.02817382812495,59.77070312500007],[-65.17172851562489,59.90800781249996],[-64.81733398437498,60.3310546875],[-64.49941406250005,60.26826171875001],[-64.41958007812494,60.17138671874997],[-64.76845703124997,60.01210937500005],[-64.28349609374993,60.06406249999998],[-64.22631835937491,59.741210937500085],[-64.05605468750005,59.82255859374996],[-63.7501953124999,59.51259765625005],[-63.945458984374994,59.380175781250074],[-63.775878906249915,59.277148437500045],[-63.539892578124864,59.332861328125034],[-63.41513671874995,59.194384765625074],[-63.97114257812498,59.053808593750034],[-63.24843749999991,59.068310546874955],[-63.28212890624994,58.86738281250007],[-63.05029296874997,58.87817382812494],[-62.87387695312489,58.67246093749998],[-63.537060546874926,58.329931640625006],[-63.209960937499886,58.46694335937502],[-62.593847656249864,58.47402343750005],[-62.81206054687502,58.20039062500007],[-63.26152343749993,58.014697265625074],[-62.486230468749966,58.15405273437506],[-62.30566406249997,57.97226562499995],[-61.95864257812505,57.91176757812508],[-61.9679687499999,57.61191406250009],[-62.495556640624926,57.489208984375125],[-61.92114257812497,57.42080078125005],[-61.977441406249966,57.24794921875002],[-61.33374023437494,57.01059570312498],[-61.37163085937502,56.68081054687511],[-62.497265624999926,56.80170898437504],[-61.73774414062498,56.52602539062502],[-61.940429687499886,56.423583984375114],[-61.42529296874994,56.360644531250074],[-61.713085937499955,56.230957031250114],[-61.364697265624926,56.2160156250001],[-61.30112304687495,56.04716796874999],[-61.4495117187499,55.99570312499998],[-61.08935546874997,55.86635742187511],[-60.74326171874989,55.94145507812493],[-60.56210937499995,55.727001953125125],[-60.341015624999926,55.78466796874997],[-60.40830078124995,55.649560546874994],[-60.19238281249994,55.4809082031251],[-60.617138671874955,55.060205078124994],[-59.75878906249997,55.3095703125],[-59.68906249999989,55.19633789062502],[-59.43789062500005,55.175927734375136],[-59.837792968749994,54.813964843750114],[-59.25957031249996,55.19995117187506],[-58.99711914062496,55.149462890625074],[-58.780175781249994,54.838378906250114],[-58.39814453124998,54.77412109374998],[-57.96245117187493,54.875732421875085],[-57.40449218750004,54.59086914062496],[-57.69926757812496,54.38657226562506],[-58.435205078124966,54.228125],[-58.63320312499999,54.04956054687497],[-59.8230468749999,53.83442382812504],[-60.14492187499994,53.59614257812498],[-60.395410156249994,53.653320312500085],[-60.1002929687499,53.48696289062511],[-60.329492187499966,53.26611328125006],[-58.652050781249926,53.97788085937495],[-57.935986328124955,54.09116210937492],[-58.31748046874989,54.11445312500007],[-58.192089843749926,54.228173828125136],[-57.4160644531249,54.162744140625136],[-57.134960937499926,53.79184570312506],[-57.524072265624966,53.61142578125006],[-57.331738281249955,53.469091796875034],[-56.84086914062496,53.73945312500004],[-56.46499023437505,53.76503906250011],[-55.96611328125002,53.4711425781251],[-55.79794921874995,53.211962890625045],[-55.80283203124989,52.64316406249998],[-56.324902343749926,52.54453124999998],[-55.74648437499994,52.4745605468751],[-55.7771484374999,52.3642578125],[-56.01171874999997,52.394482421875125],[-55.695214843749994,52.13779296875006],[-56.97597656250005,51.45766601562505],[-58.510351562500006,51.295068359375136],[-59.88632812499992,50.316406250000085],[-61.72485351562503,50.10405273437499],[-61.91953124999989,50.2328613281251],[-62.71542968749995,50.30166015625008],[-66.49550781249991,50.2118652343751],[-66.94116210937503,49.993701171875045],[-67.37202148437495,49.348437500000045],[-68.28193359374998,49.197167968750136],[-69.67387695312496,48.19916992187504],[-71.01826171874993,48.455615234375045],[-69.86552734374993,48.17226562500005],[-69.775,48.09809570312504],[-69.9944335937499,47.73989257812508],[-70.70585937499996,47.13979492187505],[-71.26777343749995,46.79594726562499],[-71.87958984374998,46.68681640624996],[-72.98100585937493,46.209716796875085],[-73.4766113281249,45.738232421874955],[-74.03784179687494,45.501855468750136],[-74.31508789062494,45.531054687500045],[-73.97382812499995,45.345117187499994],[-74.70888671874997,45.0038574218751]]],[[[-96.78232421874998,72.93662109375],[-97.0927734375,72.99692382812503],[-96.86240234374995,73.18881835937506],[-96.78232421874998,72.93662109375]]],[[[-114.52153320312502,72.592919921875],[-113.57807617187501,72.65209960937506],[-113.2923828125,72.94980468750003],[-112.75361328125001,72.98603515624995],[-111.26972656249994,72.71372070312498],[-111.895166015625,72.35610351562497],[-111.67509765625002,72.30014648437503],[-110.20512695312495,72.66127929687497],[-110.66083984374998,73.00820312500002],[-110.00844726562494,72.983642578125],[-108.75498046875002,72.55107421874999],[-108.18823242187501,71.72377929687502],[-107.812841796875,71.62617187500004],[-107.30600585937496,71.89467773437502],[-108.23740234374999,73.14990234375003],[-108.029052734375,73.34873046875003],[-106.48212890624998,73.19619140624997],[-105.41513671874995,72.788330078125],[-104.38593749999997,71.57695312500005],[-104.51479492187502,71.06425781250005],[-103.58457031249995,70.63085937500003],[-103.07719726562497,70.50883789062505],[-103.04956054687503,70.65507812499999],[-101.67631835937495,70.27827148437495],[-101.56240234375001,70.135009765625],[-101.04267578125,70.11079101562504],[-100.98237304687497,69.67988281250001],[-101.483837890625,69.85019531250006],[-101.64765624999997,69.69853515625007],[-102.18212890624997,69.845947265625],[-102.59589843749997,69.71791992187502],[-102.62109374999996,69.55151367187506],[-103.464892578125,69.64448242187498],[-103.04892578124999,69.47177734375006],[-103.12021484374995,69.20458984374997],[-102.44677734374997,69.476318359375],[-102.04594726562493,69.46484374999997],[-101.85712890625001,69.02397460937505],[-102.89506835937499,68.8236328125],[-104.57143554687501,68.87211914062502],[-105.105859375,68.92041015625],[-105.019580078125,69.08125],[-106.27016601562497,69.19458007812497],[-106.65908203124997,69.439599609375],[-107.43989257812497,69.00214843749995],[-108.36499023437497,68.93476562499998],[-109.47211914062501,68.67670898437498],[-113.12773437500002,68.49414062500003],[-113.61684570312501,68.8384765625],[-113.69414062499995,69.19501953124998],[-115.61811523437495,69.28295898437506],[-116.51347656249993,69.42460937500005],[-117.19541015624995,70.05405273437503],[-114.59233398437497,70.31245117187498],[-112.63789062499997,70.225244140625],[-111.63256835937497,70.30883789062497],[-113.75727539062503,70.69072265625005],[-115.99091796874997,70.586279296875],[-117.58706054687498,70.62954101562502],[-118.2640625,70.888330078125],[-118.26909179687493,71.03471679687505],[-115.30341796874997,71.49370117187505],[-117.93564453125003,71.39208984375003],[-118.22646484374995,71.46708984375005],[-117.742333984375,71.65932617187502],[-118.58300781250003,71.64902343749998],[-118.98769531249997,71.7642578125],[-118.94462890624997,71.98554687499995],[-118.21347656249998,72.26289062499998],[-118.481298828125,72.42768554687498],[-118.13310546874995,72.63281250000003],[-114.63823242187499,73.37265625000003],[-114.20639648437495,73.29780273437495],[-114.05170898437497,73.07099609375004],[-114.52153320312502,72.592919921875]]],[[[-105.28891601562499,72.919921875],[-106.92153320312497,73.479833984375],[-106.61396484375001,73.69560546875002],[-105.31796874999995,73.76713867187502],[-104.5875,73.57807617187495],[-104.62172851562495,73.3111328125],[-105.28891601562499,72.919921875]]],[[[-79.53730468749998,73.65449218749998],[-78.2865234375,73.66582031250007],[-77.20654296874997,73.49956054687505],[-76.18339843749999,72.84306640625005],[-77.83593750000003,72.89682617187498],[-79.3193359375,72.75771484375],[-79.820703125,72.82631835937502],[-80.18330078124995,73.22465820312499],[-80.77641601562502,73.33417968750001],[-80.84887695312503,73.72124023437499],[-79.53730468749998,73.65449218749998]]],[[[-86.58935546874997,71.01079101562507],[-85.64384765624999,71.15244140624998],[-85.09487304687497,71.15195312500006],[-84.82373046874997,71.02861328125005],[-84.69941406249995,71.63144531250003],[-85.33906249999998,71.69726562500003],[-85.91162109375,71.98652343749998],[-85.321875,72.23315429687506],[-84.28374023437499,72.04448242187499],[-84.84199218749995,72.30815429687505],[-84.62304687500003,72.37656250000003],[-85.34111328124993,72.42153320312497],[-85.64990234374997,72.72216796875003],[-85.26210937500002,72.95400390625],[-84.25664062499999,72.79672851562503],[-85.454736328125,73.10546875000003],[-84.41606445312496,73.45649414062495],[-83.781884765625,73.41689453125],[-83.72983398437495,73.57587890624995],[-81.946142578125,73.72983398437506],[-81.40615234374997,73.634521484375],[-80.27724609375,72.77016601562502],[-81.229345703125,72.31171874999998],[-80.61147460937497,72.450830078125],[-80.925146484375,71.90766601562501],[-80.18193359374996,72.20878906250007],[-79.884375,72.17719726562501],[-80.10893554687499,72.33217773437497],[-79.83129882812503,72.44628906250003],[-79.000244140625,72.27202148437507],[-79.00781250000003,72.04291992187501],[-78.58510742187497,71.880615234375],[-78.86274414062495,72.100830078125],[-78.69926757812496,72.35141601562498],[-77.51650390624997,72.17778320312505],[-78.48427734374994,72.47060546875002],[-77.75322265624996,72.72475585937502],[-75.70429687499998,72.57153320312497],[-75.05268554687493,72.22636718749999],[-75.92280273437501,71.71723632812501],[-74.90317382812503,72.10048828125002],[-74.20932617187498,71.978662109375],[-74.31572265624999,71.84267578125],[-75.20478515625001,71.70913085937497],[-74.70078125,71.67558593750005],[-74.99619140624998,71.21811523437503],[-74.48808593750002,71.64838867187501],[-73.8140625,71.77143554687495],[-74.197265625,71.404150390625],[-73.71284179687498,71.58759765624998],[-73.18061523437501,71.282861328125],[-73.27822265625,71.53798828125],[-72.901953125,71.67778320312507],[-71.64067382812499,71.51625976562502],[-71.22939453124997,71.33876953125],[-71.49501953124997,71.10512695312502],[-71.93793945312498,71.09428710937502],[-72.63271484374994,70.83076171874998],[-71.74252929687495,71.046875],[-71.370849609375,70.97514648437499],[-70.82607421874994,71.10874023437503],[-70.67265625,71.05219726562498],[-70.76171874999997,70.79223632812503],[-71.89018554687502,70.43154296875002],[-71.27587890625,70.50029296874999],[-71.42944335937503,70.12778320312503],[-70.97978515624999,70.5810546875],[-69.94980468750003,70.84501953125005],[-68.49575195312502,70.61025390625],[-68.363525390625,70.48125],[-70.05771484375,70.042626953125],[-68.77822265625,70.20356445312501],[-69.00830078124997,69.97895507812501],[-68.74404296874997,69.94140625],[-68.05908203124997,70.317236328125],[-67.36367187499994,70.03442382812503],[-67.22163085937495,69.73071289062506],[-68.02041015625,69.77006835937499],[-69.25078124999999,69.51191406249998],[-68.51303710937498,69.57729492187497],[-67.236962890625,69.460107421875],[-66.71674804687495,69.31186523437498],[-66.70742187500002,69.16821289062503],[-68.40629882812499,69.23222656250002],[-69.040625,69.09799804687503],[-68.41552734375,69.17207031250001],[-67.8326171875,69.06596679687499],[-67.88320312500002,68.78398437499999],[-69.31909179687497,68.85698242187505],[-68.21040039062495,68.702978515625],[-67.9384765625,68.524169921875],[-66.74272460937502,68.45776367187497],[-67.032958984375,68.32607421874997],[-66.923095703125,68.06572265625005],[-66.72900390624997,68.12900390625006],[-66.66269531249995,68.03442382812497],[-66.63095703124998,68.21064453124998],[-66.21240234374997,68.280419921875],[-66.44394531249998,67.83383789062506],[-65.94238281250003,68.07094726562505],[-65.86435546875003,67.92285156249997],[-65.50908203124996,67.96826171875],[-65.40126953125002,67.67485351562499],[-65.41533203124996,67.87924804687498],[-64.92231445312495,68.03164062500002],[-65.02109375,67.78754882812495],[-64.63779296875,67.84023437500002],[-63.850195312500034,67.56606445312502],[-64.00795898437502,67.34731445312497],[-64.69995117187494,67.35053710937501],[-63.83623046874993,67.26411132812498],[-63.59160156250002,67.3775390625],[-63.040136718750034,67.235009765625],[-63.70156249999994,66.82236328125003],[-62.962304687499966,66.94926757812505],[-62.37973632812495,66.90537109375],[-62.12358398437499,67.046728515625],[-61.35341796874994,66.689208984375],[-61.52783203124994,66.55810546875003],[-62.12333984374993,66.64306640625003],[-61.57080078125,66.37290039062506],[-61.95634765624993,66.30932617187497],[-62.553125,66.40683593750003],[-62.53359374999994,66.22700195312498],[-61.99160156250002,66.03530273437502],[-62.624121093750006,66.01625976562505],[-62.381982421874966,65.83330078124999],[-62.65888671874998,65.63994140625002],[-63.16894531249997,65.65732421875],[-63.45874023437494,65.85302734375],[-63.42089843749997,65.70859374999998],[-63.651074218749955,65.66098632812506],[-63.33745117187493,65.61674804687502],[-63.36337890624998,65.22973632812503],[-63.606591796874966,64.92807617187503],[-64.345703125,65.17241210937499],[-64.26967773437497,65.40078124999997],[-64.55507812500002,65.1166015625],[-65.401611328125,65.764013671875],[-64.44536132812496,66.31713867187497],[-65.0044921875,66.07773437500003],[-65.82573242187499,65.996923828125],[-65.65634765625003,66.204736328125],[-66.06372070312497,66.13271484374997],[-66.986328125,66.62749023437505],[-67.07685546874995,66.52548828125006],[-67.30732421874993,66.5697265625],[-67.22539062499993,66.31025390624998],[-67.88339843749995,66.46743164062502],[-67.18320312499995,66.03442382812503],[-67.350439453125,65.92973632812502],[-67.82802734374997,65.96518554687503],[-68.45991210937498,66.249267578125],[-68.74892578125,66.200048828125],[-68.21718750000002,66.078857421875],[-68.18671874999993,65.87099609375002],[-67.86645507812497,65.773681640625],[-67.936767578125,65.56489257812501],[-67.56962890624999,65.64355468749997],[-67.11796874999999,65.44038085937495],[-67.3365234375,65.34658203125005],[-66.69741210937502,64.81518554687506],[-66.63549804687503,65.00034179687503],[-66.21464843749999,64.72241210937497],[-65.93852539062496,64.88574218750003],[-65.2748046875,64.63154296875004],[-65.52934570312499,64.50478515624997],[-65.074609375,64.43666992187502],[-65.21298828125003,64.30327148437502],[-65.580322265625,64.29384765624997],[-65.16987304687495,64.02817382812503],[-64.67846679687503,64.027978515625],[-64.79814453124999,63.91596679687498],[-64.4109375,63.70634765625002],[-64.66464843749995,63.24536132812497],[-65.19184570312498,63.764257812500006],[-65.06894531249998,63.26347656250002],[-64.67236328125003,62.921972656250006],[-65.16279296875001,62.93261718750003],[-65.10849609374998,62.62646484375],[-66.22402343749994,63.10717773437497],[-66.228662109375,62.99096679687503],[-66.41445312500002,63.027197265625034],[-66.65498046874998,63.264746093750006],[-66.69746093749993,63.069531249999955],[-67.89326171874993,63.733740234375006],[-67.72255859374997,63.422753906249966],[-68.49375,63.725488281249994],[-68.91108398437498,63.703222656250006],[-68.141259765625,63.17231445312501],[-67.67597656249998,63.093554687500045],[-67.73696289062497,63.00957031249999],[-65.98017578125001,62.20888671875002],[-66.12387695312498,61.89306640625],[-68.53588867187503,62.25561523437506],[-69.12558593749998,62.423974609374966],[-69.604736328125,62.76772460937502],[-70.23613281250002,62.76337890625001],[-70.801416015625,62.91049804687506],[-71.10576171874999,63.00224609375002],[-70.94604492187497,63.12070312499998],[-71.34726562499998,63.066113281249955],[-71.99223632812493,63.41616210937505],[-71.380859375,63.580322265625],[-72.29013671874995,63.72797851562498],[-72.17426757812498,63.893408203125006],[-72.49843749999994,63.82348632812497],[-73.45454101562495,64.39926757812503],[-73.27128906250002,64.58251953125],[-73.91035156249998,64.578125],[-74.064794921875,64.42465820312498],[-74.13046874999998,64.6078125],[-74.46123046874996,64.64467773437505],[-74.68139648437497,64.8306640625],[-74.91943359374997,64.76552734374997],[-74.69472656250002,64.49658203124997],[-75.71503906249995,64.52436523437495],[-75.76669921875,64.39194335937498],[-76.85615234374998,64.23764648437498],[-77.76049804687503,64.36015624999999],[-78.04521484374993,64.499267578125],[-78.09560546875,64.93925781250002],[-77.36088867187496,65.19653320312503],[-77.32670898437493,65.453125],[-75.82832031249993,65.22705078125003],[-75.45209960937495,64.84160156250002],[-75.35712890624995,65.00874023437495],[-75.79868164062503,65.297509765625],[-75.16630859374999,65.28393554687497],[-74.13847656250002,65.50346679687502],[-73.55078125000003,65.48525390625005],[-74.41640624999997,66.16708984375003],[-73.03325195312502,66.72817382812505],[-72.78881835937494,67.030615234375],[-72.22001953124999,67.25429687500002],[-73.28447265624993,68.35698242187505],[-73.82050781249998,68.36293945312502],[-73.82211914062495,68.68598632812501],[-74.11796875000002,68.70092773437506],[-73.9892578125,68.54863281250002],[-74.2701171875,68.54121093750001],[-74.89296875,68.80815429687505],[-74.71669921874997,69.04550781249998],[-76.58505859375,68.69873046875003],[-76.55722656250003,69.00947265625001],[-75.9537109375,69.03081054687502],[-75.64775390625002,69.212548828125],[-76.46494140624995,69.46943359375001],[-76.23408203125001,69.66210937500003],[-76.742333984375,69.57290039062497],[-77.08994140625,69.63510742187503],[-76.85859374999995,69.775390625],[-77.591650390625,69.84560546875002],[-77.77402343750003,70.23852539062503],[-78.28281250000003,70.229150390625],[-79.06640624999997,70.60356445312507],[-79.40522460937498,70.40073242187503],[-78.86284179687499,70.24189453125001],[-78.88964843750003,69.97749023437495],[-79.51542968749996,69.88759765625005],[-81.65195312500003,70.09462890625002],[-80.92172851562503,69.73090820312501],[-81.56469726562503,69.94272460937498],[-82.29384765624997,69.83691406250003],[-83.14995117187493,70.00908203125002],[-83.85908203124998,69.96274414062498],[-85.43237304687497,70.11137695312507],[-85.780029296875,70.03666992187505],[-86.32202148437503,70.14541015625],[-86.396875,70.46533203124997],[-87.838134765625,70.24658203125],[-88.78271484374997,70.49448242187503],[-89.45590820312498,71.06171874999995],[-87.84492187499995,70.94438476562505],[-87.14008789062498,71.01162109374997],[-89.80537109374993,71.46230468750005],[-89.86152343750001,72.41191406250005],[-88.70517578124998,73.40327148437495],[-87.71977539062496,73.72290039062497],[-85.95078124999998,73.85014648437505],[-84.94677734375,73.72163085937498],[-86.00053710937499,73.31254882812505],[-86.65629882812502,72.72402343750005],[-86.21845703124998,71.89912109375004],[-85.02338867187495,71.35322265625001],[-86.58935546874997,71.01079101562507]]],[[[-100.00190429687497,73.9458984375],[-99.15795898437499,73.73159179687497],[-97.66997070312499,73.88774414062499],[-97.1705078125,73.82485351562497],[-97.001708984375,73.66650390625003],[-97.62587890624997,73.50229492187498],[-97.27250976562502,73.38681640624998],[-98.42177734375002,72.94101562500003],[-97.63632812499998,73.02763671874999],[-97.128125,72.62758789062502],[-96.59208984374996,72.71025390624999],[-96.44560546874996,72.55244140624998],[-96.80146484374998,72.32241210937502],[-96.61342773437494,71.83383789062506],[-97.58227539062497,71.62968750000005],[-98.18134765624998,71.66245117187503],[-98.32270507812501,71.85234375000002],[-98.19863281249994,71.44086914062501],[-98.66289062499993,71.302099609375],[-99.22363281249996,71.387109375],[-100.594482421875,72.15234375000003],[-101.20854492187495,72.31699218749998],[-101.72392578124996,72.31489257812501],[-102.70874023437496,72.76450195312503],[-102.20400390624998,73.077294921875],[-101.27319335937497,72.7216796875],[-100.48476562500002,72.77294921874997],[-100.395703125,72.97700195312498],[-100.128125,72.90668945312495],[-100.53637695312497,73.19785156250003],[-99.82514648437503,73.2138671875],[-100.36611328125001,73.359033203125],[-100.88935546875003,73.27534179687501],[-101.52319335937501,73.48637695312502],[-100.97578124999995,73.59975585937502],[-100.5216796875,73.44931640625],[-100.96298828125002,73.79140625],[-99.99111328125,73.79516601562503],[-100.00190429687497,73.9458984375]]],[[[-98.270361328125,73.86850585937498],[-98.97392578124997,73.81206054687502],[-99.4169921875,73.89541015625002],[-97.69824218749997,74.10869140625005],[-98.270361328125,73.86850585937498]]],[[[-93.17084960937498,74.16098632812506],[-92.22270507812502,73.97236328124998],[-90.62744140625,73.95170898437505],[-90.38139648437496,73.82475585937502],[-92.11791992187497,72.75380859375],[-94.21132812499997,72.75693359375],[-93.77055664062496,72.66821289062506],[-93.55517578124994,72.42114257812497],[-94.03754882812498,72.02875976562498],[-95.00786132812496,72.01279296875],[-95.60214843749998,72.88447265624995],[-95.63291015625003,73.69545898437497],[-94.697607421875,73.66357421874997],[-95.134130859375,73.88125],[-94.97353515625,74.04140625000002],[-93.17084960937498,74.16098632812506]]],[[[-119.73632812499997,74.11264648437498],[-119.20595703125002,74.19799804687503],[-119.11796874999995,74.01552734375],[-118.54399414062499,74.24462890625003],[-117.51484375000001,74.23173828124999],[-115.51069335937501,73.61875],[-115.446875,73.43886718750002],[-118.96157226562497,72.68413085937499],[-119.51284179687501,72.30268554687501],[-120.17988281250001,72.21264648437506],[-120.61933593750001,71.50576171875002],[-121.47216796875003,71.38901367187503],[-121.74936523437502,71.44477539062501],[-123.09565429687503,71.09379882812502],[-124.00776367187494,71.67744140624998],[-125.29667968749999,71.973046875],[-125.84531250000002,71.978662109375],[-123.79726562499997,73.76816406250003],[-124.69624023437497,74.34819335937499],[-121.50415039062497,74.54511718749998],[-119.56264648437494,74.23281250000002],[-119.73632812499997,74.11264648437498]]],[[[-97.35551757812496,74.52631835937495],[-97.75,74.51054687500005],[-97.41650390624994,74.62656250000003],[-97.35551757812496,74.52631835937495]]],[[[-95.306640625,74.50541992187505],[-95.850732421875,74.58247070312504],[-95.51020507812498,74.63676757812499],[-95.306640625,74.50541992187505]]],[[[-104.11992187499995,75.03632812500004],[-104.88740234374998,75.14775390624999],[-104.34619140624996,75.42993164062503],[-103.64350585937497,75.18657226562499],[-104.11992187499995,75.03632812500004]]],[[[-93.54257812499995,75.0279296875],[-93.57309570312495,74.66884765625005],[-94.53452148437498,74.63671874999997],[-96.59960937499997,75.03178710937499],[-95.95463867187493,75.44379882812501],[-94.878173828125,75.63002929687502],[-93.90908203125002,75.42250976562502],[-93.54257812499995,75.0279296875]]],[[[-96.07856445312495,75.510107421875],[-96.91513671875003,75.37968749999999],[-96.98281249999997,75.50981445312505],[-96.367822265625,75.65463867187506],[-96.07856445312495,75.510107421875]]],[[[-94.52656249999995,75.74931640624999],[-94.901220703125,75.93076171875],[-94.53789062499996,75.99643554687506],[-94.52656249999995,75.74931640624999]]],[[[-118.328125,75.57968749999998],[-118.81713867187503,75.52211914062497],[-119.39458007812499,75.617333984375],[-117.63369140624998,76.11508789062498],[-118.328125,75.57968749999998]]],[[[-79.0630859375,75.92587890624998],[-79.63876953124995,75.84291992187505],[-79.00932617187499,76.14589843750005],[-79.0630859375,75.92587890624998]]],[[[-102.22734374999995,76.014892578125],[-102.00800781250003,75.93940429687498],[-102.57958984375003,75.78022460937498],[-103.31474609374996,75.76420898437499],[-103.04150390624999,75.91884765624997],[-103.98525390624997,75.93310546875003],[-103.80078124999994,76.03701171874997],[-104.24248046874996,76.04697265625006],[-104.35063476562497,76.18232421875001],[-102.72802734374999,76.30703125],[-102.22734374999995,76.014892578125]]],[[[-104.02285156249998,76.58310546875003],[-103.05131835937495,76.44985351562497],[-103.31137695312499,76.34755859375],[-104.35751953124995,76.33461914062502],[-104.58569335937499,76.60649414062499],[-104.07451171875003,76.66611328124998],[-104.02285156249998,76.58310546875003]]],[[[-97.70092773437497,76.46650390624998],[-97.89052734374997,75.7603515625],[-97.40751953124999,75.67250976562497],[-97.33603515624998,75.41982421875],[-97.65332031249997,75.50776367187498],[-97.87822265624996,75.41611328125003],[-97.67431640624997,75.127294921875],[-98.04531249999997,75.20083007812497],[-98.12094726562503,75.03271484375],[-100.234375,75.00771484374997],[-100.48349609374995,75.18842773437501],[-100.14570312499995,75.24614257812505],[-100.71191406250003,75.40634765625],[-99.19458007812499,75.698388671875],[-102.58740234375001,75.51367187500003],[-102.79750976562501,75.59965820312505],[-102.14472656249998,75.87504882812502],[-100.97280273437498,75.79843750000003],[-101.414990234375,75.84584960937502],[-101.87211914062496,76.08310546875003],[-101.52895507812495,76.21728515625003],[-102.1046875,76.33120117187505],[-101.41518554687495,76.42490234375003],[-99.86547851562499,75.92421875],[-100.11284179687502,76.11723632812507],[-99.54106445312497,76.14628906250005],[-100.41420898437495,76.242529296875],[-99.97773437500003,76.31245117187495],[-100.82973632812497,76.52387695312495],[-99.8140625,76.6322265625],[-98.89033203125,76.46557617187497],[-98.71083984374994,76.69384765625003],[-97.70092773437497,76.46650390624998]]],[[[-101.22612304687497,76.57934570312497],[-101.61308593749995,76.60458984375006],[-100.26914062499998,76.73413085937497],[-101.22612304687497,76.57934570312497]]],[[[-108.29238281250001,76.05712890625],[-107.72348632812502,75.99541015625002],[-108.020703125,75.80478515625],[-107.21621093749997,75.89155273437501],[-106.91352539062503,75.67963867187501],[-106.67700195312499,76.02373046875002],[-105.63266601562493,75.94536132812505],[-105.51948242187497,75.63237304687505],[-106.09262695312495,75.08945312500003],[-107.15341796874996,74.9271484375],[-108.47475585937495,74.94721679687501],[-108.83129882812501,75.06489257812498],[-112.51933593749997,74.41684570312503],[-113.67158203124997,74.45302734375005],[-114.31269531250003,74.71508789062506],[-112.835986328125,74.9755859375],[-111.67109375,75.01943359374997],[-111.09345703125001,75.25629882812498],[-113.71176757812499,75.06860351562503],[-113.85332031249996,75.259375],[-113.46708984374996,75.41611328125003],[-114.01650390624998,75.43427734375001],[-114.16845703124994,75.23950195312503],[-114.51381835937497,75.27548828125],[-114.45175781250002,75.08789062499997],[-115.02011718749999,74.97617187500003],[-115.41318359374995,75.11499023437497],[-115.72885742187496,74.968115234375],[-116.47607421874996,75.17177734375],[-117.56523437499997,75.23334960937504],[-117.25761718750002,75.45952148437502],[-116.07714843749996,75.49296874999999],[-115.14184570312501,75.67851562500005],[-116.42563476562498,75.58535156249997],[-117.16362304687496,75.64487304687503],[-116.80214843749995,75.77158203124998],[-114.99150390625002,75.896337890625],[-116.66455078124999,75.95756835937505],[-116.20986328125,76.19443359374998],[-114.77861328124999,76.17260742187497],[-115.82216796874997,76.27001953125003],[-114.99848632812503,76.4974609375],[-114.19394531249999,76.45146484375005],[-113.82348632812501,76.20683593750002],[-112.69760742187496,76.20170898437505],[-111.05268554687495,75.54853515625001],[-108.94716796875,75.54179687499999],[-108.94477539062495,75.69897460937503],[-109.8705078125,75.929052734375],[-109.48681640624999,76.14467773437497],[-110.31445312500001,76.369384765625],[-109.09824218749996,76.811865234375],[-108.46699218749997,76.73759765625007],[-108.29238281250001,76.05712890625]]],[[[-89.72646484374994,76.50742187499998],[-90.55625,76.73457031249998],[-90.13632812499995,76.83696289062505],[-89.69541015625,76.74116210937498],[-89.72646484374994,76.50742187499998]]],[[[-113.56069335937494,76.74326171874998],[-114.83525390624999,76.79467773437497],[-113.89165039062495,76.89487304687503],[-113.56069335937494,76.74326171874998]]],[[[-94.29497070312493,76.91245117187498],[-93.23002929687496,76.77026367187497],[-93.53457031250002,76.44770507812498],[-92.99536132812494,76.62041015624999],[-91.305029296875,76.68076171875003],[-90.54262695312494,76.495751953125],[-91.41508789062496,76.45585937500005],[-89.28452148437498,76.30161132812506],[-89.40659179687498,76.18916015624998],[-91.40732421874998,76.22006835937506],[-89.27758789062497,75.79506835937497],[-89.64604492187499,75.5650390625],[-88.91669921874998,75.45395507812503],[-88.64497070312495,75.65844726562503],[-88.201318359375,75.51201171875005],[-87.72973632812503,75.57563476562495],[-87.53911132812502,75.48486328125003],[-87.25693359374998,75.61772460937499],[-85.95146484374993,75.39501953125],[-85.97299804687498,75.5287109375],[-83.931982421875,75.81894531250003],[-83.23710937499993,75.75083007812503],[-82.153662109375,75.83105468750003],[-80.32197265624998,75.62910156250001],[-79.50908203125002,75.25981445312499],[-80.38198242187494,75.03417968750003],[-79.40141601562502,74.91762695312502],[-79.944482421875,74.83364257812505],[-80.34775390624998,74.90297851562505],[-80.26274414062499,74.58447265625],[-81.94018554687494,74.47270507812505],[-82.73579101562495,74.53027343749997],[-83.5220703125,74.90146484375],[-83.53188476562494,74.58569335937497],[-84.42553710937503,74.50810546875007],[-85.06142578125,74.60693359375003],[-85.133447265625,74.517431640625],[-85.44233398437495,74.6005859375],[-85.80800781249994,74.49897460937498],[-88.42304687499995,74.49414062499997],[-88.53496093749993,74.83173828125001],[-89.55869140624995,74.55473632812507],[-90.55327148437499,74.61274414062498],[-90.88022460937498,74.8177734375],[-91.13457031250002,74.64985351562498],[-91.54912109375002,74.65556640624999],[-92.3892578125,75.263330078125],[-92.18510742187499,75.84653320312498],[-93.09174804687495,76.35400390624997],[-95.27387695312498,76.26440429687503],[-96.03969726562494,76.48671875000002],[-95.65097656249998,76.58466796874998],[-96.88071289062495,76.73833007812505],[-96.40156249999995,76.79721679687503],[-96.75830078124997,76.97177734374998],[-95.84951171875002,77.06621093750005],[-94.29497070312493,76.91245117187498]]],[[[-115.55126953125001,77.36328125],[-116.32919921874996,77.137060546875],[-115.81005859374999,76.939111328125],[-116.25273437500002,76.90141601562505],[-115.94628906250003,76.71127929687503],[-116.99921874999995,76.531591796875],[-117.23359375000001,76.28154296875005],[-117.99296874999999,76.40581054687505],[-117.88081054687497,76.80507812500005],[-118.79140624999994,76.51298828125005],[-119.080712890625,76.12407226562505],[-119.58037109375,76.32651367187498],[-119.52612304687496,75.99721679687505],[-119.91289062499997,75.85883789062501],[-120.40888671874995,75.82563476562498],[-120.84838867187496,76.18266601562499],[-121.21347656249999,75.98369140625005],[-122.53305664062498,75.95092773437503],[-122.59272460937497,76.16206054687495],[-122.90278320312498,76.13471679687498],[-122.51938476562503,76.353173828125],[-121.56113281250003,76.453466796875],[-119.09018554687496,77.30507812500002],[-116.84355468749995,77.33955078124995],[-117.03974609374995,77.46513671875005],[-116.51132812500003,77.54760742187497],[-115.55126953125001,77.36328125]]],[[[-89.83325195312503,77.26762695312505],[-90.22827148437503,77.21245117187499],[-90.99321289062499,77.32949218750002],[-91.01904296875003,77.64389648437503],[-89.83896484375003,77.49140624999998],[-89.83325195312503,77.26762695312505]]],[[[-104.55815429687497,77.14174804687497],[-105.21508789062496,77.18208007812501],[-106.03559570312495,77.73984375000006],[-105.58789062499997,77.73598632812497],[-104.54223632812501,77.33774414062503],[-104.55815429687497,77.14174804687497]]],[[[-95.484375,77.79199218750003],[-93.30097656249995,77.73979492187505],[-93.54394531249997,77.466650390625],[-95.98706054687497,77.484130859375],[-96.19458007812497,77.70053710937503],[-95.484375,77.79199218750003]]],[[[-101.6935546875,77.69658203125005],[-102.37783203124995,77.728125],[-102.44770507812498,77.88061523437506],[-101.19321289062493,77.82978515624998],[-101.00205078124998,77.73510742187497],[-101.6935546875,77.69658203125005]]],[[[-113.83247070312497,77.75463867187506],[-114.28720703124998,77.72148437500005],[-114.98041992187498,77.91542968750002],[-114.33037109374997,78.07753906250002],[-113.83247070312497,77.75463867187506]]],[[[-110.45805664062496,78.10322265625001],[-109.62226562499995,78.07475585937499],[-110.865625,77.834130859375],[-110.15273437500002,77.76293945312506],[-110.19848632812501,77.52451171874998],[-112.37265625000002,77.36411132812498],[-113.16435546875002,77.5302734375],[-113.21518554687498,77.90351562500001],[-110.45805664062496,78.10322265625001]]],[[[-109.81596679687499,78.65039062500003],[-109.48447265624995,78.31640625],[-111.16918945312499,78.38627929687505],[-111.51748046874997,78.27470703125005],[-112.13125,78.366064453125],[-113.22304687499998,78.29790039062505],[-112.85585937499997,78.46684570312502],[-110.877587890625,78.73505859375004],[-109.81596679687499,78.65039062500003]]],[[[-96.20449218749994,78.53129882812499],[-94.91538085937495,78.39052734375002],[-95.32924804687497,78.22504882812495],[-94.93427734374998,78.07563476562498],[-96.98964843749994,77.80600585937503],[-97.65815429687498,78.090625],[-96.944677734375,78.15185546874997],[-98.04951171874995,78.325927734375],[-98.33261718749998,78.77353515625006],[-97.38232421875,78.78291015625001],[-96.20449218749994,78.53129882812499]]],[[[-103.42602539062499,79.315625],[-102.57617187499996,78.87939453125003],[-101.70366210937502,79.07890625000002],[-101.128125,78.80166015625002],[-100.43549804687503,78.8203125],[-99.60942382812495,78.58305664062507],[-99.16640625000002,77.85693359375003],[-100.27465820312503,77.83271484374995],[-101.07412109375001,78.19384765625],[-102.60698242187502,78.24892578125002],[-102.73134765624995,78.37104492187495],[-103.94658203124999,78.26000976562497],[-104.76357421874998,78.35166015625],[-104.90961914062498,78.55263671875],[-103.57050781250003,78.53984375000005],[-104.02084960937502,78.63491210937497],[-103.37158203125,78.73632812500003],[-104.18500976562498,78.78129882812505],[-104.15195312499999,78.989892578125],[-104.89550781249996,78.80815429687502],[-104.74677734375003,79.02709960937503],[-105.53564453124999,79.03251953125007],[-105.51455078124995,79.24248046875002],[-105.38769531249994,79.32358398437503],[-103.42602539062499,79.315625]]],[[[-98.79160156249995,79.98110351562505],[-98.94521484375,79.72407226562498],[-100.05683593749997,79.89824218750005],[-100.05327148437496,80.093359375],[-99.15322265625001,80.12421874999998],[-98.79160156249995,79.98110351562505]]],[[[-91.88554687499999,81.13286132812505],[-90.64301757812498,80.59370117187498],[-89.23559570312494,80.51064453125002],[-88.85732421874997,80.16621093750001],[-88.19990234374998,80.11147460937497],[-88.5248046875,80.41801757812507],[-87.675,80.37211914062505],[-87.92231445312501,80.09770507812499],[-86.97719726562502,79.89423828125001],[-87.29516601562494,79.58017578124998],[-86.33696289062496,79.63496093749995],[-86.00703124999998,79.47944335937498],[-85.6478515625,79.61142578125006],[-85.04213867187497,79.2845703125],[-86.95717773437502,78.97490234375005],[-87.61738281249995,78.67631835937505],[-88.04018554687494,78.99531250000004],[-87.98286132812498,78.53706054687501],[-88.74160156250002,78.58403320312499],[-88.82241210937497,78.18588867187498],[-90.037109375,78.60683593750002],[-89.52568359374999,78.15961914062495],[-90.29721679687495,78.32802734374997],[-90.614404296875,78.14985351562501],[-92.35126953125001,78.312890625],[-92.8482421875,78.46010742187497],[-91.86689453124998,78.54267578125001],[-93.26660156249997,78.60830078124997],[-93.63442382812502,78.75092773437498],[-93.15986328124998,78.77563476562503],[-94.11459960937498,78.92890625000001],[-92.54721679687495,79.28261718750002],[-91.29990234375003,79.372705078125],[-92.82192382812497,79.44990234375001],[-93.93315429687496,79.29072265624998],[-94.11030273437498,79.40156250000001],[-95.10317382812502,79.289892578125],[-95.66289062500002,79.52734374999997],[-94.40185546874997,79.736328125],[-95.73935546874995,79.66015625000003],[-96.58906249999995,79.91665039062497],[-96.77324218749999,80.13579101562502],[-94.64589843749994,80.04873046874997],[-94.26259765625002,80.19487304687499],[-95.40507812499996,80.13500976562506],[-96.39409179687493,80.31503906250003],[-95.549072265625,80.36660156249997],[-95.92695312499998,80.72065429687498],[-93.92792968749995,80.55917968750003],[-95.51474609375003,80.83813476562503],[-94.98051757812499,81.04965820312503],[-93.28671874999998,81.10029296874998],[-94.22011718749997,81.33076171875004],[-93.03466796874997,81.3462890625],[-91.88554687499999,81.13286132812505]]],[[[-69.4888671875,83.01679687499998],[-66.42255859374998,82.92685546875003],[-68.46933593749995,82.65336914062502],[-65.29902343749995,82.79960937500005],[-64.98388671874997,82.90229492187501],[-64.50400390625,82.77841796874998],[-63.641015624999966,82.81259765625003],[-63.246777343749926,82.4501953125],[-62.47519531249995,82.51958007812502],[-61.392480468749994,82.44189453125],[-61.61538085937502,82.18442382812503],[-64.43579101562497,81.74262695312501],[-66.62573242187497,81.61640624999995],[-68.68852539062493,81.29331054687503],[-64.78007812499993,81.49287109375001],[-69.55068359375,80.38325195312498],[-70.71259765625001,80.53959960937505],[-70.264892578125,80.23359374999998],[-72.05595703124996,80.12324218749995],[-70.56840820312493,80.09370117187498],[-71.387841796875,79.76176757812505],[-72.43652343750003,79.69438476562499],[-74.39448242187495,79.87407226562499],[-73.47246093749996,79.7564453125],[-73.36152343750001,79.50400390625],[-75.50341796875,79.41416015625],[-76.898828125,79.5123046875],[-75.60273437499998,79.23955078125005],[-74.48120117187503,79.22949218750006],[-74.64091796874996,79.03554687499997],[-78.58164062499998,79.075],[-77.88276367187498,78.9423828125],[-76.255859375,79.00683593749997],[-74.486328125,78.75009765624998],[-74.87861328124998,78.54482421875],[-76.41611328124995,78.51152343750005],[-75.19345703125,78.327734375],[-75.86596679687497,78.00981445312499],[-78.01259765624997,77.94604492187506],[-78.07617187500003,77.51904296875],[-78.70849609374997,77.34213867187503],[-80.57304687499996,77.31479492187506],[-81.65908203124997,77.52543945312499],[-81.3013671875,77.34404296875007],[-82.056787109375,77.29653320312497],[-81.75634765624997,77.20400390625005],[-79.49726562500001,77.19609375000005],[-78.97919921874998,76.89287109374999],[-78.28886718750002,76.97797851562501],[-77.98330078124994,76.75498046875006],[-78.284326171875,76.57124023437501],[-80.79970703124997,76.173583984375],[-80.97451171874994,76.470068359375],[-81.71738281250003,76.494970703125],[-82.52983398437499,76.723291015625],[-82.23315429687494,76.46582031250003],[-83.88569335937501,76.453125],[-84.22377929687497,76.67534179687499],[-84.27534179687498,76.35654296875006],[-85.141259765625,76.30458984375005],[-86.45371093750003,76.58486328125002],[-86.68022460937499,76.37661132812497],[-87.35419921874998,76.44804687500005],[-87.48979492187499,76.58583984374997],[-87.49755859374997,76.38627929687499],[-88.39599609374997,76.40527343750003],[-88.49584960937497,76.77285156249997],[-88.54580078125002,76.42089843750003],[-89.36962890624997,76.474462890625],[-89.49975585937503,76.82680664062502],[-88.39814453124995,77.10395507812501],[-86.81225585937497,77.18491210937498],[-87.68144531249996,77.43637695312503],[-88.01699218750002,77.78471679687505],[-86.75507812499998,77.86372070312498],[-85.58847656249998,77.46113281250004],[-84.73867187499997,77.36103515624998],[-83.72128906249998,77.41420898437497],[-82.7103515625,77.84951171875002],[-82.5953125,77.99213867187504],[-83.77939453125,77.53261718750002],[-85.28935546874996,77.55903320312498],[-85.54755859374998,77.92768554687495],[-84.61542968749998,78.19570312500002],[-84.22270507812499,78.176025390625],[-84.91035156249993,78.23969726562501],[-84.78320312499997,78.52758789062506],[-85.5859375,78.10957031249998],[-86.21777343750003,78.08120117187497],[-85.92006835937494,78.34287109374998],[-86.91323242187494,78.126806640625],[-87.5517578125,78.17661132812503],[-86.80791015624999,78.77436523437495],[-85.00375976562495,78.912255859375],[-83.27143554687501,78.77031250000002],[-81.75009765624995,78.97578124999995],[-82.43876953125002,78.903662109375],[-84.41201171875002,78.99658203125003],[-84.38359375000002,79.1185546875],[-83.57587890624995,79.05366210937501],[-86.42075195312498,79.84521484374997],[-86.49853515625003,80.25825195312501],[-83.72363281250003,80.22895507812501],[-81.68837890625,79.685791015625],[-80.47592773437498,79.60625],[-80.12446289062495,79.66948242187507],[-81.01015625000002,79.693115234375],[-82.98701171874995,80.32260742187498],[-76.86298828124995,80.86479492187505],[-78.71621093749994,80.95166015624997],[-76.88510742187503,81.43027343750006],[-81.00703125000001,80.6548828125],[-82.88432617187502,80.57753906249997],[-82.22236328124998,80.77231445312503],[-84.41782226562495,80.52675781250002],[-86.250341796875,80.56577148437506],[-86.60307617187499,80.66401367187498],[-85.63930664062494,80.92460937500007],[-83.288818359375,81.14794921875],[-85.780859375,81.03505859375],[-87.32988281250002,80.669775390625],[-88.00366210937497,80.675390625],[-89.16689453125,80.94130859375],[-86.47675781249993,81.03574218750006],[-84.94121093750002,81.28623046875],[-87.27509765624995,81.080810546875],[-89.623046875,81.032470703125],[-89.94731445312499,81.17265625000005],[-89.20869140624998,81.25009765625003],[-89.67368164062503,81.32861328125003],[-87.59702148437498,81.52583007812498],[-88.47905273437502,81.56464843749998],[-90.41630859374996,81.40537109375003],[-89.82167968749997,81.63486328124998],[-91.29238281250002,81.57124023437498],[-91.64755859374998,81.68383789062503],[-88.06318359375001,82.09648437500007],[-87.01821289062502,81.95874023437497],[-86.62680664062495,82.05102539062503],[-85.04482421874997,81.9828125],[-86.615625,82.21855468750007],[-84.89682617187503,82.44941406250001],[-82.63369140625002,82.07729492187497],[-82.53691406250002,82.24726562499995],[-79.465625,81.85112304687499],[-82.44755859374993,82.39501953125003],[-81.68115234375003,82.51865234375],[-82.11684570312497,82.62866210937503],[-80.8625,82.57153320312503],[-81.01015625000002,82.77905273437503],[-78.748779296875,82.67939453124998],[-80.15493164062497,82.91113281250003],[-77.61806640624997,82.89584960937503],[-76.009375,82.53515625],[-75.565625,82.60854492187502],[-77.12490234374994,83.00854492187497],[-74.41416015624995,83.01313476562501],[-72.65869140625,82.72163085937495],[-73.44189453124994,82.90483398437499],[-72.811669921875,83.08120117187502],[-71.98320312499996,83.10141601562498],[-70.94038085937495,82.90224609375],[-71.08481445312498,83.08266601562497],[-69.96992187499995,83.11611328125005],[-69.4888671875,83.01679687499998]]]]},"properties":{"name":"Canada","childNum":110}},{"geometry":{"type":"Polygon","coordinates":[[[9.524023437500006,47.52421875],[9.625878906250023,47.467041015625],[9.527539062500011,47.270751953125],[9.580273437500011,47.057373046875],[10.133496093750011,46.851513671875],[10.349414062500017,46.98476562499999],[10.414941406250023,46.964404296874996],[10.45458984375,46.8994140625],[10.452832031250011,46.86494140625],[10.406054687500017,46.73486328125],[10.39794921875,46.6650390625],[10.4306640625,46.550048828125],[10.195507812500011,46.62109375],[10.1375,46.61435546875],[10.087011718750006,46.599902343749996],[10.061230468750011,46.546777343749994],[10.038281250000011,46.483203125],[10.045605468750011,46.447900390624994],[10.081933593750023,46.420751953125],[10.109667968750017,46.362841796874996],[10.128320312500023,46.238232421875],[10.08056640625,46.227978515625],[10.041015625,46.238085937499996],[9.939257812500017,46.36181640625],[9.884472656250011,46.3677734375],[9.787792968750011,46.346044921875],[9.639453125000017,46.2958984375],[9.57958984375,46.29609375],[9.528710937500023,46.306201171874996],[9.427636718750023,46.482324218749994],[9.399316406250023,46.4806640625],[9.304394531250011,46.495556640625],[9.203417968750017,46.21923828125],[9.003027343750006,46.014892578125],[9.023730468750017,45.845703125],[8.826757812500006,46.06103515625],[8.818554687500011,46.0771484375],[8.458398437500023,46.245898437499996],[8.370703125,46.445117187499996],[8.298535156250011,46.40341796875],[8.23193359375,46.341210937499994],[8.08154296875,46.256005859374994],[7.9931640625,46.015917968749996],[7.327929687500017,45.912353515625],[7.129003906250006,45.880419921874996],[7.055761718750006,45.90380859375],[7.02109375,45.92578125],[6.953710937500006,46.017138671874996],[6.897265625000017,46.0517578125],[6.772070312500006,46.16513671875],[6.758105468750017,46.415771484375],[6.578222656250006,46.437353515625],[6.428906250000011,46.430517578125],[6.321875,46.393701171874994],[6.234667968750017,46.3326171875],[6.199414062500011,46.19306640625],[6.086621093750011,46.147021484374996],[6.006640625000017,46.142333984375],[5.971484375000017,46.151220703125],[5.970019531250017,46.214697265625],[6.0361328125,46.238085937499996],[6.095898437500011,46.27939453125],[6.129687500000017,46.5669921875],[6.41015625,46.755419921874996],[6.429003906250017,46.832275390625],[6.45625,46.94833984375],[6.624804687500017,47.004345703125],[6.666894531250023,47.026513671874994],[6.688085937500006,47.058251953124994],[6.820703125000023,47.16318359375],[6.952050781250023,47.2671875],[6.978515625,47.302050781249996],[7.000585937500006,47.322509765625],[7.000585937500006,47.339453125],[6.900390625,47.39423828125],[6.968359375,47.45322265625],[7.136035156250017,47.48984375],[7.343164062500023,47.43310546875],[7.615625,47.592724609375],[8.454003906250023,47.59619140625],[8.559472656250023,47.6240234375],[8.570507812500011,47.63779296875],[8.567089843750011,47.651904296874996],[8.55234375,47.659130859375],[8.451757812500006,47.651806640625],[8.413281250000011,47.6626953125],[8.403417968750006,47.687792968749996],[8.435742187500011,47.731347656249994],[8.572656250000023,47.775634765625],[9.524023437500006,47.52421875]]]},"properties":{"name":"Switzerland","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-67.28886718749999,-55.776855468749964],[-67.55996093749997,-55.72480468750002],[-67.39736328124997,-55.58515625],[-67.28886718749999,-55.776855468749964]]],[[[-67.07993164062498,-55.15380859374996],[-67.33969726562495,-55.292578124999984],[-67.4947265625,-55.177441406249976],[-68.07001953124995,-55.22109374999999],[-68.30136718750003,-54.98066406250003],[-67.245263671875,-54.977636718750034],[-67.07993164062498,-55.15380859374996]]],[[[-69.70297851562503,-54.91904296875],[-68.90078125000002,-55.01777343750004],[-68.45800781249997,-54.95966796875002],[-68.61328124999997,-55.155566406250045],[-68.28266601562495,-55.25517578125],[-68.04833984375,-55.6431640625],[-68.86704101562498,-55.45019531250003],[-68.89008789062498,-55.2412109375],[-69.19262695312497,-55.171875],[-69.35922851562498,-55.300683593749945],[-69.18085937499995,-55.47480468749998],[-69.41181640624995,-55.44423828124997],[-69.97978515625002,-55.14746093749999],[-69.88442382812494,-54.88203125000001],[-69.70297851562503,-54.91904296875]]],[[[-70.9916015625,-54.86796874999999],[-70.80483398437497,-54.96767578124996],[-70.41752929687493,-54.908886718749976],[-70.29785156249997,-55.11376953124997],[-70.47558593749994,-55.17705078124998],[-71.43720703125001,-54.88925781249997],[-70.9916015625,-54.86796874999999]]],[[[-71.390478515625,-54.03281250000002],[-71.02192382812495,-54.111816406250036],[-71.14326171874998,-54.374023437499986],[-71.473291015625,-54.23115234375001],[-71.94853515624999,-54.300878906250006],[-72.21044921874997,-54.04775390624995],[-71.996484375,-53.884863281249984],[-71.390478515625,-54.03281250000002]]],[[[-72.92324218749997,-53.481640625],[-72.88222656249997,-53.578320312499976],[-72.48227539062503,-53.58808593750001],[-72.20541992187503,-53.80742187500002],[-72.408544921875,-54.00380859374997],[-72.87099609375,-54.12656250000002],[-72.76376953125,-53.86484375],[-73.03945312499994,-53.83281250000004],[-73.08076171875001,-53.99804687499995],[-73.21064453125001,-53.98583984374995],[-73.31435546875,-53.72919921874998],[-73.845458984375,-53.54580078125001],[-73.44707031249993,-53.41005859374998],[-72.92324218749997,-53.481640625]]],[[[-74.38574218749994,-52.92236328125001],[-73.65400390624998,-53.06982421875003],[-73.13520507812498,-53.35390625],[-73.56728515625,-53.3068359375],[-73.86694335937494,-53.096875],[-74.27021484374995,-53.08154296875002],[-74.71201171874998,-52.74873046874998],[-74.38574218749994,-52.92236328125001]]],[[[-68.62993164062499,-52.65263671875004],[-68.65322265624994,-54.85361328124999],[-69.48627929687493,-54.85888671875],[-69.72343750000002,-54.71210937500003],[-70.49716796875,-54.80957031249999],[-71.83154296874997,-54.62617187500002],[-71.92773437500003,-54.52871093749997],[-71.80014648437498,-54.433984374999945],[-71.07993164062498,-54.444238281249994],[-70.79726562500002,-54.32724609374996],[-70.70112304687498,-54.48544921875004],[-70.31098632812498,-54.52851562500002],[-70.86308593749993,-54.11044921875003],[-70.86772460937499,-53.88417968750002],[-70.53129882812502,-53.627343750000016],[-70.37973632812495,-53.98671874999995],[-70.62983398437493,-54.005566406249976],[-70.53530273437494,-54.136132812500016],[-70.16899414062502,-54.37929687499999],[-69.74184570312494,-54.30585937500005],[-69.25317382812494,-54.557421875000045],[-69.04433593749997,-54.40673828124999],[-69.98813476562503,-54.10908203125001],[-70.15112304687503,-53.88808593750002],[-70.09111328124996,-53.72177734374998],[-69.35595703125003,-53.41630859375001],[-69.63701171874999,-53.33408203125004],[-70.32929687499998,-53.37763671875003],[-70.44335937499994,-53.085546875000034],[-70.130615234375,-52.942773437499994],[-70.38012695312494,-52.75195312500002],[-69.93544921874997,-52.82109374999998],[-69.41406249999997,-52.48623046874997],[-69.16704101562499,-52.66757812499997],[-68.78979492187497,-52.576757812500034],[-68.62993164062499,-52.65263671875004]]],[[[-74.82294921874993,-51.63017578125001],[-74.53681640624998,-51.96513671875004],[-74.69448242187497,-52.27919921874999],[-74.85180664062494,-52.27070312500003],[-75.10537109375,-51.78886718750001],[-74.82294921874993,-51.63017578125001]]],[[[-74.55864257812499,-51.27705078125001],[-74.62036132812497,-51.395703125000026],[-75.04736328125,-51.39833984375003],[-75.28911132812496,-51.625390625000016],[-75.15366210937498,-51.278808593750014],[-74.73666992187503,-51.20761718749999],[-74.55864257812499,-51.27705078125001]]],[[[-75.302001953125,-50.67998046875005],[-75.411376953125,-50.76435546875001],[-75.42763671875002,-50.48056640625002],[-75.11533203124998,-50.510449218749976],[-75.302001953125,-50.67998046875005]]],[[[-75.05478515625,-50.29609375],[-75.44912109374997,-50.34335937500004],[-75.32666015624997,-50.01181640625],[-74.8759765625,-50.10996093750001],[-75.05478515625,-50.29609375]]],[[[-75.106689453125,-48.83652343750001],[-75.38994140624999,-49.15917968750002],[-75.64116210937499,-49.195410156250034],[-75.48764648437498,-49.082421875000016],[-75.58310546874998,-48.85888671874995],[-75.106689453125,-48.83652343750001]]],[[[-74.47617187499998,-49.14785156250002],[-74.59472656249997,-50.00664062500001],[-74.76298828124996,-50.01142578125001],[-74.88041992187502,-49.72587890625001],[-74.72382812499998,-49.42382812500003],[-74.960107421875,-49.533007812499974],[-75.06601562499998,-49.85234375000002],[-75.54980468749994,-49.79130859375002],[-75.30585937499998,-49.49404296875003],[-75.46748046874995,-49.35888671875003],[-75.08603515624998,-49.27021484375],[-75.21015624999995,-49.14804687499998],[-74.94921875,-48.960156249999976],[-74.89624023437503,-48.73320312500002],[-74.54609374999993,-48.76689453125004],[-74.47617187499998,-49.14785156250002]]],[[[-75.51025390624997,-48.76347656250005],[-75.65092773437496,-48.58632812500002],[-75.57148437499993,-48.095898437500026],[-75.39140625000002,-48.01972656249997],[-75.15849609374999,-48.62265624999996],[-75.51025390624997,-48.76347656250005]]],[[[-74.56728515625,-48.591992187500026],[-74.92304687499998,-48.62646484375003],[-75.21289062499997,-48.141699218750034],[-75.19829101562502,-47.974609375000014],[-74.895654296875,-47.839355468749986],[-74.56728515625,-48.591992187500026]]],[[[-75.11220703124997,-47.8376953125],[-75.26103515625002,-47.76386718749998],[-74.92646484374998,-47.72314453125003],[-75.11220703124997,-47.8376953125]]],[[[-74.31289062500002,-45.69150390625002],[-74.46552734374995,-45.757226562499994],[-74.68984375,-45.66259765625],[-74.310546875,-45.17265625000002],[-74.31289062500002,-45.69150390625002]]],[[[-73.63217773437498,-44.82148437499997],[-73.81845703125,-44.65214843750002],[-73.72392578124993,-44.544238281249974],[-73.63217773437498,-44.82148437499997]]],[[[-72.98613281249999,-44.780078124999974],[-73.22846679687498,-44.85996093749999],[-73.39707031249998,-44.77431640624995],[-73.44506835937497,-44.641015624999966],[-73.20771484374993,-44.33496093749997],[-72.7763671875,-44.50859374999999],[-72.98613281249999,-44.780078124999974]]],[[[-73.73535156249997,-44.39453125000003],[-74.00205078125003,-44.59091796874998],[-73.728173828125,-45.195898437500034],[-74.016259765625,-45.344921875000026],[-74.61777343749998,-44.64794921874996],[-74.50180664062498,-44.47353515624995],[-74.09721679687496,-44.38935546875004],[-73.99492187499999,-44.140234375],[-73.70322265624998,-44.27412109375001],[-73.73535156249997,-44.39453125000003]]],[[[-73.81064453125003,-43.827246093750006],[-73.95566406249998,-43.921972656250034],[-74.14296874999997,-43.872167968750006],[-73.81064453125003,-43.827246093750006]]],[[[-73.77338867187498,-43.3458984375],[-74.114404296875,-43.35791015624996],[-74.387353515625,-43.231640625],[-74.03666992187496,-41.79550781249998],[-73.52783203124997,-41.89628906249999],[-73.42290039062499,-42.192871093750014],[-73.47080078124998,-42.46630859375004],[-73.78925781249993,-42.58574218750003],[-73.43632812499996,-42.9365234375],[-73.74965820312494,-43.15908203124995],[-73.77338867187498,-43.3458984375]]],[[[-78.80415039062501,-33.646484374999986],[-78.98945312499993,-33.66171874999998],[-78.87744140625003,-33.57519531250003],[-78.80415039062501,-33.646484374999986]]],[[[-109.27998046874994,-27.14042968749996],[-109.434130859375,-27.171289062500023],[-109.39047851562499,-27.068359375000014],[-109.27998046874994,-27.14042968749996]]],[[[-67.19487304687493,-22.821679687500037],[-67.00878906249994,-23.00136718750005],[-67.35620117187503,-24.033789062499963],[-68.25029296875002,-24.391992187500023],[-68.56201171875,-24.74736328125003],[-68.38422851562495,-25.091894531249977],[-68.59208984375002,-25.420019531250034],[-68.41450195312498,-26.153710937500023],[-68.59160156249999,-26.47041015624997],[-68.31865234374999,-26.973242187500006],[-68.59208984375002,-27.140039062499966],[-68.84633789062494,-27.153710937499994],[-69.17441406249998,-27.924707031250037],[-69.65693359374995,-28.413574218749986],[-69.82788085937497,-29.10322265624997],[-70.02680664062501,-29.324023437500017],[-69.95996093749997,-30.078320312500026],[-69.84428710937493,-30.175],[-69.95634765624996,-30.35820312500003],[-70.15322265625,-30.360937499999963],[-70.30908203124994,-31.02265625000004],[-70.51958007812493,-31.1484375],[-70.585205078125,-31.569433593749963],[-70.25439453125,-31.957714843750026],[-70.36376953125,-32.08349609374997],[-70.02197265625,-32.88457031250002],[-70.08486328125002,-33.20175781249998],[-69.81962890624999,-33.28378906249999],[-69.85244140625,-34.224316406250026],[-70.05205078124999,-34.30078124999997],[-70.39316406250003,-35.146875],[-70.55517578125,-35.246875],[-70.41572265625001,-35.52304687500002],[-70.40478515625,-36.06171874999998],[-71.05551757812498,-36.52373046874996],[-71.19218750000002,-36.84365234375004],[-71.16757812499998,-37.76230468749996],[-70.858642578125,-38.60449218750003],[-71.40156249999995,-38.93505859374996],[-71.53945312499997,-39.60244140624995],[-71.71992187499995,-39.63525390624997],[-71.65976562499998,-40.02080078125],[-71.81831054687493,-40.17666015624995],[-71.70898437499997,-40.381738281249994],[-71.93212890624994,-40.69169921874999],[-71.91127929687497,-41.650390624999986],[-71.75,-42.04677734375001],[-72.10820312499993,-42.25185546874995],[-72.14643554687498,-42.990039062499974],[-71.750634765625,-43.237304687499986],[-71.90498046875001,-43.34755859374998],[-71.68007812500002,-43.92958984374998],[-71.82001953124993,-44.38310546875],[-71.21259765624998,-44.44121093750003],[-71.15971679687496,-44.56025390625004],[-71.26113281250002,-44.763085937499966],[-72.06372070312503,-44.771875],[-72.04169921874998,-44.90419921875004],[-71.5962890625,-44.97919921875004],[-71.34931640624995,-45.33193359374995],[-71.74619140624998,-45.57890625],[-71.63154296874998,-45.95371093749998],[-71.87568359374998,-46.160546875],[-71.69965820312501,-46.6513671875],[-71.94023437499999,-46.83125],[-71.90498046875001,-47.201660156250014],[-72.34594726562497,-47.49267578124997],[-72.517919921875,-47.87636718749998],[-72.32832031250001,-48.11005859374998],[-72.35473632812497,-48.36582031250005],[-72.582861328125,-48.47539062499999],[-72.65126953125,-48.84160156249998],[-73.03364257812501,-49.014355468750004],[-73.13525390625,-49.30068359374999],[-73.46157226562497,-49.31386718750001],[-73.55419921875,-49.463867187500014],[-73.50126953124996,-50.125292968750024],[-73.15292968749998,-50.73828125000003],[-72.50981445312496,-50.607519531250034],[-72.34023437499997,-50.68183593749999],[-72.40766601562501,-51.54082031250002],[-71.91865234374995,-51.98955078125004],[-69.96025390624993,-52.00820312500002],[-68.443359375,-52.35664062500004],[-69.24101562499996,-52.20546874999997],[-69.62031249999995,-52.46474609374995],[-70.79511718749995,-52.76875],[-70.99584960937497,-53.77929687499997],[-71.29775390625002,-53.88339843750004],[-72.1744140625,-53.632324218749964],[-72.41289062500002,-53.35019531250004],[-71.94169921874993,-53.23408203125001],[-71.89169921874998,-53.523535156250006],[-71.79145507812498,-53.48457031249997],[-71.74052734374999,-53.232617187499976],[-71.28896484375002,-53.03369140624995],[-71.22714843750003,-52.810644531249984],[-71.38774414062496,-52.76425781250004],[-72.27802734374998,-53.13232421874997],[-72.54892578125,-53.4607421875],[-73.05273437499997,-53.24345703125005],[-72.72768554687502,-52.7623046875],[-72.453466796875,-52.814453124999964],[-72.11757812499997,-52.65],[-71.51127929687502,-52.60537109375],[-72.22568359374998,-52.52099609374995],[-72.43769531250001,-52.62578124999998],[-72.71210937499995,-52.53554687499999],[-73.12246093749997,-53.073925781249976],[-73.64521484374998,-52.83701171875003],[-73.2408203125,-52.707128906250034],[-73.12392578125,-52.487988281249976],[-73.24414062499997,-52.62402343749998],[-73.58569335937503,-52.68574218750003],[-74.01445312499999,-52.63935546875],[-74.26494140624993,-52.1048828125],[-73.83447265625,-52.23398437500001],[-73.68432617187494,-52.07773437499998],[-73.26044921874993,-52.157812500000034],[-72.79501953124998,-51.94951171875005],[-72.57084960937496,-52.200097656249945],[-72.67705078125002,-52.38466796874998],[-72.52333984374997,-52.255468750000034],[-72.62460937499998,-51.94648437499997],[-72.48964843750002,-51.76367187500003],[-72.76123046875,-51.57324218749996],[-73.16875,-51.45390624999998],[-72.60004882812495,-51.79912109374997],[-73.51816406250003,-52.04101562499996],[-73.75263671874993,-51.795507812500034],[-74.19667968749997,-51.68056640624997],[-73.92978515624995,-51.61787109374999],[-73.93950195312499,-51.26630859375005],[-74.81474609374996,-51.06289062499999],[-75.09467773437495,-50.68125],[-74.68574218749995,-50.662011718749945],[-74.77587890625003,-50.46992187499998],[-74.64448242187498,-50.360937499999984],[-74.365576171875,-50.487890625],[-74.13940429687503,-50.81777343749997],[-73.80654296875,-50.93837890625003],[-73.654443359375,-50.49267578125],[-73.97802734375003,-50.827050781249994],[-74.18559570312493,-50.485351562500014],[-73.95034179687497,-50.510546875],[-74.62958984374998,-50.19404296875],[-74.333740234375,-49.97460937499997],[-73.95859374999998,-49.994726562499984],[-74.32392578124995,-49.783398437500004],[-74.29082031249996,-49.604101562499984],[-73.83637695312493,-49.609375],[-74.09443359374993,-49.42968749999998],[-73.93496093749994,-49.02089843750001],[-74.2212890625,-49.500585937500034],[-74.36655273437503,-49.40048828124998],[-74.34101562499998,-48.59570312499998],[-74.00908203124996,-48.475],[-74.47441406249999,-48.46396484374996],[-74.58466796874998,-47.999023437500014],[-73.39106445312498,-48.14589843750001],[-73.60991210937499,-47.993945312500045],[-73.71586914062499,-47.65546875000001],[-73.94086914062498,-47.92939453125004],[-74.22705078124994,-47.96894531250001],[-74.654931640625,-47.702246093750034],[-74.5337890625,-47.567675781249974],[-74.24296874999999,-47.67929687499998],[-74.13408203125002,-47.590820312499986],[-74.48266601562497,-47.43046875],[-74.15839843749998,-47.18251953125002],[-74.31357421874998,-46.78818359374998],[-74.45419921875003,-46.76679687499997],[-74.51225585937496,-46.88515625000002],[-75.00595703125,-46.74111328124998],[-74.98417968750002,-46.51210937499995],[-75.54033203124999,-46.69873046874996],[-75.43037109374995,-46.93457031249996],[-75.70639648437498,-46.70527343749997],[-74.924462890625,-46.159667968750014],[-75.06669921874993,-45.874902343749994],[-74.15786132812497,-45.7671875],[-74.122705078125,-45.49619140625002],[-73.95717773437494,-45.40439453124998],[-73.825,-45.446875],[-74.01992187500002,-46.055859375],[-74.39296875,-46.21738281250005],[-73.96757812500002,-46.15410156250003],[-73.87871093749993,-45.846875],[-73.73525390624994,-45.81171875],[-73.70815429687502,-46.070312500000014],[-73.94863281249997,-46.533105468749966],[-73.845361328125,-46.56601562500002],[-73.59184570312493,-45.89912109375004],[-73.73076171874999,-45.47998046875],[-73.26621093749995,-45.346191406250014],[-72.933837890625,-45.45234374999997],[-73.44497070312497,-45.23818359374995],[-73.36245117187502,-44.97822265625001],[-72.73896484375001,-44.73417968750003],[-72.680078125,-44.59394531249997],[-72.66386718749999,-44.43642578124995],[-73.26508789062498,-44.16865234375001],[-73.22446289062498,-43.89794921875003],[-73.06879882812495,-43.86201171874998],[-72.99658203125,-43.63154296875001],[-73.07597656250002,-43.323632812499994],[-72.75800781249998,-43.039453125],[-72.84804687500002,-42.66914062499997],[-72.77392578125003,-42.505175781250045],[-72.63183593750003,-42.509667968749994],[-72.77324218749996,-42.257714843749994],[-72.63105468749995,-42.199804687500006],[-72.412353515625,-42.388183593750014],[-72.49941406249997,-41.98085937499999],[-72.82407226562503,-41.90878906249996],[-72.36040039062499,-41.64912109375],[-72.31826171875,-41.49902343749997],[-72.54238281250002,-41.690625],[-72.95283203124995,-41.51474609374998],[-73.24179687499995,-41.78085937500002],[-73.62402343750003,-41.77363281249997],[-73.73515625000002,-41.74248046875002],[-73.62392578125,-41.581347656250045],[-73.81074218749995,-41.51748046875001],[-73.96586914062493,-41.118261718750034],[-73.67099609375,-39.96318359374999],[-73.41040039062503,-39.78916015624998],[-73.22646484375002,-39.22441406250003],[-73.52021484375001,-38.509375],[-73.46479492187498,-38.04033203125003],[-73.66181640624998,-37.69853515625003],[-73.66240234375002,-37.341015625000026],[-73.60166015624998,-37.18847656250003],[-73.21596679687502,-37.16689453124998],[-73.11806640624997,-36.68837890625002],[-72.58735351562493,-35.759667968749994],[-72.62392578125002,-35.5857421875],[-72.22377929687494,-35.096191406250014],[-72.00283203124997,-34.16533203125],[-71.66435546875002,-33.65263671875],[-71.74296875,-33.09511718750001],[-71.45224609374998,-32.65957031250001],[-71.70893554687495,-30.62802734375002],[-71.66948242187499,-30.33037109374996],[-71.40039062499997,-30.142968749999966],[-71.31572265624996,-29.649707031250017],[-71.51923828124993,-28.926464843750026],[-71.30673828124998,-28.672460937499963],[-71.08652343749998,-27.814453124999957],[-70.92578125,-27.588671874999974],[-70.64658203124998,-26.329394531250017],[-70.71372070312498,-25.78417968749997],[-70.44536132812502,-25.17265624999999],[-70.57412109374994,-24.644335937500003],[-70.39233398437494,-23.565917968749957],[-70.59335937499995,-23.255468750000034],[-70.56318359374995,-23.057031250000023],[-70.33168945312494,-22.848632812500014],[-70.08002929687501,-21.356835937500037],[-70.19702148437494,-20.725390625],[-70.15742187499995,-19.70585937500003],[-70.41826171874999,-18.345605468750023],[-69.92636718749998,-18.206054687500014],[-69.80258789062498,-17.990234375000014],[-69.85209960937493,-17.70380859375001],[-69.68476562499995,-17.649804687500023],[-69.58642578125,-17.57324218749997],[-69.51093749999998,-17.50605468749997],[-69.31337890624997,-17.943164062500017],[-69.28232421875003,-17.96484375],[-69.09394531249993,-18.05048828125004],[-69.14545898437495,-18.14404296875],[-69.09228515624994,-18.28242187500004],[-69.02680664062493,-18.65625],[-68.97885742187503,-18.81298828125003],[-68.96831054687502,-18.967968749999983],[-68.85795898437499,-19.09335937500005],[-68.62055664062495,-19.29667968749999],[-68.54785156249997,-19.341113281249974],[-68.49199218749996,-19.381933593750034],[-68.47016601562495,-19.409960937499974],[-68.46289062499997,-19.43281250000001],[-68.57529296874998,-19.56015625000002],[-68.69829101562499,-19.721093750000037],[-68.69619140625,-19.74072265625003],[-68.57827148437494,-19.856542968750006],[-68.559375,-19.902343750000014],[-68.56069335937502,-19.96708984374996],[-68.75932617187499,-20.115527343750003],[-68.74516601562493,-20.45859375],[-68.48432617187498,-20.628417968749957],[-68.55825195312497,-20.90195312499999],[-68.197021484375,-21.30029296874997],[-68.18642578124997,-21.618554687499966],[-67.88173828124997,-22.493359375000026],[-67.87944335937496,-22.822949218750026],[-67.57993164062495,-22.89169921874999],[-67.36225585937493,-22.85517578125001],[-67.19487304687493,-22.821679687500037]]]]},"properties":{"name":"Chile","childNum":26}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[110.88876953125006,19.99194335937497],[111.01367187500003,19.65546875000001],[110.64091796875002,19.291210937499955],[110.45126953125012,18.747949218750023],[110.06738281249997,18.447558593750045],[109.51933593750007,18.21826171875003],[108.7015625,18.535253906250034],[108.66552734375003,19.304101562499994],[109.27666015625002,19.761132812500023],[109.17744140625004,19.768457031250023],[109.26347656250007,19.882666015625006],[110.1715820312501,20.053710937500057],[110.58818359375002,19.976367187500017],[110.6517578125,20.137744140625017],[110.88876953125006,19.99194335937497]]],[[[110.38515625000005,21.093164062499966],[110.52158203125006,21.083105468750063],[110.50390625000003,20.96772460937501],[110.28095703125004,21.001171874999983],[110.38515625000005,21.093164062499966]]],[[[112.64375,21.63964843750003],[112.525,21.62304687500003],[112.64765625000004,21.710253906250017],[112.64375,21.63964843750003]]],[[[112.79023437500004,21.601855468750045],[112.78203125000007,21.772265625000045],[112.86259765625002,21.75263671875004],[112.79023437500004,21.601855468750045]]],[[[118.1830078125,24.496289062499983],[118.0905273437501,24.446142578125063],[118.10380859375002,24.552343750000034],[118.1830078125,24.496289062499983]]],[[[119.82089843750006,25.45698242187504],[119.70029296875012,25.432714843750063],[119.72255859375005,25.638818359375023],[119.83837890625003,25.591064453125],[119.82089843750006,25.45698242187504]]],[[[121.2513671875,28.086425781250057],[121.13154296875004,28.062597656250006],[121.20546875,28.204394531250017],[121.2513671875,28.086425781250057]]],[[[122.29589843750003,29.96342773437499],[122.02402343750012,30.01333007812505],[121.96943359375004,30.143115234375017],[122.28447265625007,30.068017578124994],[122.29589843750003,29.96342773437499]]],[[[121.86269531250005,31.492285156249977],[121.519921875,31.549609375000017],[121.2111328125001,31.80537109375001],[121.86269531250005,31.492285156249977]]],[[[130.52695312500012,42.535400390625],[130.24667968750012,42.744824218749955],[130.24033203125006,42.891796874999955],[129.89824218750002,42.998144531250034],[129.69785156250012,42.448144531249994],[129.3136718750001,42.41357421874997],[128.92343750000006,42.038232421874966],[128.04521484375007,41.9875],[128.28925781250004,41.60742187500006],[128.14941406249997,41.38774414062496],[127.17968750000003,41.531347656250006],[126.95478515625004,41.76948242187501],[126.74306640625,41.724853515625],[125.98906250000002,40.904638671875034],[124.8893554687501,40.459814453125006],[124.36210937500002,40.004052734374994],[124.10576171875002,39.84101562499998],[123.65087890625003,39.881591796875],[122.8400390625001,39.600830078125],[121.98232421875,39.05317382812498],[121.67724609374997,39.00341796875006],[121.64990234375003,38.865087890625034],[121.16357421874997,38.73164062500001],[121.10673828125002,38.920800781249994],[121.6798828125001,39.10869140625002],[121.62763671875004,39.22016601562498],[121.81845703125006,39.38652343750002],[121.27548828125006,39.38476562500003],[121.26748046875,39.544677734375],[121.51757812499997,39.638964843750045],[121.51738281250002,39.84482421875006],[121.8009765625001,39.950537109375006],[122.27500000000012,40.541845703125034],[121.83486328125005,40.97426757812502],[121.72929687500002,40.84614257812504],[121.1745117187501,40.901269531249994],[120.47910156250006,40.23095703125003],[119.39111328125003,39.75249023437499],[118.976953125,39.182568359374955],[118.29785156249997,39.067089843749955],[118.04091796875,39.22675781249998],[117.86572265625003,39.191259765625034],[117.61669921875003,38.852880859375034],[117.5578125000001,38.625146484374994],[117.76669921875012,38.311669921874994],[118.01494140625007,38.18339843749996],[118.94003906250006,38.04277343750002],[119.08916015625007,37.70073242187496],[118.95263671875003,37.33115234374998],[119.28740234375002,37.138281250000034],[119.76054687500007,37.15507812499999],[120.31152343750003,37.62270507812505],[120.2572265625,37.67900390624996],[120.75,37.83393554687501],[121.64023437500012,37.46035156250002],[122.05664062500003,37.528906250000034],[122.66699218750003,37.40283203125003],[122.4466796875,37.06811523437503],[122.51972656250004,36.94682617187502],[122.34091796875012,36.83222656250004],[121.93271484375006,36.95947265625003],[121.05380859375006,36.61137695312499],[120.81083984375007,36.6328125],[120.89580078125007,36.44414062500002],[120.71152343750006,36.41328125000004],[120.6378906250001,36.129931640625045],[120.39306640625003,36.053857421874994],[120.32773437500006,36.228173828124994],[120.18330078125004,36.20244140624999],[120.094140625,36.11889648437503],[120.28476562500006,35.98442382812499],[119.42968749999997,35.301416015624994],[119.16533203125002,34.84882812499998],[119.20097656250002,34.748437499999966],[120.26669921875006,34.274023437500034],[120.87109374999997,33.016503906249994],[120.8532226562501,32.66137695312503],[121.34169921875005,32.42504882812503],[121.40390625000006,32.20625],[121.85634765625,31.816455078125045],[121.86630859375006,31.703564453124955],[121.68085937500004,31.71215820312503],[121.351953125,31.85878906250005],[120.97353515625,31.86938476562497],[120.52011718750006,32.10585937500002],[120.03593750000002,31.93627929687503],[120.7155273437501,31.983740234375006],[120.7877929687501,31.81977539062501],[121.66064453124997,31.319726562499994],[121.87792968750003,30.91699218750003],[121.41894531249997,30.789794921875057],[120.8214843750001,30.354638671875023],[120.44980468750006,30.38784179687505],[120.19462890625002,30.241308593750034],[120.49453125,30.303076171875006],[120.63339843750006,30.133154296875034],[121.25800781250004,30.30410156250005],[121.67792968750004,29.979101562500006],[122.08291015625005,29.870361328125057],[121.50625,29.484570312499955],[121.94121093750002,29.605908203124983],[121.91777343750007,29.13500976562497],[121.71748046875004,29.25634765625],[121.48710937500007,29.193164062500017],[121.67968749999997,28.953125],[121.54003906250003,28.931884765625],[121.6625,28.851416015625034],[121.47519531250006,28.64140625],[121.60996093750006,28.29213867187505],[121.27226562500002,28.222119140624983],[121.14570312500004,28.32666015624997],[120.95859375000006,28.037011718750023],[120.74765625000006,28.00996093750001],[120.83300781249997,27.891455078125034],[120.58750000000012,27.580761718749983],[120.60751953125012,27.41240234374996],[120.2787109375,27.097070312500023],[120.08671875000007,26.67158203125004],[119.88222656250005,26.610449218750006],[119.82421874999997,26.84638671875001],[119.71044921874997,26.728662109375023],[119.58818359375002,26.784960937500045],[119.8810546875001,26.33417968750004],[119.46308593750004,26.05468750000003],[119.13945312500007,26.12177734375001],[119.33203124999997,25.94873046875003],[119.61875000000012,26.003564453124994],[119.53945312500005,25.59125976562504],[119.6224609375,25.391162109375017],[119.180078125,25.449804687499977],[119.285546875,25.232226562500074],[118.97753906249997,25.209277343750017],[118.90908203125005,24.92890625000001],[118.63691406250004,24.835546874999977],[118.65703125000002,24.621435546874977],[118.0871093750001,24.627001953125045],[118.00595703125006,24.48198242187499],[117.84267578125005,24.47431640625004],[118.0560546875,24.24609374999997],[117.62822265625002,23.836718750000074],[117.46640625000012,23.84057617187497],[117.36767578124997,23.58862304687497],[117.29082031250007,23.71435546875],[117.08251953124997,23.578759765625023],[116.91064453124997,23.646679687499983],[116.86093750000006,23.453076171874983],[116.62939453124997,23.353857421875034],[116.69882812500006,23.277783203124983],[116.53828125000004,23.17968749999997],[116.47070312499997,22.945898437500034],[116.25185546875005,22.981347656249994],[115.85214843750006,22.801562500000045],[115.64042968750002,22.853417968750023],[115.49833984375002,22.718847656250063],[115.19580078125003,22.81728515625005],[114.85380859375007,22.616796875000063],[114.65166015625002,22.755273437500023],[114.55419921874997,22.52890625],[114.26601562500005,22.540966796874983],[114.01542968750007,22.51191406250001],[113.61962890624997,22.861425781249977],[113.6205078125,23.12749023437499],[113.51972656250004,23.102099609375074],[113.33105468749997,22.912011718749966],[113.55302734375002,22.594042968750045],[113.54912109375002,22.225195312500034],[113.14902343750012,22.075],[113.08876953125,22.207958984374983],[112.95390625000007,21.907324218750034],[112.80859374999997,21.944628906250074],[112.58632812500005,21.77685546875],[112.35966796875007,21.97802734375003],[112.30498046875002,21.74169921875003],[111.94394531250012,21.84965820312499],[111.60273437500004,21.55908203125003],[111.01689453125007,21.51171874999997],[110.56718750000002,21.21406250000001],[110.41093750000007,21.33813476562497],[110.15400390625004,20.944628906250017],[110.36542968750004,20.837597656249955],[110.31308593750012,20.67167968749999],[110.51152343750007,20.51826171875001],[110.34472656249997,20.29482421875005],[109.88251953125004,20.364062500000045],[109.96835937500006,20.448144531250023],[109.66259765625003,20.91689453125005],[109.68125000000012,21.13164062499999],[109.93076171875012,21.480566406250034],[109.6869140625,21.52460937500004],[109.56640624999997,21.690576171874994],[109.54404296875012,21.537939453125006],[109.14863281250004,21.425537109375],[109.1017578125001,21.59047851562505],[108.77167968750004,21.63046875],[108.59375,21.901025390624994],[108.47988281250005,21.904638671875006],[108.50214843750004,21.633447265624994],[108.32480468750006,21.693505859374994],[108.24628906250004,21.55839843749999],[107.97265624999997,21.507958984375023],[107.75927734374997,21.655029296875057],[107.35117187500012,21.60888671874997],[106.97099609375002,21.923925781250034],[106.66357421875003,21.97890625000005],[106.55039062500006,22.501367187499994],[106.78027343749997,22.778906250000034],[106.54179687500007,22.908349609375023],[106.2790039062501,22.857470703125045],[106.14843749999997,22.970068359375006],[105.8429687500001,22.922802734374955],[105.27539062500003,23.34521484375003],[104.86474609375003,23.136376953125023],[104.68730468750002,22.822216796874983],[104.37177734375004,22.704052734374983],[104.14306640624997,22.800146484375006],[103.94150390625006,22.540087890625045],[103.62021484375006,22.782031250000045],[103.49296875000007,22.587988281250034],[103.32666015625003,22.769775390625057],[102.98193359374997,22.4482421875],[102.47089843750004,22.75092773437501],[102.40644531250004,22.70800781249997],[102.2370117187501,22.466015624999983],[102.1759765625001,22.414648437500006],[102.12744140624997,22.379199218750045],[101.84179687500003,22.38847656249999],[101.75996093750004,22.490332031250034],[101.73876953124997,22.495263671874994],[101.70751953125003,22.486572265625],[101.67148437500006,22.462304687500023],[101.64619140625004,22.405419921874966],[101.61992187500002,22.32744140624999],[101.56787109374997,22.27636718749997],[101.52451171875006,22.25366210937497],[101.7365234375001,21.826513671874977],[101.74394531250007,21.77797851562505],[101.74726562500004,21.605761718750045],[101.72294921875007,21.31494140625003],[101.80058593750007,21.212597656249983],[101.78349609375007,21.204150390625017],[101.728125,21.156396484374994],[101.7047851562501,21.15014648437503],[101.54238281250005,21.23427734375005],[101.2814453125001,21.184130859375045],[101.24785156250007,21.197314453125045],[101.22441406250002,21.223730468750034],[101.21181640625,21.278222656250023],[101.2199218750001,21.34243164062505],[101.17539062500006,21.407519531250074],[101.19667968750005,21.522070312500063],[101.1388671875001,21.567480468749977],[101.07978515625004,21.75585937499997],[100.60458984375012,21.471777343750006],[100.14765625000004,21.480517578125017],[99.94072265625007,21.75874023437504],[99.9176757812501,22.02802734375001],[99.19296875000006,22.12597656249997],[99.50712890625002,22.959130859374994],[99.41806640625006,23.069238281250023],[98.86376953125003,23.191259765625034],[98.8322265625001,23.624365234374977],[98.67675781250003,23.905078125000045],[98.83505859375006,24.121191406250034],[98.2125,24.110644531250017],[97.56455078125012,23.911035156250023],[97.7082031250001,24.228759765625],[97.53144531250004,24.49169921875003],[97.58330078125002,24.77480468750005],[97.73789062500006,24.869873046875057],[97.8195312500001,25.251855468749994],[98.01074218749997,25.292529296875017],[98.14287109375007,25.571093750000017],[98.33378906250007,25.586767578125006],[98.65625,25.86357421874999],[98.56406250000006,26.072412109374994],[98.68554687499997,26.189355468750023],[98.7384765625001,26.785742187500006],[98.65117187500007,27.572460937499983],[98.4525390625,27.6572265625],[98.29882812499997,27.550097656250045],[98.06162109375012,28.185888671874977],[97.59921875000006,28.51704101562504],[97.53789062500002,28.510205078124983],[97.43144531250002,28.353906250000023],[97.35644531249997,28.254492187500006],[97.32158929493812,28.217097107438057],[97.3027336276825,28.08710519614969],[97.34382779482424,27.982305259167095],[97.04929369561631,27.76000444316393],[96.96494598325154,27.699301564540924],[96.19423412199573,28.04146177926422],[95.73730002295082,28.117613231051525],[95.11298892962586,27.748338353239472],[94.07167814294401,27.588707868507477],[93.61247595136224,27.323800298697016],[93.30681393470121,26.786120363519142],[92.74319481218781,26.833531317384058],[92.04974640832253,26.874866505386724],[92.07342257335648,26.915311275859864],[92.06813426293174,26.9752569185349],[92.02985139563152,27.03987087331446],[91.99856592104459,27.079255842602592],[91.99177981607339,27.100605151743654],[92.0025114452454,27.147290053160265],[92.03101585307499,27.214271359861193],[92.08387457645458,27.29090135496722],[92.04520857607581,27.364442429033787],[91.99069061380867,27.450181624174498],[91.95099838734396,27.45828799115413],[91.85276579410389,27.438593286730903],[91.74366351462741,27.442853010105477],[91.59505352446729,27.557262710287986],[91.63193359375012,27.759960937499983],[91.64189453125002,27.923242187500023],[91.36259958579089,28.02438066407592],[91.27304687500012,28.078369140625],[91.22587890625007,28.071240234374983],[91.07773437500012,27.974462890624977],[91.02080078125002,27.970068359374977],[90.71572265625,28.071728515624983],[90.63007812500004,28.078564453124955],[90.47734375000007,28.07084960937499],[90.3527343750001,28.080224609375023],[90.33310546875012,28.093994140625],[90.36298828125004,28.21650390625001],[90.34824218750006,28.24394531249999],[90.22080078125006,28.27773437500005],[90.10449218749997,28.302050781250017],[89.98105468750006,28.311181640625023],[89.8978515625,28.29414062500001],[89.81689453125003,28.25629882812501],[89.74980468750002,28.18818359375001],[89.65273437500005,28.158300781250034],[89.53691406250007,28.10742187499997],[89.4806640625001,28.059960937499994],[88.89140625000002,27.316064453124966],[88.83251953125003,27.36284179687499],[88.7648437500001,27.429882812499983],[88.74902343749997,27.521875],[88.82988281250002,27.76738281249999],[88.84882812500004,27.86865234375],[88.80371093750003,28.006933593750034],[88.57792968750002,28.093359375000034],[88.42597656250004,28.01166992187501],[88.27519531250007,27.968847656250006],[88.14111328125003,27.94892578125001],[88.10898437500006,27.933007812499966],[88.10976562500005,27.870605468750057],[87.8607421875,27.886083984375006],[87.62255859374997,27.81518554687503],[87.29072265625004,27.821923828124994],[87.14140625000002,27.838330078124955],[87.02011718750006,27.928662109374983],[86.9337890625001,27.96845703125001],[86.84238281250012,27.99916992187505],[86.750390625,28.022070312500006],[86.71962890625005,28.070654296875034],[86.69052734375006,28.09492187500001],[86.61445312500004,28.10302734374997],[86.55449218750007,28.08520507812497],[86.51689453125007,27.963525390624966],[86.40869140625003,27.928662109374983],[86.32861328124997,27.95952148437496],[86.2179687500001,28.022070312500006],[86.13701171875002,28.114355468750063],[86.07871093750006,28.08359375],[86.0641601562501,27.934716796874966],[85.99453125000005,27.910400390625],[85.95410156249997,27.92822265624997],[85.92167968750002,27.989697265624983],[85.84023437500005,28.135351562499977],[85.75947265625004,28.220654296874955],[85.67832031250012,28.277441406249977],[85.41064453125003,28.27602539062505],[85.21210937500004,28.292626953124966],[85.1224609375,28.315966796875017],[85.08857421875004,28.37226562500001],[85.121484375,28.484277343750023],[85.16015624999997,28.571875],[85.15908203125,28.592236328124983],[85.1263671875,28.602636718750063],[85.06914062500007,28.60966796874999],[84.85507812500006,28.553613281250023],[84.796875,28.560205078125023],[84.2287109375001,28.911767578124966],[84.17558593750002,29.036376953125057],[84.12783203125005,29.15629882812496],[84.10136718750002,29.21997070312497],[84.02197265624997,29.25385742187504],[83.93593750000005,29.27949218750001],[83.58349609375003,29.18359375000003],[83.15546875000004,29.612646484375034],[82.22070312500003,30.063867187500023],[82.04335937500005,30.326757812500034],[81.8548828125,30.362402343750006],[81.64189453125007,30.3875],[81.4171875000001,30.33759765625001],[81.25507812500004,30.09331054687499],[81.17714843750005,30.039892578125034],[80.98544921875006,30.23710937499999],[80.87353515625003,30.290576171875045],[80.19121093750002,30.56840820312496],[80.20712890625006,30.683740234375023],[79.92451171875004,30.888769531250034],[79.66425781250004,30.96523437499999],[79.38847656250007,31.064208984375],[79.10712890625004,31.402636718750017],[78.74355468750005,31.323779296875017],[78.7550781250001,31.55029296875],[78.69345703125006,31.740380859374994],[78.72558593750003,31.983789062500023],[78.49589843750002,32.21577148437504],[78.4552734375001,32.30034179687502],[78.41748046874997,32.466699218749994],[78.38964843749997,32.51987304687498],[78.73671875,32.55839843750002],[78.75351562500012,32.49926757812506],[78.91894531249997,32.35820312500002],[79.16992187500003,32.497216796874994],[79.14550781250003,33.00146484375006],[79.10283203125007,33.05253906249996],[79.13515625000005,33.17192382812496],[79.1125,33.22626953125001],[78.94843750000004,33.346533203125006],[78.86503906250002,33.43110351562501],[78.78378906250006,33.80878906250004],[78.72666015625006,34.013378906249955],[78.97060546875,34.22822265625004],[78.93642578125,34.35195312500002],[78.86484375000006,34.39033203125001],[78.32695312500007,34.60639648437498],[78.15849609375002,34.94648437499998],[78.07578125000006,35.13491210937502],[78.0426757812501,35.47978515625002],[77.79941406250006,35.49589843750002],[77.44648437500004,35.47558593750006],[77.29482421875005,35.508154296875034],[77.09003906250004,35.55205078124999],[76.87890625000003,35.61328125000003],[76.76689453125002,35.661718750000034],[76.72753906250003,35.67866210937504],[76.63183593749997,35.729394531249966],[76.56347656249997,35.77299804687499],[76.55126953124997,35.887060546875034],[76.50205078125006,35.87822265625002],[76.38574218750003,35.837158203125],[76.25166015625004,35.8109375],[76.17783203125012,35.810546875],[76.14785156250005,35.82900390625002],[76.07089843750006,35.983007812500034],[75.91230468750004,36.048974609374994],[75.97441406250007,36.38242187500006],[75.9518554687501,36.458105468750034],[75.9330078125,36.52158203124998],[75.840234375,36.64970703124999],[75.7721679687501,36.694921875000034],[75.6671875000001,36.741992187500045],[75.57373046874997,36.75932617187502],[75.46025390625002,36.725048828124955],[75.42421875000005,36.73823242187498],[75.37685546875,36.88369140625005],[75.34667968749997,36.913476562499966],[75.05390625000004,36.98715820312498],[74.94912109375,36.96835937500006],[74.88925781250006,36.95244140625002],[74.69218750000007,37.035742187500006],[74.60058593749997,37.03666992187502],[74.54140625,37.02216796875001],[74.52646484375006,37.03066406250005],[74.49794921875,37.057226562500034],[74.37617187500004,37.13735351562502],[74.37216796875006,37.15771484375],[74.558984375,37.23662109374999],[74.66894531250003,37.266699218750006],[74.72666015625006,37.29072265625001],[74.7389648437501,37.28564453125003],[74.76738281250002,37.249169921874966],[74.840234375,37.22504882812504],[74.89130859375004,37.231640624999955],[75.11875,37.38569335937498],[74.8942382812501,37.60141601562498],[74.81230468750002,38.46030273437498],[74.27744140625,38.659765625000034],[74.02558593750004,38.53984375000002],[73.80166015625,38.60688476562501],[73.69609375000007,38.85429687499996],[73.8052734375,38.968652343749994],[73.60732421875,39.229199218749955],[73.63632812500006,39.396679687499955],[73.63164062500007,39.44887695312502],[73.82294921875004,39.48896484375004],[73.90712890625,39.578515624999966],[73.9146484375,39.60649414062499],[73.88251953125004,39.71455078124998],[73.83974609375005,39.76284179687505],[73.8353515625,39.800146484375006],[73.85625,39.828662109375045],[73.88457031250002,39.87792968750006],[73.93876953125002,39.97880859374999],[73.99160156250005,40.04311523437502],[74.83046875,40.32851562499999],[74.80126953124997,40.428515625000045],[74.83515625000004,40.482617187499955],[74.865625,40.493505859375034],[75.0044921875,40.44951171874996],[75.11132812499997,40.4541015625],[75.24101562500002,40.48027343750002],[75.52080078125002,40.627539062500006],[75.55556640625,40.625195312499955],[75.6771484375,40.305810546874994],[75.87197265625,40.30322265625],[76.25830078124997,40.43076171875006],[76.3185546875001,40.352246093749955],[76.39638671875005,40.389794921874966],[76.4801757812501,40.44951171874996],[76.57792968750002,40.577880859375],[76.62216796875006,40.66235351562497],[76.6398437500001,40.74223632812499],[76.66113281249997,40.77963867187498],[76.70839843750005,40.818115234375],[76.82402343750002,40.982324218749966],[76.90771484374997,41.02416992187497],[76.98662109375002,41.039160156250006],[77.58173828125004,40.99277343750006],[77.71933593750012,41.024316406249994],[77.81523437500002,41.05561523437498],[77.9564453125,41.05068359375005],[78.1234375,41.07563476562498],[78.34628906250012,41.28144531249998],[78.36240234375012,41.37163085937496],[78.44287109374997,41.41752929687499],[78.742578125,41.56005859375],[79.29355468750006,41.78281249999998],[79.76611328124997,41.89887695312501],[79.84042968750012,41.99575195312502],[79.90966796875003,42.014990234375034],[80.21621093750005,42.03242187500004],[80.23515625000007,42.04345703124997],[80.24619140625012,42.05981445312503],[80.209375,42.190039062500006],[80.20224609375012,42.73447265624998],[80.53896484375005,42.873486328124955],[80.39023437500006,43.043115234374966],[80.78574218750006,43.16157226562504],[80.35527343750002,44.09726562500006],[80.48154296875006,44.71464843749999],[79.871875,44.88378906249997],[80.05917968750012,45.006445312500006],[81.69199218750012,45.34936523437497],[81.94492187500006,45.16083984375001],[82.26660156249997,45.21909179687498],[82.52148437500003,45.12548828125],[82.61162109375007,45.424267578124955],[82.31523437500002,45.59492187499998],[83.02949218750004,47.18593750000002],[84.016015625,46.97050781250002],[84.66660156250006,46.97236328125004],[84.78613281249997,46.83071289062505],[85.484765625,47.06352539062496],[85.65664062500005,47.254638671875],[85.52597656250006,47.915625],[85.7494140625,48.38505859374999],[86.54941406250012,48.52861328125002],[86.8083007812501,49.04970703125002],[87.32285156250012,49.085791015625006],[87.41669921875004,49.07661132812501],[87.5158203125001,49.122412109375006],[87.7625,49.16582031249996],[87.81425781250002,49.162304687499955],[87.87216796875012,49.000146484374966],[87.74316406250003,48.88164062499999],[87.83183593750007,48.79165039062505],[88.02792968750006,48.735595703125],[88.06005859375003,48.707177734374966],[87.9796875000001,48.55512695312498],[88.30996093750005,48.47207031250002],[88.41396484375,48.403417968750006],[88.51708984374997,48.384472656249955],[88.56679687500005,48.31743164062496],[88.57597656250007,48.220166015624955],[88.68183593750004,48.170556640624994],[88.83828125000005,48.101708984374994],[88.91777343750007,48.089013671874966],[89.04765625000007,48.002539062500034],[89.47919921875004,48.02905273437503],[89.5609375,48.00395507812496],[89.778125,47.82700195312498],[89.83134765625002,47.82329101562502],[89.91044921875007,47.844335937500034],[89.95869140625004,47.88632812499998],[90.02792968750012,47.877685546875],[90.1032226562501,47.74541015624996],[90.19101562500012,47.70209960937501],[90.31328125000007,47.67617187499999],[90.33066406250006,47.655175781249966],[90.42519531250005,47.50410156250001],[90.49619140625012,47.28515625],[90.64335937500007,47.10029296874998],[90.71552734375004,47.00385742187498],[90.7990234375001,46.98515624999999],[90.86992187500002,46.95449218750005],[90.91054687500005,46.88325195312501],[90.9857421875,46.7490234375],[90.9115234375,46.270654296874994],[90.94755859375002,46.17729492187499],[90.99677734375004,46.10498046875],[91.00175781250007,46.03579101562502],[90.6618164062501,45.525244140625006],[90.87724609375002,45.19609375000002],[91.05,45.217431640624994],[91.584375,45.07651367187498],[92.42382812499997,45.008935546874994],[92.57890625000002,45.01098632812506],[92.78789062500007,45.035742187500034],[93.51621093750012,44.944482421874994],[94.71201171875012,44.35083007812503],[95.35029296875004,44.27807617187503],[95.32558593750005,44.03935546874999],[95.52558593750004,43.953955078125006],[95.85957031250004,43.27597656249998],[96.38544921875004,42.72036132812502],[97.20566406250012,42.78979492187506],[99.46787109375012,42.568212890625034],[99.98378906250005,42.67734375000006],[100.08632812500005,42.67075195312506],[100.51904296875003,42.61679687499998],[101.09199218750004,42.55131835937496],[101.49531250000004,42.53876953124998],[101.57910156249997,42.52353515624998],[101.65996093750002,42.50004882812499],[101.97294921875002,42.21586914062502],[102.15664062500005,42.158105468749966],[102.57519531249997,42.09208984375002],[103.07285156250006,42.00595703125006],[103.7111328125001,41.75131835937506],[103.99726562500004,41.796972656250034],[104.30517578124997,41.84614257812501],[104.49824218750004,41.87700195312499],[104.49824218750004,41.65869140625],[104.86035156250003,41.64375],[104.98203125000012,41.59550781250002],[105.05058593750002,41.61591796875001],[105.1154296875001,41.66328124999998],[105.19707031250002,41.738037109375],[105.31435546875005,41.77089843750005],[105.86757812500005,41.993994140625034],[106.77001953125003,42.28872070312502],[108.17119140625002,42.44731445312502],[108.68730468750002,42.416113281250034],[109.33984374999997,42.43837890625005],[109.44316406250002,42.455957031249994],[110.40039062499997,42.77368164062497],[111.00722656250005,43.34140624999998],[111.878125,43.68017578125],[111.93173828125012,43.81494140625],[111.40224609375005,44.367285156250006],[111.89804687500006,45.064062500000034],[112.03261718750005,45.08164062500006],[112.11289062500006,45.06293945312498],[112.41132812500004,45.05820312499998],[112.49931640625002,45.01093750000004],[112.59677734375006,44.917675781249955],[112.7067382812501,44.883447265624994],[113.04941406250006,44.81035156250002],[113.3009765625001,44.79165039062502],[113.50791015625006,44.76235351562502],[113.58701171875006,44.745703125],[113.65263671875002,44.76347656249999],[113.87705078125012,44.89619140625001],[114.03027343749997,44.942578124999955],[114.08027343750004,44.97114257812501],[114.41914062500004,45.20258789062501],[114.56015625000012,45.38999023437498],[114.73876953124997,45.41962890624998],[114.91923828125007,45.378271484375006],[115.16259765624997,45.390234375000034],[115.6810546875,45.45825195312503],[116.19765625,45.739355468750006],[116.240625,45.795996093750006],[116.22910156250012,45.84575195312502],[116.21298828125012,45.88691406249998],[116.56259765625012,46.28979492187497],[116.85908203125004,46.387939453125],[117.3333984375,46.36201171875004],[117.35693359375003,46.391308593749955],[117.35634765625,46.436669921874966],[117.39218750000012,46.53759765625003],[117.40556640625007,46.57089843750006],[117.43808593750012,46.58623046874999],[117.546875,46.58828125000005],[117.74121093749997,46.51816406250006],[118.07128906249997,46.666601562500006],[118.15683593750006,46.678564453125034],[118.30869140625012,46.71704101562497],[118.40439453125006,46.70317382812499],[118.58046875,46.69189453125],[118.64873046875002,46.70166015625006],[118.72294921875007,46.69189453125],[118.8439453125001,46.76020507812498],[118.95712890625006,46.73486328124997],[119.16210937499997,46.638671875],[119.33183593750002,46.61381835937499],[119.47402343750005,46.626660156249955],[119.62021484375006,46.60395507812504],[119.70664062500006,46.60600585937502],[119.74746093750005,46.62719726562497],[119.86718750000003,46.67216796874999],[119.89785156250005,46.857812499999966],[119.71113281250004,47.15],[119.08193359375,47.654150390625034],[119.01757812500003,47.68535156249999],[118.88027343750005,47.72509765625],[118.75996093750004,47.75761718749996],[118.69052734375012,47.822265625],[118.56777343750005,47.94326171875005],[118.49843750000005,47.98398437499998],[117.76835937500002,47.98789062499998],[117.3507812500001,47.65219726562498],[117.28593750000002,47.666357421875034],[117.06972656250005,47.80639648437506],[116.95166015624997,47.836572265624966],[116.90117187500007,47.85307617187496],[116.76054687500002,47.869775390624994],[116.65195312500012,47.86450195312497],[116.51347656250007,47.839550781249955],[116.37822265625002,47.84404296874999],[116.31718750000002,47.85986328125],[116.2311523437501,47.85820312500002],[116.07480468750012,47.78955078125],[115.99384765625004,47.71132812500005],[115.89824218750002,47.68691406250005],[115.6164062500001,47.874804687500045],[115.52509765625004,48.13085937499997],[115.63945312500007,48.18623046874998],[115.785546875,48.24824218750001],[115.7965820312501,48.346337890624994],[115.7916992187501,48.455712890624994],[115.8205078125001,48.57724609375006],[116.6833007812501,49.82377929687499],[117.8734375,49.51347656250002],[118.4515625,49.84448242187503],[119.25986328125012,50.06640625000003],[119.34628906250012,50.278955078124994],[119.16367187500006,50.40600585937503],[120.06689453125003,51.60068359375006],[120.74980468750007,52.096533203125006],[120.65615234375,52.56665039062503],[120.0675781250001,52.632910156250034],[120.09453125000007,52.787207031250034],[120.98544921875012,53.28457031250002],[123.6078125,53.546533203124994],[124.81230468750002,53.133837890625045],[125.075,53.20366210937496],[125.64902343750012,53.042285156250045],[126.34169921875,52.36201171875001],[126.92480468749997,51.10014648437496],[127.30703125000005,50.70795898437501],[127.33720703125007,50.35014648437502],[127.590234375,50.20898437500003],[127.55078124999997,49.801806640625045],[127.99960937500006,49.56860351562506],[128.70400390625,49.60014648437499],[129.0651367187501,49.374658203124966],[129.49814453125012,49.38881835937502],[130.1959960937501,48.89165039062499],[130.553125,48.861181640625006],[130.5521484375,48.602490234374955],[130.80429687500012,48.34150390624998],[130.7326171875001,48.01923828124998],[130.96191406249997,47.70932617187498],[132.47626953125004,47.714990234374994],[132.7072265625001,47.94726562500006],[133.14404296875003,48.10566406249998],[133.46835937500006,48.09716796875003],[134.29335937500005,48.37343750000002],[134.66523437500004,48.25390625],[134.56601562500006,48.02250976562502],[134.75234375,47.71542968749998],[134.1676757812501,47.30219726562501],[133.86132812500003,46.24775390625004],[133.43642578125,45.60468750000004],[133.18603515625003,45.49482421875004],[133.1134765625001,45.130712890625006],[132.93603515624997,45.029931640624994],[131.85185546875002,45.32685546875001],[131.44687500000012,44.984033203124966],[130.9816406250001,44.844335937500034],[131.2552734375,44.07158203124999],[131.25732421875003,43.378076171874994],[131.06855468750004,42.90224609375005],[130.42480468749997,42.72705078124997],[130.52695312500012,42.535400390625]]],[[[113.9977539062501,22.210498046875045],[113.83886718749997,22.24169921875003],[114.04394531250003,22.33339843750005],[113.9977539062501,22.210498046875045]]],[[[114.01542968750007,22.51191406250001],[114.26601562500005,22.540966796874983],[114.26796875,22.295556640624966],[113.93730468750002,22.364990234375],[114.01542968750007,22.51191406250001]]],[],[[[118.4074218750001,24.522119140624994],[118.43271484375006,24.414355468750074],[118.29511718750004,24.436328125000017],[118.4074218750001,24.522119140624994]]],[[[121.00878906249997,22.62036132812497],[120.83984375000003,21.925],[120.2328125,22.71791992187505],[120.0724609375001,23.149755859375006],[120.13212890625007,23.652929687500034],[121.040625,25.032812500000034],[121.59365234375,25.275341796874983],[121.92900390625002,24.973730468749977],[121.39746093750003,23.172509765625023],[121.00878906249997,22.62036132812497]]]]},"properties":{"name":"China","childNum":15}},{"geometry":{"type":"Polygon","coordinates":[[[-5.262304687499977,10.319677734374991],[-4.72177734374992,9.756542968750026],[-4.625830078125006,9.713574218749969],[-4.526611328124943,9.723486328125034],[-4.406201171874926,9.647998046875031],[-4.332226562499955,9.645703125],[-4.18115234375,9.78173828125],[-3.790625,9.917187499999983],[-3.581152343749977,9.924316406250014],[-3.289697265625023,9.882226562500051],[-3.223535156249937,9.895458984374997],[-3.160693359374932,9.849169921874974],[-3.095800781249949,9.752099609375009],[-3.042626953124937,9.72089843750004],[-2.988281249999972,9.687353515624963],[-2.900878906249943,9.534619140625026],[-2.875146484374937,9.500927734374997],[-2.816748046874949,9.425830078124974],[-2.766601562499943,9.424707031250009],[-2.7171875,9.457128906250048],[-2.695849609374989,9.481347656250009],[-2.686132812499977,9.43173828125002],[-2.705761718749983,9.351367187499989],[-2.74692382812492,9.04511718750004],[-2.689892578124955,9.02509765625004],[-2.649218750000017,8.956591796875031],[-2.600390625000017,8.800439453125023],[-2.505859375000028,8.208740234375],[-2.538281249999955,8.171630859374986],[-2.61171875,8.147558593749963],[-2.619970703125006,8.12109375],[-2.600976562499937,8.082226562499983],[-2.613378906249977,8.046679687500017],[-2.668847656249994,8.022216796875014],[-2.789746093749955,7.931933593750003],[-2.959082031249977,7.454541015624997],[-3.227148437499977,6.749121093749991],[-2.998291015624972,5.711328125000051],[-2.793652343749955,5.600097656250028],[-2.754980468749977,5.432519531249994],[-2.815673828125,5.153027343749997],[-3.168701171874972,5.203027343749966],[-3.199951171874943,5.3544921875],[-3.347558593749994,5.13066406249996],[-4.120166015625017,5.309716796875023],[-4.60888671875,5.235888671875003],[-4.037207031249977,5.23012695312498],[-4.899707031249932,5.138330078125023],[-5.282373046874994,5.210253906250017],[-5.36752929687492,5.15078125],[-5.061816406249989,5.13066406249996],[-5.913769531249926,5.0109375],[-7.544970703124989,4.351318359375],[-7.574658203124983,4.572314453124989],[-7.585058593749977,4.916748046875],[-7.39990234375,5.550585937499989],[-7.454394531249989,5.841308593749972],[-7.636132812499994,5.90771484375],[-7.730371093749994,5.919042968749991],[-7.800927734374994,6.038916015624991],[-7.833251953125,6.076367187499983],[-7.855517578125017,6.150146484375],[-7.888623046875011,6.234863281250028],[-7.981591796874937,6.2861328125],[-8.287109375,6.31904296875004],[-8.587890625,6.490527343749989],[-8.324511718749989,6.920019531249991],[-8.408740234374989,7.411816406249997],[-8.429980468749989,7.601855468749989],[-8.351757812499926,7.590576171875],[-8.231884765624955,7.556738281250034],[-8.205957031249994,7.590234375000023],[-8.115429687499926,7.760742187500028],[-8.126855468749937,7.867724609374974],[-8.00986328124992,8.078515625000023],[-8.048583984375,8.169726562500045],[-8.140625,8.181445312500031],[-8.217138671874949,8.219677734375011],[-8.256103515625,8.253710937500017],[-8.244140624999943,8.407910156249983],[-8.236962890624994,8.455664062500034],[-7.953125,8.477734375],[-7.823583984374977,8.467675781249994],[-7.738964843749983,8.375244140624986],[-7.696093749999932,8.375585937499977],[-7.71958007812492,8.643017578125011],[-7.950976562499989,8.786816406249997],[-7.938183593749983,8.97978515624996],[-7.902099609375,9.017089843750014],[-7.777978515624937,9.080859375000031],[-7.799804687499943,9.115039062499989],[-7.839404296875017,9.151611328124972],[-7.918066406249949,9.188525390625031],[-7.896191406249955,9.415869140624991],[-8.136962890624972,9.49570312499999],[-8.155175781249937,9.973193359375017],[-7.990625,10.1625],[-7.661132812500028,10.427441406250011],[-7.385058593749989,10.340136718749989],[-7.01708984375,10.143261718750026],[-6.950341796874994,10.342333984374989],[-6.693261718750023,10.34946289062502],[-6.669335937499937,10.39218750000002],[-6.69199218749992,10.512011718750017],[-6.686132812499977,10.578027343750051],[-6.676367187499949,10.633789062500043],[-6.654150390624949,10.65644531250004],[-6.482617187499983,10.561230468749997],[-6.250244140625,10.717919921875037],[-6.190673828124943,10.400292968749994],[-6.192626953124972,10.369433593750003],[-6.241308593749949,10.279199218750009],[-6.238378906249977,10.26162109374998],[-6.117187499999972,10.201904296874986],[-6.034570312499937,10.194824218750057],[-5.907568359375006,10.307226562500034],[-5.896191406249983,10.354736328125028],[-5.843847656249977,10.389550781250023],[-5.694287109374983,10.433203125000034],[-5.556591796874983,10.439941406249986],[-5.382275390625011,10.314013671875003],[-5.262304687499977,10.319677734374991]]]},"properties":{"name":"Côte d'Ivoire","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[15.480078125,7.523779296874991],[15.206738281250011,7.206152343749991],[14.7392578125,6.27978515625],[14.43115234375,6.038720703124994],[14.616894531250011,5.865136718749994],[14.56298828125,5.279931640624994],[14.73125,4.602392578124991],[15.063574218750006,4.284863281249997],[15.128710937500017,3.826904296875],[16.0634765625,2.90859375],[16.183398437500017,2.270068359374989],[16.059375,1.676220703124997],[15.741601562500023,1.914990234374997],[14.902441406250006,2.012304687499991],[14.578906250000017,2.199121093749994],[13.293554687500006,2.161572265624997],[13.2203125,2.256445312499991],[11.558984375000023,2.302197265624997],[11.348437500000017,2.299707031249994],[11.328710937500006,2.167431640624997],[11.096582031250023,2.16748046875],[10.790917968750023,2.16757812499999],[9.979882812500023,2.167773437499989],[9.8701171875,2.21328125],[9.8369140625,2.242382812499997],[9.830371093750017,2.275488281249991],[9.826171875,2.297802734374997],[9.80078125,2.304443359375],[9.82177734375,2.539257812499997],[9.948437500000011,3.079052734374997],[9.672070312500011,3.53759765625],[9.765722656250006,3.623828124999989],[9.642382812500017,3.611767578124997],[9.55615234375,3.798046875],[9.739648437500023,3.852929687499994],[9.639941406250017,3.96533203125],[9.688867187500023,4.056396484375],[9.483691406250017,4.066113281249997],[9.42529296875,3.922314453124997],[9.000097656250006,4.091601562499989],[8.918261718750017,4.553759765624989],[8.660351562500011,4.670996093749991],[8.65625,4.516357421875],[8.53955078125,4.571875],[8.715625,5.046875],[8.997167968750006,5.917724609375],[9.490234375,6.418652343749997],[9.779882812500006,6.76015625],[9.820703125000023,6.783935546875],[9.874218750000011,6.803271484374989],[10.038867187500017,6.92138671875],[10.1435546875,6.996435546874991],[10.167773437500017,6.959179687499997],[10.185546875,6.912792968749997],[10.205468750000023,6.8916015625],[10.293066406250006,6.876757812499989],[10.413183593750006,6.877734374999989],[10.60625,7.063085937499991],[10.954199218750006,6.7765625],[11.032519531250017,6.697900390624994],[11.1064453125,6.457714843749997],[11.1533203125,6.437939453124997],[11.2373046875,6.450537109374991],[11.401757812500023,6.533935546875],[11.551660156250023,6.697265625],[11.580078125,6.888867187499997],[11.657519531250017,6.9515625],[11.861425781250006,7.11640625],[11.767382812500017,7.272265624999989],[11.809179687500006,7.345068359374991],[12.016015625000023,7.589746093749994],[12.2333984375,8.282324218749991],[12.403515625000011,8.595556640624991],[12.582714843750011,8.624121093749991],[12.651562500000011,8.667773437499989],[12.7822265625,8.81787109375],[12.806542968750023,8.886621093749994],[12.875683593750011,9.303515624999989],[12.929492187500017,9.42626953125],[13.19873046875,9.563769531249989],[13.269921875000023,10.036181640624989],[13.41455078125,10.171435546874989],[13.535351562500011,10.60507812499999],[13.699902343750011,10.873144531249991],[13.89208984375,11.140087890624997],[13.9814453125,11.211865234374997],[14.056738281250006,11.245019531249994],[14.143261718750011,11.24853515625],[14.202343750000011,11.268164062499991],[14.559765625000011,11.492285156249991],[14.619726562500006,12.150976562499991],[14.518945312500023,12.298242187499994],[14.272851562500023,12.356494140624989],[14.184863281250017,12.447216796874997],[14.06396484375,13.07851562499999],[14.244824218750011,13.07734375],[14.461718750000017,13.021777343749989],[14.847070312500023,12.502099609374994],[15.08125,11.845507812499989],[15.029882812500006,11.11367187499999],[15.132226562500023,10.648486328124989],[15.276074218750011,10.357373046874997],[15.654882812500006,10.0078125],[14.243261718750006,9.979736328125],[13.977246093750011,9.691552734374994],[14.332324218750017,9.20351562499999],[15.1162109375,8.557324218749997],[15.5498046875,7.787890624999989],[15.480078125,7.523779296874991]]]},"properties":{"name":"Cameroon","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[27.4033203125,5.109179687499989],[27.7880859375,4.644677734374994],[28.19208984375001,4.350244140624994],[28.427539062500017,4.324169921874997],[28.72705078125,4.504980468749991],[29.224902343750017,4.391894531249989],[29.469628906250023,4.61181640625],[29.676855468750006,4.5869140625],[30.194921875,3.98193359375],[30.50830078125,3.835693359375],[30.586718750000017,3.62421875],[30.757226562500023,3.62421875],[30.83857421875001,3.49072265625],[30.90644531250001,3.408935546875],[30.754003906250006,3.041796874999989],[30.8466796875,2.847021484374991],[30.728613281250006,2.455371093749989],[31.176367187500006,2.270068359374989],[31.252734375000017,2.044580078124994],[29.94287109375,0.819238281249994],[29.934472656250023,0.4990234375],[29.717675781250023,0.098339843749997],[29.576953125000017,-1.387890625000011],[29.196582031250017,-1.719921875000011],[29.13154296875001,-2.195117187500003],[28.876367187500023,-2.400292968750009],[28.893945312500023,-2.635058593750003],[29.01435546875001,-2.72021484375],[29.224414062500017,-3.053515625],[29.211816406250023,-3.833789062500003],[29.403222656250023,-4.449316406250006],[29.404199218750023,-4.496679687500006],[29.32568359375,-4.835644531250011],[29.32343750000001,-4.898828125],[29.3427734375,-4.983105468750011],[29.542382812500023,-5.499804687500003],[29.594140625000023,-5.65078125],[29.60703125,-5.72265625],[29.59638671875001,-5.775976562500006],[29.490820312500006,-5.965429687500006],[29.480078125,-6.025],[29.50625,-6.172070312500011],[29.540820312500017,-6.313867187500009],[29.590625,-6.394433593750009],[29.70966796875001,-6.616894531250011],[29.798144531250017,-6.69189453125],[29.961816406250023,-6.803125],[30.10625,-6.9150390625],[30.212695312500017,-7.037890625],[30.31318359375001,-7.203710937500006],[30.40673828125,-7.460644531250011],[30.75117187500001,-8.193652343750003],[28.89814453125001,-8.485449218750006],[28.869531250000023,-8.785839843750011],[28.400683593750017,-9.224804687500011],[28.60419921875001,-9.678808593750006],[28.6455078125,-10.550195312500009],[28.383398437500006,-11.566699218750003],[28.482519531250006,-11.812109375],[29.064355468750023,-12.348828125000011],[29.48554687500001,-12.41845703125],[29.508203125000023,-12.228222656250011],[29.79511718750001,-12.155468750000011],[29.775195312500017,-13.438085937500006],[29.55419921875,-13.248925781250009],[29.20185546875001,-13.398339843750009],[29.014257812500006,-13.368847656250011],[28.730078125,-12.925488281250011],[28.550878906250006,-12.836132812500011],[28.412890625000017,-12.51806640625],[27.573828125,-12.22705078125],[27.1591796875,-11.579199218750006],[26.824023437500017,-11.965234375],[26.025976562500006,-11.89013671875],[25.349414062500017,-11.623046875],[25.28876953125001,-11.21240234375],[24.3779296875,-11.417089843750006],[24.36572265625,-11.1298828125],[23.96650390625001,-10.871777343750011],[23.901171875000017,-10.983203125],[23.833886718750023,-11.013671875],[23.463964843750006,-10.969335937500006],[23.076269531250006,-11.087890625],[22.814746093750017,-11.080273437500011],[22.56103515625,-11.055859375000011],[22.486132812500017,-11.08671875],[22.392968750000023,-11.159472656250003],[22.31494140625,-11.198632812500009],[22.27880859375,-11.194140625],[22.226171875,-11.121972656250009],[22.203515625000023,-10.829492187500009],[22.307031250000023,-10.691308593750009],[22.19775390625,-10.040625],[21.81318359375001,-9.46875],[21.905371093750006,-8.693359375],[21.806054687500023,-7.32861328125],[21.751074218750006,-7.30546875],[21.190332031250023,-7.284960937500003],[20.910937500000017,-7.281445312500011],[20.607812500000023,-7.277734375],[20.558398437500017,-7.244433593750003],[20.53583984375001,-7.182812500000011],[20.536914062500017,-7.121777343750011],[20.598730468750006,-6.93515625],[20.59003906250001,-6.919921875],[20.482226562500017,-6.915820312500003],[20.190039062500006,-6.9462890625],[19.997460937500023,-6.976464843750009],[19.87519531250001,-6.986328125],[19.527636718750017,-7.144433593750009],[19.483789062500023,-7.279492187500011],[19.479882812500023,-7.47216796875],[19.371679687500006,-7.655078125],[19.369921875000017,-7.70654296875],[19.3408203125,-7.966601562500003],[19.142675781250006,-8.00146484375],[18.944433593750006,-8.00146484375],[18.56269531250001,-7.9359375],[18.0087890625,-8.107617187500011],[17.643359375000017,-8.090722656250009],[17.57958984375,-8.099023437500009],[16.984765625000023,-7.257421875],[16.91943359375,-6.933984375],[16.813085937500006,-6.772558593750006],[16.742968750000017,-6.618457031250003],[16.697265625,-6.164257812500011],[16.537109375,-5.9658203125],[16.431445312500017,-5.900195312500003],[16.315234375000017,-5.865625],[13.978515625,-5.857226562500003],[13.346484375000017,-5.863378906250006],[13.184375,-5.85625],[12.452929687500017,-6.00048828125],[12.213671875000017,-5.758691406250009],[12.484570312500011,-5.71875],[12.451464843750017,-5.071484375000011],[12.502734375000017,-5.036914062500003],[12.573535156250017,-4.99658203125],[12.59619140625,-4.978417968750009],[12.8296875,-4.736621093750003],[12.947460937500011,-4.6953125],[13.057324218750011,-4.651074218750011],[13.07275390625,-4.634765625],[13.08740234375,-4.601953125],[13.136621093750023,-4.604296875],[13.414941406250023,-4.83740234375],[13.659570312500023,-4.721484375],[13.717089843750017,-4.454492187500009],[13.94091796875,-4.484667968750003],[14.358300781250023,-4.299414062500006],[14.449804687500006,-4.449511718750003],[14.365429687500011,-4.585546875],[14.410742187500006,-4.83125],[14.707910156250023,-4.881738281250009],[15.990039062500017,-3.766210937500006],[16.217382812500006,-3.0302734375],[16.21533203125,-2.177832031250006],[16.54072265625001,-1.840136718750003],[16.8798828125,-1.225878906250003],[17.752832031250023,-0.549023437500011],[18.072167968750023,2.01328125],[18.49091796875001,2.924414062499991],[18.6103515625,3.478417968749994],[18.594140625000023,4.346240234374989],[19.06855468750001,4.891406249999989],[19.5009765625,5.127490234374989],[19.806542968750023,5.089306640624997],[20.226367187500017,4.829638671874989],[20.55810546875,4.462695312499989],[22.422167968750017,4.134960937499997],[22.864550781250017,4.723876953125],[23.41718750000001,4.663134765624989],[24.31982421875,4.994140625],[25.065234375000017,4.967431640624994],[25.52509765625001,5.31210937499999],[26.822070312500017,5.062402343749994],[27.071875,5.199755859374989],[27.4033203125,5.109179687499989]]]},"properties":{"name":"Dem. Rep. Congo","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[18.6103515625,3.478417968749994],[18.49091796875001,2.924414062499991],[18.072167968750023,2.01328125],[17.752832031250023,-0.549023437500011],[16.8798828125,-1.225878906250003],[16.54072265625001,-1.840136718750003],[16.21533203125,-2.177832031250006],[16.217382812500006,-3.0302734375],[15.990039062500017,-3.766210937500006],[14.707910156250023,-4.881738281250009],[14.410742187500006,-4.83125],[14.365429687500011,-4.585546875],[14.449804687500006,-4.449511718750003],[14.358300781250023,-4.299414062500006],[13.94091796875,-4.484667968750003],[13.717089843750017,-4.454492187500009],[13.659570312500023,-4.721484375],[13.414941406250023,-4.83740234375],[13.136621093750023,-4.604296875],[13.08740234375,-4.601953125],[13.07275390625,-4.634765625],[13.048046875000011,-4.619238281250006],[12.971386718750011,-4.5517578125],[12.881054687500011,-4.445117187500003],[12.84814453125,-4.428906250000011],[12.50146484375,-4.5875],[12.018359375000017,-5.004296875],[11.777539062500011,-4.565820312500009],[11.130175781250017,-3.916308593750003],[11.234472656250006,-3.690820312500009],[11.504296875000023,-3.5203125],[11.685742187500011,-3.68203125],[11.8798828125,-3.665917968750009],[11.934179687500006,-3.318554687500011],[11.715429687500006,-3.176953125000011],[11.760156250000023,-2.983105468750011],[11.537792968750011,-2.83671875],[11.60546875,-2.342578125],[12.064453125,-2.41259765625],[12.446386718750006,-2.329980468750009],[12.43212890625,-1.928906250000011],[12.590429687500006,-1.826855468750011],[12.793554687500006,-1.931835937500011],[12.991992187500017,-2.313378906250009],[13.464941406250006,-2.395410156250009],[13.733789062500023,-2.138476562500003],[13.886914062500011,-2.465429687500006],[13.993847656250011,-2.490625],[14.199804687500006,-2.354199218750011],[14.162890625000017,-2.217578125],[14.383984375000011,-1.890039062500009],[14.47412109375,-0.573437500000011],[13.860058593750011,-0.203320312500011],[13.949609375000023,0.353808593749989],[14.32421875,0.62421875],[14.429882812500011,0.901464843749991],[14.180859375000011,1.370214843749991],[13.851367187500017,1.41875],[13.21630859375,1.2484375],[13.172167968750017,1.78857421875],[13.293554687500006,2.161572265624997],[14.578906250000017,2.199121093749994],[14.902441406250006,2.012304687499991],[15.741601562500023,1.914990234374997],[16.059375,1.676220703124997],[16.183398437500017,2.270068359374989],[16.468554687500017,2.831738281249997],[16.610742187500023,3.50537109375],[17.491601562500023,3.687304687499989],[18.160937500000017,3.499804687499989],[18.474414062500017,3.622998046874997],[18.6103515625,3.478417968749994]]]},"properties":{"name":"Congo","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-71.31972656249997,11.861914062500048],[-71.95810546875,11.66640625],[-72.24848632812501,11.196435546875009],[-72.690087890625,10.835839843749994],[-72.86933593750001,10.49125976562496],[-73.00654296874998,9.789160156250006],[-73.36621093749997,9.194140625000017],[-73.05839843749999,9.259570312500031],[-72.79638671874997,9.10898437499999],[-72.66542968749994,8.62758789062498],[-72.39033203124995,8.287060546874969],[-72.47197265624996,7.524267578124991],[-72.20771484374995,7.37026367187498],[-72.00664062499993,7.032617187500023],[-71.12861328124993,6.98671875],[-70.73715820312503,7.090039062499997],[-70.12919921874999,6.95361328125],[-69.42714843749997,6.123974609374997],[-68.47177734375,6.156542968749974],[-67.85917968749999,6.289892578124963],[-67.48198242187499,6.18027343750002],[-67.47387695312503,5.929980468750003],[-67.82490234374995,5.270458984375026],[-67.85527343750002,4.506884765624989],[-67.66162109375,3.864257812499986],[-67.3111328125,3.41586914062502],[-67.85908203124998,2.793603515624994],[-67.61870117187496,2.793603515624994],[-67.21083984375,2.390136718750043],[-66.87602539062499,1.223046875000037],[-67.082275390625,1.185400390625006],[-67.11923828124998,1.703613281249986],[-67.40043945312499,2.116699218750028],[-67.93623046874998,1.748486328124969],[-68.19379882812495,1.987011718749983],[-68.25595703125,1.845507812500017],[-68.17656249999999,1.719824218749991],[-69.84858398437493,1.708740234375043],[-69.85214843750003,1.05952148437504],[-69.31181640624999,1.050488281249969],[-69.15332031249994,0.65878906250002],[-69.47211914062498,0.72993164062504],[-70.05390624999993,0.578613281250028],[-70.07050781249993,-0.13886718750004],[-69.63398437500001,-0.50927734375],[-69.40024414062498,-1.194921874999977],[-69.66904296875003,-2.667675781249997],[-69.94819335937498,-4.200585937500009],[-69.96591796875003,-4.2359375],[-70.16752929687499,-4.050195312500009],[-70.24028320312496,-3.882714843749994],[-70.2984375,-3.844238281249972],[-70.33950195312502,-3.814355468750009],[-70.73510742187497,-3.781542968749989],[-70.09584960937494,-2.658203125000014],[-70.16474609374995,-2.639843750000011],[-70.24443359375002,-2.606542968749977],[-70.29462890624995,-2.552539062499989],[-70.57587890624995,-2.418261718749989],[-70.64799804687499,-2.405761718750014],[-70.70537109374996,-2.341992187499983],[-70.91455078125003,-2.218554687499974],[-70.96855468750002,-2.206835937499989],[-71.02729492187498,-2.225781250000026],[-71.11337890625003,-2.245410156250031],[-71.19638671874998,-2.313085937499963],[-71.39697265625,-2.334082031249977],[-71.55947265624997,-2.224218749999977],[-71.75253906249995,-2.15273437499998],[-71.80273437499997,-2.166308593749989],[-71.86728515624998,-2.227734374999983],[-71.932470703125,-2.288671874999963],[-71.98427734375,-2.326562499999952],[-72.21845703125001,-2.400488281250006],[-72.94111328124998,-2.394042968750028],[-72.9896484375,-2.33974609374998],[-73.15449218749993,-2.278222656249966],[-73.19697265624995,-1.830273437500011],[-73.49628906249993,-1.69306640625004],[-73.66430664062497,-1.248828124999946],[-73.86318359374997,-1.19667968749998],[-73.92695312500001,-1.125195312499983],[-73.98681640625003,-1.098144531249986],[-74.05439453124995,-1.028613281250031],[-74.18076171875,-0.997753906249955],[-74.24638671874999,-0.970605468750023],[-74.28388671874998,-0.927832031250006],[-74.33442382812498,-0.85087890624996],[-74.41787109375,-0.580664062499977],[-74.46518554687498,-0.517675781250034],[-74.51386718749993,-0.470117187500023],[-74.555078125,-0.429882812499997],[-74.61635742187494,-0.370019531249966],[-74.691650390625,-0.335253906249989],[-74.75537109375003,-0.298632812499989],[-74.78046874999998,-0.24453125],[-74.80175781249997,-0.200097656249994],[-75.13837890624998,-0.050488281249969],[-75.28447265624999,-0.10654296875002],[-75.77666015624999,0.08925781249998],[-76.27060546874998,0.439404296874997],[-76.49462890624997,0.23544921875002],[-77.396337890625,0.393896484374963],[-77.46767578124997,0.636523437500017],[-77.702880859375,0.837841796874997],[-78.1806640625,0.968554687499974],[-78.85966796874996,1.455371093750031],[-79.02543945312499,1.623681640625037],[-78.79296874999994,1.848730468749963],[-78.576904296875,1.773779296874977],[-78.59169921875,2.356640624999969],[-78.41689453125,2.483496093749963],[-78.06665039062494,2.509130859375034],[-77.81357421875,2.716357421874974],[-77.076806640625,3.913281250000026],[-77.26352539062503,3.893212890625023],[-77.27802734374995,4.058496093750023],[-77.35820312499996,3.944726562500037],[-77.40874023437496,4.24775390625004],[-77.52070312499993,4.212792968750023],[-77.35351562499997,4.398291015624977],[-77.28632812499995,4.72172851562496],[-77.373291015625,5.323974609375],[-77.53442382812497,5.537109374999986],[-77.24926757812497,5.780175781250037],[-77.46943359374995,6.176757812500014],[-77.368798828125,6.575585937499994],[-77.90117187499999,7.229345703125048],[-77.76191406249995,7.698828125000034],[-77.53828124999995,7.56625976562502],[-77.19599609374995,7.972460937500003],[-77.47851562499994,8.498437500000037],[-77.37421874999993,8.65830078125002],[-76.85185546875002,8.09047851562498],[-76.924658203125,7.973193359374974],[-76.78657226562493,7.931591796875026],[-76.7720703125,8.310546875000043],[-76.92045898437496,8.573730468750014],[-76.27685546875,8.989111328124991],[-76.02724609374997,9.365771484374989],[-75.63935546874998,9.450439453125014],[-75.680029296875,9.729785156249989],[-75.53857421874997,10.205175781250034],[-75.708349609375,10.143408203124963],[-75.44599609374995,10.610888671874989],[-74.84458007812498,11.109716796875006],[-74.330224609375,10.996679687499991],[-74.51625976562497,10.8625],[-74.40087890625,10.76523437499999],[-74.14291992187503,11.320849609375031],[-73.31337890624997,11.295751953124991],[-72.275,11.88925781250002],[-72.13574218749994,12.188574218749977],[-71.71455078124993,12.41997070312496],[-71.26210937499997,12.335302734375034],[-71.13730468750003,12.04633789062504],[-71.31972656249997,11.861914062500048]]]},"properties":{"name":"Colombia","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[43.788671875,-12.307031250000023],[43.85898437500006,-12.368261718749977],[43.66367187500006,-12.342871093749949],[43.63134765624997,-12.247070312499972],[43.788671875,-12.307031250000023]]],[[[44.476367187500074,-12.08154296875],[44.504980468750006,-12.356542968749991],[44.220117187499994,-12.171386718750014],[44.476367187500074,-12.08154296875]]],[[[43.46582031249997,-11.901269531249966],[43.226660156250006,-11.75185546874998],[43.2990234375001,-11.374511718750028],[43.39296875000005,-11.408593749999952],[43.46582031249997,-11.901269531249966]]]]},"properties":{"name":"Comoros","childNum":3}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-24.308251953124966,14.856298828124991],[-24.44052734374992,14.834814453124963],[-24.496875,14.980273437500017],[-24.329492187499937,15.019482421875011],[-24.308251953124966,14.856298828124991]]],[[[-23.18212890624997,15.136767578125017],[-23.210253906250017,15.32353515625006],[-23.119335937499955,15.26840820312502],[-23.18212890624997,15.136767578125017]]],[[[-23.444238281249994,15.00795898437498],[-23.5046875,14.916113281250006],[-23.70537109374999,14.96132812499998],[-23.74809570312499,15.328515625],[-23.444238281249994,15.00795898437498]]],[[[-22.917724609375,16.237255859374955],[-22.69262695312497,16.169042968750006],[-22.710107421874994,16.043359374999966],[-22.95927734374996,16.045117187499983],[-22.917724609375,16.237255859374955]]],[[[-24.08769531249999,16.62250976562501],[-24.03271484374997,16.57202148437503],[-24.243066406250023,16.599414062500017],[-24.32236328124992,16.49311523437504],[-24.398095703124966,16.61840820312497],[-24.08769531249999,16.62250976562501]]],[[[-22.888330078124966,16.659082031249994],[-22.980615234374937,16.700878906249983],[-22.93291015624999,16.84101562500004],[-22.888330078124966,16.659082031249994]]],[[[-24.88706054687495,16.81811523437497],[-25.09306640624999,16.83251953125],[-24.936474609374983,16.92211914062503],[-24.88706054687495,16.81811523437497]]],[[[-25.169824218749994,16.94648437500001],[-25.308300781249955,16.93583984374999],[-25.337109374999955,17.091015624999983],[-25.03466796875,17.176464843749983],[-24.979687499999983,17.09472656250003],[-25.169824218749994,16.94648437500001]]]]},"properties":{"name":"Cape Verde","childNum":8}},{"geometry":{"type":"Polygon","coordinates":[[[-83.6419921875,10.917236328125],[-83.346826171875,10.315380859374997],[-82.77841796874999,9.66953125],[-82.56357421874999,9.57666015625],[-82.56923828125,9.55820312499999],[-82.58652343749999,9.538818359375],[-82.64409179687499,9.505859375],[-82.801025390625,9.591796875],[-82.843994140625,9.57080078125],[-82.86015624999999,9.511474609375],[-82.88896484374999,9.481005859374989],[-82.925048828125,9.469042968749989],[-82.93984375,9.449169921874997],[-82.94033203125,9.060107421874989],[-82.88134765625,9.055859375],[-82.78305664062499,8.990283203124989],[-82.741162109375,8.951708984374989],[-82.72783203124999,8.916064453124989],[-82.91704101562499,8.740332031249991],[-82.855712890625,8.635302734374989],[-82.84477539062499,8.489355468749991],[-82.86162109374999,8.45351562499999],[-83.02734375,8.337744140624991],[-82.879345703125,8.070654296874991],[-83.12333984374999,8.353076171874989],[-83.16240234374999,8.588183593749989],[-83.4697265625,8.706835937499989],[-83.29150390625,8.406005859375],[-83.54375,8.445849609374989],[-83.73408203125,8.614453125],[-83.613720703125,8.804052734374991],[-83.73691406249999,9.150292968749994],[-84.58159179687499,9.568359375],[-84.71494140624999,9.8994140625],[-85.23564453124999,10.242089843749994],[-85.2365234375,10.107373046874997],[-84.88642578125,9.820947265624994],[-85.07705078125,9.60195312499999],[-85.31455078124999,9.8109375],[-85.62485351562499,9.902441406249991],[-85.84965820312499,10.292041015624989],[-85.667236328125,10.745019531249994],[-85.90800781249999,10.897558593749991],[-85.7443359375,11.06210937499999],[-85.5841796875,11.189453125],[-84.9091796875,10.9453125],[-84.6341796875,11.045605468749997],[-83.91928710937499,10.7353515625],[-83.71293945312499,10.785888671875],[-83.6419921875,10.917236328125]]]},"properties":{"name":"Costa Rica","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-82.56176757812503,21.571679687500023],[-82.959619140625,21.441308593750023],[-83.18378906250001,21.59345703125004],[-82.97358398437498,21.592285156250057],[-83.08251953124997,21.791406250000023],[-82.99121093750003,21.942724609375034],[-82.71455078124998,21.890283203125023],[-82.56176757812503,21.571679687500023]]],[[[-77.66899414062493,21.951953125000045],[-77.91855468749998,22.088085937499983],[-77.63369140624994,22.054003906250074],[-77.66899414062493,21.951953125000045]]],[[[-77.87939453125,22.127539062500034],[-78.04165039062502,22.201269531250034],[-77.99921874999998,22.298730468749994],[-77.87939453125,22.127539062500034]]],[[[-81.83745117187499,23.163037109374955],[-81.26235351562497,23.156835937500034],[-81.14462890624998,23.054931640625057],[-80.65014648437494,23.10307617187499],[-80.36489257812502,22.943408203125074],[-79.82026367187498,22.887011718750045],[-79.27568359374999,22.407617187499994],[-78.68647460937493,22.366845703125023],[-77.63681640624995,21.79736328125],[-77.49711914062502,21.78833007812503],[-77.58315429687497,21.889257812499977],[-77.49726562499995,21.871630859375045],[-77.14414062499995,21.643603515625017],[-77.36616210937498,21.612646484375034],[-77.25288085937498,21.483496093750006],[-77.0986328125,21.589013671875023],[-76.86743164062497,21.330419921875006],[-75.72294921874996,21.111035156249983],[-75.59580078125,20.99467773437499],[-75.72456054687493,20.71455078125004],[-74.882568359375,20.65063476562497],[-74.51313476562495,20.384570312500045],[-74.16748046874997,20.292187499999955],[-74.15371093750002,20.168554687500006],[-75.11640624999995,19.901416015625017],[-75.151611328125,20.008349609375045],[-75.29047851562495,19.893115234375017],[-76.15844726562497,19.98974609374997],[-77.715087890625,19.85546874999997],[-77.10380859374999,20.407519531250017],[-77.22958984374995,20.64375],[-78.11635742187497,20.761865234374994],[-78.49077148437493,21.05371093750003],[-78.72768554687497,21.592724609374955],[-79.35742187500003,21.58515625000001],[-80.23134765625,21.872167968750063],[-80.48544921874998,22.1234375],[-81.03564453124997,22.073583984375063],[-81.18549804687495,22.26796875000005],[-81.284375,22.109423828125074],[-81.84941406249993,22.21367187499999],[-82.077734375,22.3876953125],[-81.71035156250002,22.496679687500006],[-81.83881835937498,22.672460937500034],[-82.73803710937497,22.689257812500074],[-83.37963867187503,22.222998046875034],[-83.90073242187495,22.17011718750001],[-84.03095703124993,21.94311523437503],[-84.502587890625,21.776171875000045],[-84.50136718750002,21.930273437499977],[-84.88720703125003,21.856982421875074],[-84.32636718749998,22.074316406250034],[-84.36127929687498,22.37890625],[-84.04492187500003,22.666015625000057],[-83.25781249999997,22.967578125000017],[-81.83745117187499,23.163037109374955]]]]},"properties":{"name":"Cuba","childNum":4}},{"geometry":{"type":"Polygon","coordinates":[[[-68.75107421874999,12.059765625],[-68.9951171875,12.141845703125],[-69.15888671875,12.380273437499994],[-68.75107421874999,12.059765625]]]},"properties":{"name":"Curaçao","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-81.36953124999997,19.34887695312497],[-81.10712890624995,19.305175781250057],[-81.40478515624994,19.278417968750006],[-81.36953124999997,19.34887695312497]]],[[[-79.823388671875,19.711914062500057],[-79.90620117187501,19.702539062499994],[-79.74228515625,19.757128906250017],[-79.823388671875,19.711914062500057]]]]},"properties":{"name":"Cayman Is.","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[34.004492187500006,35.065234375],[33.47578125000001,35.000341796875],[33.3837890625,35.1626953125],[32.91953125,35.087841796875],[32.71269531250002,35.171044921874994],[32.8798828125,35.180566406249994],[32.94160156250001,35.390429687499996],[33.60761718750001,35.354150390624994],[34.55605468750002,35.662060546875],[33.941992187500006,35.292041015624996],[34.004492187500006,35.065234375]]]},"properties":{"name":"N. Cyprus","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[32.71269531250002,35.171044921874994],[32.91953125,35.087841796875],[33.3837890625,35.1626953125],[33.47578125000001,35.000341796875],[34.004492187500006,35.065234375],[34.05019531250002,34.98837890625],[33.69941406250001,34.969873046874994],[33.007910156250006,34.569580078125],[32.44902343750002,34.729443359375],[32.31718750000002,34.9533203125],[32.30097656250001,35.082958984375],[32.71269531250002,35.171044921874994]]]},"properties":{"name":"Cyprus","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[14.809375,50.858984375],[14.895800781250017,50.861376953124996],[14.98291015625,50.886572265625],[14.99375,51.01435546875],[16.007226562500023,50.611621093749996],[16.2822265625,50.655615234375],[16.419726562500017,50.573632812499994],[16.210351562500023,50.423730468749994],[16.63916015625,50.1021484375],[16.989648437500023,50.2369140625],[16.88007812500001,50.427050781249996],[17.41523437500001,50.254785156249994],[17.702246093750006,50.307177734374996],[17.627050781250006,50.11640625],[17.874804687500017,49.972265625],[18.0283203125,50.03525390625],[18.562402343750023,49.879345703125],[18.83222656250001,49.510791015624996],[18.160937500000017,49.257373046874996],[18.0859375,49.06513671875],[17.75849609375001,48.888134765625],[17.135644531250023,48.841064453125],[16.953125,48.598828125],[16.543554687500006,48.796240234375],[16.057226562500006,48.754785156249994],[15.066796875000023,48.997851562499996],[14.691308593750023,48.59921875],[14.049121093750017,48.602490234375],[13.814746093750017,48.766943359375],[13.769921875000023,48.815966796874996],[13.684960937500023,48.876708984375],[13.547656250000017,48.95966796875],[13.440722656250017,48.95556640625],[13.401171875000017,48.977587890624996],[12.916699218750011,49.33046875],[12.68115234375,49.414501953125],[12.390527343750023,49.739648437499994],[12.5125,49.87744140625],[12.09921875,50.310986328125],[12.134863281250006,50.3109375],[12.1748046875,50.288378906249996],[12.231152343750011,50.244873046875],[12.27734375,50.181445312499996],[12.3056640625,50.205712890624994],[12.549023437500011,50.393408203125],[13.016406250000017,50.490380859374994],[13.18115234375,50.510498046875],[14.369042968750023,50.898730468749996],[14.319726562500023,51.03779296875],[14.545703125000017,50.993945312499996],[14.559667968750006,50.954931640625],[14.59521484375,50.918603515624994],[14.623828125000017,50.91474609375],[14.613574218750017,50.85556640625],[14.658203125,50.8326171875],[14.723339843750011,50.814697265625],[14.766503906250023,50.818310546875],[14.797460937500006,50.842333984374996],[14.809375,50.858984375]]]},"properties":{"name":"Czech Rep.","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[14.1982421875,53.919042968750034],[13.92578125,53.879052734374966],[13.827734375,54.12724609374999],[14.1982421875,53.919042968750034]]],[[[13.709179687500011,54.382714843749994],[13.707324218750074,54.281152343749994],[13.190039062500034,54.32563476562501],[13.336816406249994,54.697119140625006],[13.65761718750008,54.55957031249997],[13.709179687500011,54.382714843749994]]],[[[9.739746093750028,54.82553710937498],[10.022167968750011,54.673925781250006],[9.86865234375,54.47246093749999],[10.731542968750006,54.31625976562506],[11.013378906250068,54.37915039062497],[11.008593750000074,54.18115234374997],[10.810742187500068,54.075146484374955],[10.917773437500045,53.99531250000004],[11.39960937500004,53.94462890625002],[12.111328125,54.168310546875006],[12.57539062500004,54.467382812500006],[13.028613281250017,54.411035156249994],[13.448046875000017,54.14086914062503],[13.724218750000063,54.153222656249966],[13.865527343750074,53.85336914062498],[14.258886718750006,53.729638671874994],[14.298730468750051,53.55644531249999],[14.41455078125,53.28349609374996],[14.412304687500011,53.216748046874955],[14.410937500000074,53.19902343749999],[14.368554687500051,53.105566406250034],[14.293164062500068,53.026757812499966],[14.138867187500068,52.93286132812503],[14.128613281250011,52.87822265625002],[14.253710937500017,52.78251953124996],[14.514062500000023,52.645605468750034],[14.619433593750017,52.52851562499998],[14.569726562499994,52.431103515624955],[14.554589843750023,52.35966796874996],[14.573925781250068,52.31416015625001],[14.615625,52.277636718750045],[14.679882812500068,52.25],[14.752539062500034,52.08183593750002],[14.601660156250034,51.832373046875006],[14.738671875000051,51.62714843750004],[14.7109375,51.54492187499997],[14.724707031250063,51.523876953124955],[14.90595703125004,51.463330078124955],[14.935546875000028,51.435351562500045],[14.9638671875,51.095117187499994],[14.917480468750057,51.00874023437498],[14.814257812499989,50.871630859375045],[14.809375,50.858984375000034],[14.797460937500034,50.84233398437502],[14.766503906250051,50.81831054687501],[14.72333984375004,50.81469726562497],[14.658203125,50.832617187500006],[14.613574218750045,50.85556640625006],[14.623828125000017,50.91474609375004],[14.595214843750057,50.91860351562502],[14.559667968750006,50.954931640625034],[14.545703124999989,50.99394531249999],[14.319726562500051,51.037792968749955],[14.36904296875008,50.89873046874996],[13.18115234375,50.510498046875],[13.016406250000017,50.490380859374994],[12.549023437500011,50.393408203125034],[12.3056640625,50.205712890624994],[12.27734375,50.18144531250002],[12.231152343749983,50.24487304687497],[12.174804687500057,50.28837890624996],[12.134863281250006,50.31093750000002],[12.099218750000034,50.31098632812504],[12.089843749999972,50.30175781250003],[12.089746093750051,50.2685546875],[12.207812500000045,50.09750976562498],[12.5125,49.87744140625],[12.390527343750051,49.739648437499994],[12.68115234375,49.41450195312501],[12.91669921875004,49.33046875000002],[13.401171875000074,48.97758789062499],[13.440722656250045,48.95556640625003],[13.547656250000074,48.95966796874998],[13.684960937500051,48.87670898437506],[13.769921875000051,48.81596679687502],[13.814746093750017,48.76694335937498],[13.802929687500011,48.74750976562501],[13.798828124999972,48.62167968750006],[13.785351562499983,48.58745117187502],[13.486621093750074,48.58183593750002],[13.471679687500028,48.57182617187502],[13.459863281250023,48.564550781250034],[13.409375,48.39414062500006],[13.322851562500006,48.33125],[13.215234375000023,48.301904296874994],[12.760351562500063,48.10698242187499],[12.95351562500008,47.890625],[12.897656250000068,47.721875],[13.054101562500051,47.655126953125034],[13.047949218750034,47.57915039062502],[13.031542968750074,47.50800781250001],[13.01435546875004,47.478076171875045],[12.968066406250017,47.475683593750006],[12.878906250000057,47.506445312500034],[12.809375,47.542187499999955],[12.782812500000034,47.56416015624998],[12.781152343750051,47.590429687500006],[12.796191406249989,47.60703125],[12.771386718750023,47.63940429687503],[12.685839843750074,47.66933593750002],[12.209277343750074,47.71826171875003],[12.196875,47.709082031250034],[12.203808593750011,47.64672851562503],[12.185644531250063,47.61953125],[11.041992187500028,47.39311523437496],[10.98085937499999,47.39814453125001],[10.893945312500051,47.470458984375],[10.870605468750028,47.500781250000045],[10.873046874999972,47.52021484375001],[10.741601562500023,47.52412109375001],[10.65869140625,47.547216796875006],[10.482812500000051,47.54179687499996],[10.439453125000028,47.55156249999999],[10.403906250000063,47.41699218750003],[10.369140625,47.366064453125034],[10.18300781250008,47.27880859375003],[10.200292968750063,47.36342773437505],[10.066308593750023,47.39335937500002],[10.074218750000028,47.42851562499999],[10.059863281250045,47.44907226562498],[10.034082031250023,47.47358398437501],[9.971582031249994,47.50532226562498],[9.839160156250017,47.55229492187496],[9.748925781250023,47.575537109375006],[9.524023437500034,47.52421875000002],[8.572656250000023,47.775634765625],[8.435742187500011,47.73134765625002],[8.403417968750006,47.687792968750045],[8.413281250000068,47.66269531249998],[8.451757812500006,47.65180664062498],[8.552343750000063,47.65913085937498],[8.56708984375004,47.65190429687502],[8.57050781250004,47.63779296874998],[8.55947265625008,47.62402343750003],[8.477636718750034,47.61269531250002],[8.454003906249994,47.59619140625003],[7.615625,47.59272460937504],[7.616601562500023,48.15678710937502],[8.134863281250006,48.97358398437498],[7.450585937500051,49.152197265625034],[6.735449218750006,49.16059570312498],[6.344335937500006,49.45273437499998],[6.4873046875,49.798486328124994],[6.204882812500017,49.915136718750034],[6.13818359375,49.97431640625001],[6.10976562500008,50.034375],[6.116503906250045,50.120996093749966],[6.340917968750006,50.451757812500034],[5.993945312500017,50.75043945312504],[6.048437500000034,50.90488281250006],[5.857519531250034,51.030126953125006],[6.129980468750034,51.14741210937501],[6.198828125000034,51.45],[5.948730468750057,51.80268554687501],[6.800390625,51.96738281249998],[6.724511718749994,52.080224609374966],[7.035156250000057,52.38022460937498],[6.748828125000074,52.464013671874994],[6.710742187500045,52.61787109374998],[7.033007812500045,52.65136718749997],[7.197265625000028,53.28227539062499],[7.074316406250034,53.477636718750006],[7.285253906250034,53.68134765625001],[8.00927734375,53.69072265624999],[8.108496093750063,53.46767578125002],[8.245214843750006,53.44531249999997],[8.333886718750051,53.606201171875],[8.495214843750063,53.39423828124998],[8.618945312500045,53.875],[9.20556640625,53.85595703124997],[9.783984375000074,53.554638671874955],[9.31201171875,53.859130859375],[8.92041015625,53.96533203125006],[8.906640625000023,54.26079101562502],[8.625781250000017,54.35395507812501],[8.951855468750011,54.46757812499996],[8.670312500000023,54.903417968750034],[9.739746093750028,54.82553710937498]]],[[[8.307714843750034,54.786962890625034],[8.451464843750017,55.05537109374998],[8.3798828125,54.89985351562501],[8.629589843750068,54.891748046874966],[8.307714843750034,54.786962890625034]]]]},"properties":{"name":"Germany","childNum":4}},{"geometry":{"type":"Polygon","coordinates":[[[43.24599609375002,11.499804687499989],[42.92275390625002,10.999316406249989],[42.557714843750006,11.080761718749997],[41.79824218750002,10.98046875],[41.79267578125001,11.68603515625],[42.378515625,12.46640625],[42.40859375000002,12.494384765625],[42.45,12.521337890624991],[42.47939453125002,12.513623046874997],[42.703710937500006,12.380322265624997],[42.76748046875002,12.4228515625],[42.825292968750006,12.5693359375],[42.86591796875001,12.622802734375],[42.88330078125,12.621289062499997],[43.00566406250002,12.662304687499997],[43.11669921875,12.70859375],[43.353515625,12.367041015624991],[43.38027343750002,12.091259765624997],[42.64003906250002,11.560107421874989],[42.52177734375002,11.572167968749994],[42.58378906250002,11.496777343749997],[43.04277343750002,11.588476562499991],[43.24599609375002,11.499804687499989]]]},"properties":{"name":"Djibouti","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-61.281689453125,15.2490234375],[-61.37539062499999,15.227294921875],[-61.45810546874999,15.633105468750003],[-61.277246093749994,15.526708984374991],[-61.281689453125,15.2490234375]]]},"properties":{"name":"Dominica","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[11.361425781250006,54.891650390625045],[11.739550781250017,54.80742187500002],[11.765917968750074,54.67944335937506],[11.457421875000023,54.628857421874955],[11.035546875000051,54.77309570312505],[11.058593750000028,54.940576171874966],[11.361425781250006,54.891650390625045]]],[[[12.549218750000051,54.96577148437504],[12.11884765625004,54.91440429687506],[12.274023437500034,55.064111328124994],[12.549218750000051,54.96577148437504]]],[[[10.061230468750068,54.88637695312502],[9.80625,54.90600585937503],[9.78125,55.06904296875001],[10.061230468750068,54.88637695312502]]],[[[10.734082031250011,54.750732421875],[10.621679687500006,54.851416015625006],[10.95107421875008,55.15620117187501],[10.734082031250011,54.750732421875]]],[[[15.087695312500017,55.021875],[14.684179687500063,55.10224609375004],[14.765332031250068,55.296728515625034],[15.132617187500017,55.14453125000003],[15.087695312500017,55.021875]]],[[[10.645117187500006,55.60981445312498],[10.785253906250034,55.13339843749998],[10.44277343750008,55.04877929687498],[9.988769531250028,55.163183593750006],[9.860644531250045,55.515478515625034],[10.645117187500006,55.60981445312498]]],[[[12.665722656250068,55.596533203125006],[12.550878906250034,55.55625],[12.59921875,55.68022460937502],[12.665722656250068,55.596533203125006]]],[[[12.56875,55.785058593749966],[12.215039062500011,55.46650390624998],[12.413085937500028,55.28618164062502],[12.089941406250006,55.18813476562505],[12.050390625000034,54.81533203125002],[11.8623046875,54.77260742187502],[11.653808593750057,55.186914062499966],[11.286328125000068,55.20444335937498],[10.978906250000051,55.721533203125006],[11.322265625000028,55.752539062500006],[11.627734375000074,55.95688476562498],[11.819726562500023,55.69765625000002],[11.86640625000004,55.968164062499966],[12.218945312499983,56.11865234374997],[12.578710937500006,56.06406250000006],[12.56875,55.785058593749966]]],[[[11.052148437500051,57.25253906250006],[10.873828125000045,57.26225585937499],[11.174511718750011,57.322900390624994],[11.052148437500051,57.25253906250006]]],[[[9.739746093750028,54.82553710937498],[8.670312500000023,54.903417968750034],[8.61591796875004,55.41821289062503],[8.132128906250074,55.59980468749998],[8.16396484375008,56.60688476562498],[8.671679687500045,56.49565429687496],[8.88808593750008,56.73505859374998],[9.06708984375004,56.79384765625005],[9.196386718750006,56.70166015625],[9.2548828125,57.01171875000003],[8.992773437499977,57.01611328125003],[8.771972656250028,56.72529296875004],[8.468359375,56.66455078125],[8.284082031250023,56.85234374999999],[8.618554687500051,57.11127929687498],[9.43359375,57.17431640625003],[9.96230468750008,57.580957031249994],[10.609960937500034,57.73691406249998],[10.282714843750057,56.620507812499994],[10.926171875000051,56.44326171875002],[10.753417968750028,56.24199218749999],[10.31875,56.212890625],[10.18300781250008,55.86518554687504],[9.903710937500023,55.84282226562502],[10.02363281250004,55.76142578125004],[9.591113281250017,55.49321289062502],[9.670996093750063,55.26640624999999],[9.453710937500006,55.03955078125006],[9.732324218750023,54.96801757812506],[9.739746093750028,54.82553710937498]]]]},"properties":{"name":"Denmark","childNum":10,"cp":[10.2768332,56.1773879]}},{"geometry":{"type":"Polygon","coordinates":[[[-71.647216796875,19.195947265624994],[-71.746484375,19.285839843749997],[-71.71147460937499,19.486572265625],[-71.75742187499999,19.688183593749997],[-71.779248046875,19.718164062499994],[-71.6673828125,19.8486328125],[-70.95415039062499,19.913964843749994],[-70.19384765625,19.63803710937499],[-69.95683593749999,19.671875],[-69.739404296875,19.29921875],[-69.23247070312499,19.27182617187499],[-69.60595703125,19.206494140624997],[-69.62363281249999,19.117822265624994],[-68.684765625,18.90478515625],[-68.33916015624999,18.611523437499997],[-68.68740234375,18.21494140624999],[-68.9349609375,18.408007812500003],[-69.27451171874999,18.43984375],[-69.770654296875,18.443554687499997],[-70.479931640625,18.21728515625],[-70.644677734375,18.336230468750003],[-71.02783203125,18.273193359375],[-71.43896484375,17.63559570312499],[-71.63173828125,17.773632812499997],[-71.768310546875,18.03916015624999],[-71.76376953124999,18.20395507812499],[-71.737255859375,18.270800781250003],[-71.7619140625,18.34130859375],[-71.87255859375,18.416210937499997],[-71.940380859375,18.512597656249994],[-72.000390625,18.597900390625],[-71.98686523437499,18.6103515625],[-71.86650390624999,18.614160156249994],[-71.74321289062499,18.73291015625],[-71.72705078125,18.80322265625],[-71.733642578125,18.856396484374997],[-71.80712890625,18.987011718749997],[-71.647216796875,19.195947265624994]]]},"properties":{"name":"Dominican Rep.","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[8.207617187500006,36.518945312499994],[8.348730468750006,36.36796875],[8.318066406250011,35.654931640624994],[8.31640625,35.403125],[8.35986328125,35.299609375],[8.394238281250011,35.203857421875],[8.312109375,35.084619140624994],[8.27685546875,34.9794921875],[8.24560546875,34.73408203125],[7.513867187500011,34.080517578125],[7.534375,33.717919921874994],[7.877246093750017,33.172119140625],[8.1125,33.055322265624994],[8.333398437500023,32.543603515624994],[9.044042968750006,32.07236328125],[9.160253906250006,31.621337890625],[9.224023437500023,31.373681640624994],[9.51875,30.229394531249994],[9.310253906250011,30.115234375],[9.805273437500006,29.176953125],[9.916015625,27.785693359374996],[9.74755859375,27.330859375],[9.883203125000023,26.630810546874997],[9.491406250000011,26.333740234375],[9.4482421875,26.067138671875],[10.000683593750011,25.332080078125003],[10.255859375,24.591015625],[10.395898437500023,24.485595703125],[10.686132812500006,24.55136718749999],[11.507617187500017,24.314355468749994],[11.967871093750006,23.517871093750003],[7.481738281250017,20.873095703125003],[5.836621093750011,19.479150390624994],[4.227636718750006,19.142773437499997],[3.3564453125,18.986621093750003],[3.119726562500006,19.103173828124994],[3.255859375,19.4109375],[3.130273437500023,19.85019531249999],[1.685449218750023,20.378369140624997],[1.610644531250017,20.555566406249994],[1.165722656250011,20.817431640625003],[1.1455078125,21.102246093749997],[-1.947900390624994,23.124804687500003],[-4.822607421874977,24.99560546875],[-8.683349609375,27.2859375],[-8.683349609375,27.656445312499997],[-8.683349609375,27.900390625],[-8.659912109375,28.718603515625],[-7.485742187499994,29.392236328124994],[-7.427685546874983,29.425],[-7.142431640624977,29.619580078124997],[-6.855566406249977,29.601611328124996],[-6.755126953125,29.583837890625],[-6.635351562499977,29.568798828124997],[-6.597753906249977,29.578955078125],[-6.520556640624989,29.659863281249997],[-6.479736328125,29.820361328124996],[-6.00429687499999,29.83125],[-5.448779296874989,29.956933593749994],[-5.293652343749983,30.058642578124996],[-5.180126953124983,30.166162109374994],[-4.96826171875,30.465380859374996],[-4.778515624999983,30.552392578124994],[-4.529150390624977,30.625537109374996],[-4.322851562499977,30.698876953124994],[-4.148779296874977,30.8095703125],[-3.626904296874983,31.000927734374997],[-3.833398437499994,31.197802734374996],[-3.837109374999983,31.512353515624994],[-3.768164062499977,31.68955078125],[-3.700244140624989,31.700097656249994],[-3.604589843749977,31.686767578125],[-3.439794921874977,31.704541015624997],[-3.017382812499989,31.834277343749996],[-2.988232421874983,31.87421875],[-2.930859374999983,32.042529296874996],[-2.863427734374994,32.07470703125],[-1.275341796874983,32.089013671874994],[-1.16259765625,32.399169921875],[-1.111035156249983,32.552294921874996],[-1.188232421875,32.60849609375],[-1.29638671875,32.675683593749994],[-1.352148437499977,32.703369140625],[-1.45,32.784814453124994],[-1.510009765625,32.87763671875],[-1.550732421874983,33.073583984375],[-1.67919921875,33.318652343749996],[-1.795605468749983,34.751904296875],[-2.131787109374983,34.970849609374994],[-2.190771484374977,35.02978515625],[-2.219628906249994,35.10419921875],[-1.673632812499989,35.18310546875],[-0.426123046874977,35.8615234375],[-0.048242187499994,35.8328125],[0.312207031250011,36.162353515625],[0.9716796875,36.4439453125],[2.593359375,36.60068359375],[2.972851562500011,36.784472656249996],[3.779003906250011,36.89619140625],[4.758105468750017,36.896337890625],[5.29541015625,36.648242187499996],[6.486523437500011,37.085742187499996],[6.927539062500017,36.91943359375],[7.238476562500011,36.968505859375],[7.204296875000011,37.0923828125],[7.910449218750017,36.856347656249994],[8.576562500000023,36.93720703125],[8.601269531250011,36.833935546875],[8.207617187500006,36.518945312499994]]]},"properties":{"name":"Algeria","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-80.131591796875,-2.973144531249957],[-80.27294921875003,-2.995898437499974],[-80.22368164062502,-2.753125],[-80.08076171874995,-2.668847656249966],[-79.90903320312495,-2.725585937499972],[-80.131591796875,-2.973144531249957]]],[[[-90.42392578125,-1.339941406250034],[-90.51953124999994,-1.299121093749974],[-90.47719726562494,-1.22099609374996],[-90.42392578125,-1.339941406250034]]],[[[-89.41889648437498,-0.911035156249966],[-89.60859374999998,-0.888574218750009],[-89.28784179687503,-0.689843750000023],[-89.41889648437498,-0.911035156249966]]],[[[-90.33486328125,-0.771582031249977],[-90.54213867187502,-0.676464843749955],[-90.53168945312493,-0.581445312499966],[-90.26938476562498,-0.48466796874996],[-90.19272460937498,-0.658789062500006],[-90.33486328125,-0.771582031249977]]],[[[-91.42597656249995,-0.460839843749994],[-91.61074218749994,-0.44394531250002],[-91.64667968749998,-0.284472656249946],[-91.46015625000001,-0.255664062500031],[-91.42597656249995,-0.460839843749994]]],[[[-90.57392578124993,-0.333984375],[-90.8677734375,-0.271386718750037],[-90.78037109374998,-0.160449218749989],[-90.57392578124993,-0.333984375]]],[[[-91.27216796874998,0.025146484374986],[-90.799658203125,-0.752050781249991],[-90.90551757812497,-0.94052734375002],[-91.13105468750001,-1.019628906249977],[-91.41904296874998,-0.996679687500006],[-91.49541015624999,-0.860937499999977],[-91.120947265625,-0.559082031250028],[-91.36918945312493,-0.287207031249977],[-91.42885742187502,-0.023388671874955],[-91.59682617187497,0.002099609374994],[-91.36137695312496,0.125830078124977],[-91.27216796874998,0.025146484374986]]],[[[-78.90922851562502,1.252783203124977],[-78.99169921875003,1.293212890625043],[-78.89980468749997,1.359765625],[-78.90922851562502,1.252783203124977]]],[[[-75.28447265624999,-0.10654296875002],[-75.62626953124999,-0.122851562499974],[-75.63203125000001,-0.157617187500037],[-75.56059570312502,-0.200097656249994],[-75.49106445312498,-0.24833984374996],[-75.42470703124997,-0.408886718749983],[-75.259375,-0.59013671874996],[-75.24960937499998,-0.951855468750026],[-75.34819335937499,-0.966796874999957],[-75.38012695312503,-0.94023437499996],[-75.40805664062503,-0.92431640625],[-75.42041015624997,-0.962207031250003],[-75.570556640625,-1.53125],[-76.08979492187501,-2.133105468749974],[-76.6791015625,-2.562597656249991],[-77.860595703125,-2.981640625000011],[-78.240380859375,-3.472558593750009],[-78.345361328125,-3.397363281249966],[-78.64799804687499,-4.248144531250006],[-78.68603515625003,-4.562402343749994],[-78.86152343749998,-4.665039062499943],[-78.90761718749997,-4.714453124999977],[-78.92578125,-4.770703124999983],[-78.91420898437497,-4.818652343749974],[-78.919189453125,-4.858398437499986],[-78.97539062499999,-4.873242187499997],[-78.99526367187497,-4.908007812499974],[-79.03330078124998,-4.96914062499999],[-79.07626953125003,-4.990625],[-79.18666992187497,-4.958203124999983],[-79.26811523437493,-4.957617187499949],[-79.33095703124997,-4.92783203125002],[-79.39941406249997,-4.840039062499983],[-79.45576171874998,-4.766210937499949],[-79.50190429687495,-4.670605468750011],[-79.51616210937493,-4.539160156249963],[-79.57768554687496,-4.50058593750002],[-79.638525390625,-4.454882812500031],[-79.71098632812502,-4.467578124999946],[-79.79726562500002,-4.47636718749996],[-79.8451171875,-4.445898437499977],[-79.962890625,-4.390332031250026],[-80.06352539062499,-4.327539062500023],[-80.13955078125002,-4.296093750000011],[-80.19746093750001,-4.311035156249943],[-80.293359375,-4.416796875],[-80.38349609374998,-4.46367187499996],[-80.424169921875,-4.461425781250028],[-80.47856445312499,-4.430078125000037],[-80.48847656249995,-4.393652343749991],[-80.44384765625003,-4.335839843750023],[-80.35288085937495,-4.208496093750014],[-80.453759765625,-4.205175781249963],[-80.48847656249995,-4.165527343749972],[-80.49345703124999,-4.119140625000014],[-80.510009765625,-4.06953125000004],[-80.49013671874994,-4.010058593750003],[-80.43720703125001,-3.978613281249991],[-80.30327148437499,-4.005078124999969],[-80.26689453124993,-3.948828124999963],[-80.23051757812499,-3.924023437499969],[-80.19414062499996,-3.905859375],[-80.24375,-3.576757812500006],[-80.32465820312498,-3.387890625],[-79.96333007812501,-3.15771484375],[-79.72988281249997,-2.579101562499972],[-79.842138671875,-2.0673828125],[-79.92558593749996,-2.548535156249969],[-80.03017578124994,-2.556738281249949],[-80.00664062499993,-2.353808593750003],[-80.28471679687502,-2.706738281249955],[-80.93217773437493,-2.269140624999977],[-80.76059570312498,-1.934570312500028],[-80.90239257812499,-1.078906249999974],[-80.55390624999998,-0.847949218749989],[-80.45546875,-0.585449218749986],[-80.282373046875,-0.620507812500023],[-80.48227539062503,-0.368261718749963],[-80.046142578125,0.155371093750048],[-80.08828124999997,0.78476562500002],[-78.89965820312503,1.20625],[-78.85966796874996,1.455371093750031],[-78.1806640625,0.968554687499974],[-77.702880859375,0.837841796874997],[-77.46767578124997,0.636523437500017],[-77.396337890625,0.393896484374963],[-76.49462890624997,0.23544921875002],[-76.27060546874998,0.439404296874997],[-75.77666015624999,0.08925781249998],[-75.28447265624999,-0.10654296875002]]]]},"properties":{"name":"Ecuador","childNum":9}},{"geometry":{"type":"Polygon","coordinates":[[[34.24531250000001,31.208300781249996],[34.904296875,29.47734375],[34.736425781250006,29.27060546875],[34.39970703125002,28.01601562499999],[34.22011718750002,27.764306640624994],[33.76025390625,28.04765625],[33.24775390625001,28.567724609375],[32.56572265625002,29.973974609375],[32.35976562500002,29.630664062499996],[32.89824218750002,28.565234375],[33.54707031250001,27.898144531249997],[33.5498046875,27.607373046874997],[33.84931640625001,27.184912109375],[33.959082031250006,26.6490234375],[35.19414062500002,24.475146484375003],[35.78388671875001,23.937792968750003],[35.54082031250002,23.920654296875],[35.50439453125,23.779296875],[35.697851562500006,22.946191406249994],[36.22968750000001,22.628808593749994],[36.87138671875002,21.996728515624994],[31.434472656250023,21.995849609375],[31.486132812500017,22.14780273437499],[31.400292968750023,22.202441406250003],[31.260644531250023,22.00229492187499],[31.092675781250023,21.994873046875],[28.036425781250017,21.995361328125],[24.980273437500017,21.995849609375],[24.980273437500017,25.5888671875],[24.980273437500017,29.181884765625],[24.703222656250006,30.201074218749994],[24.96142578125,30.678515625],[24.85273437500001,31.334814453125],[25.150488281250006,31.654980468749997],[25.382226562500023,31.51279296875],[25.89326171875001,31.620898437499996],[27.248046875,31.377880859374997],[27.5400390625,31.212695312499996],[28.51484375000001,31.050439453124994],[29.072070312500017,30.830273437499997],[29.929785156250006,31.227490234374997],[30.22265625,31.2583984375],[30.395117187500006,31.4576171875],[30.92353515625001,31.566845703124997],[30.56298828125,31.4169921875],[31.001757812500017,31.462792968749994],[31.082910156250023,31.603320312499996],[31.5244140625,31.458251953125],[31.888964843750017,31.54140625],[32.13603515625002,31.341064453125],[31.8921875,31.482470703124996],[31.77109375,31.292578125],[32.10175781250001,31.092822265624996],[32.281835937500006,31.200878906249997],[32.21621093750002,31.29375],[32.60332031250002,31.06875],[33.66650390625,31.130419921874996],[34.19814453125002,31.322607421875],[34.24531250000001,31.208300781249996]]]},"properties":{"name":"Egypt","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[40.141210937500006,15.696142578125034],[40.399023437500006,15.579882812500045],[39.975195312500006,15.612451171875023],[39.94746093750004,15.696142578125034],[40.07050781250004,15.676611328125034],[39.93994140625003,15.744531250000023],[39.9567382812501,15.889404296875057],[40.141210937500006,15.696142578125034]]],[[[40.07646484375002,16.082421875000023],[40.11005859375004,15.985742187500051],[39.99609375000003,16.04267578125001],[40.07646484375002,16.082421875000023]]],[[[40.938574218750006,13.983105468749997],[40.82011718750002,14.111669921874991],[40.22148437500002,14.431152343749972],[39.531835937500006,14.53671875],[39.198046875000074,14.479394531250037],[39.1354492187501,14.581884765625034],[39.07421874999997,14.628222656249974],[39.02382812499999,14.628222656249974],[38.99570312500006,14.586865234374983],[38.81201171875003,14.482324218750009],[38.50439453124997,14.42441406250002],[38.43144531250002,14.428613281249994],[38.221484375000074,14.649658203124986],[38.002539062500006,14.737109375000045],[37.94345703125006,14.810546875],[37.884179687499994,14.852294921874972],[37.82031250000003,14.708496093749986],[37.70839843750005,14.45722656250004],[37.64843750000003,14.32255859375006],[37.571191406249994,14.149072265624966],[37.546777343749994,14.143847656249974],[37.507226562499994,14.156396484375037],[37.257226562499994,14.453759765625051],[37.024511718750006,14.271972656250057],[36.81191406250005,14.315039062500034],[36.67910156250005,14.307568359375026],[36.542382812499994,14.25820312499999],[36.52431640625005,14.256835937499986],[36.492285156250006,14.544335937500023],[36.470800781250006,14.736474609375009],[36.448144531249994,14.940087890625009],[36.42675781249997,15.132080078125043],[36.566015625,15.362109375],[36.9137695312501,16.296191406250045],[36.887792968750006,16.624658203124994],[36.9787109375001,16.800585937500045],[36.9757812500001,16.866552734375006],[36.99521484375006,17.020556640625017],[37.00898437500004,17.058886718750017],[37.06152343749997,17.061279296875057],[37.16953125000006,17.04140625],[37.41103515625005,17.061718749999955],[37.452929687500074,17.108691406250017],[37.51015625,17.28813476562499],[37.54746093750006,17.32412109375005],[37.78242187500004,17.458007812500057],[38.253515625,17.584765625000017],[38.26728515625004,17.616699218750057],[38.28984375000002,17.637011718750017],[38.34736328125004,17.68359375],[38.37373046875004,17.717333984375045],[38.42246093750006,17.823925781249983],[38.60947265625006,18.00507812500004],[39.03447265625002,17.085546875000034],[39.298925781250006,15.921093750000011],[39.78554687499999,15.124853515624991],[39.86376953124997,15.470312500000034],[40.20410156250003,15.014111328124983],[41.17646484375004,14.620312500000054],[41.65820312499997,13.983056640624994],[42.24511718749997,13.587646484374986],[42.39931640625005,13.212597656249969],[42.522851562499994,13.221484375],[42.796191406250074,12.864257812500057],[42.96953125000002,12.808349609375028],[42.99902343750003,12.899511718750048],[43.08291015625005,12.824609374999966],[43.11669921874997,12.708593749999963],[43.00566406250002,12.66230468750004],[42.88330078124997,12.621289062500026],[42.86591796875004,12.622802734374986],[42.82529296875006,12.569335937500014],[42.767480468749994,12.422851562500014],[42.70371093750006,12.380322265625054],[42.479394531249994,12.513623046875026],[42.45,12.521337890625006],[42.40859375,12.494384765625014],[42.37851562500006,12.46640625],[42.28994140625005,12.570214843750009],[42.225,12.661962890624963],[42.13427734374997,12.771435546874969],[41.95214843749997,12.88232421875],[41.85957031250004,13.025878906250028],[41.76503906250005,13.183935546874991],[41.362890625,13.499804687500031],[40.938574218750006,13.983105468749997]]]]},"properties":{"name":"Eritrea","childNum":3}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-17.887939453125,27.809570312500057],[-17.984765625000023,27.646386718750023],[-18.160546874999937,27.76147460937503],[-17.887939453125,27.809570312500057]]],[[[-15.400585937499955,28.147363281250023],[-15.436767578124972,27.810693359375023],[-15.71030273437492,27.784082031250023],[-15.809472656249966,27.994482421874977],[-15.682763671874994,28.15405273437497],[-15.400585937499955,28.147363281250023]]],[[[-17.184667968749977,28.02197265624997],[-17.324902343749955,28.11767578125003],[-17.25859375,28.203173828125045],[-17.103759765624943,28.111132812500017],[-17.184667968749977,28.02197265624997]]],[[[-16.33447265624997,28.37993164062499],[-16.41821289062497,28.15141601562496],[-16.65800781249999,28.007177734374977],[-16.905322265625017,28.33959960937503],[-16.12363281249992,28.57597656249996],[-16.33447265624997,28.37993164062499]]],[[[-14.196777343749943,28.169287109375063],[-14.332617187500006,28.056005859374977],[-14.49179687499992,28.100927734374977],[-14.231982421875017,28.21582031250003],[-14.003369140624983,28.706689453125023],[-13.85722656249996,28.73803710937503],[-13.928027343749989,28.25346679687499],[-14.196777343749943,28.169287109375063]]],[[[-17.83427734374999,28.49321289062496],[-18.00078124999999,28.758251953124955],[-17.928808593749977,28.844580078125063],[-17.7265625,28.724462890625006],[-17.83427734374999,28.49321289062496]]],[[[-13.715966796874966,28.911230468750034],[-13.85991210937496,28.869091796874983],[-13.823632812499966,29.013330078124966],[-13.463574218749955,29.237207031250023],[-13.477929687499966,29.00659179687503],[-13.715966796874966,28.911230468750034]]],[[[1.593945312500068,38.672070312499955],[1.40576171875,38.670996093750006],[1.436328125000017,38.768212890624994],[1.593945312500068,38.672070312499955]]],[[[1.445214843750051,38.91870117187503],[1.223339843750068,38.90385742187502],[1.3486328125,39.080810546875],[1.564453125,39.12104492187504],[1.623632812499977,39.03881835937497],[1.445214843750051,38.91870117187503]]],[[[3.145312500000017,39.79008789062499],[3.461816406250023,39.69775390625003],[3.072851562500006,39.30126953124997],[2.799804687500057,39.38505859374999],[2.700585937500023,39.54213867187502],[2.49951171875,39.47788085937498],[2.37001953125008,39.57207031249999],[3.15869140625,39.97050781249999],[3.145312500000017,39.79008789062499]]],[[[4.293652343750011,39.84184570312499],[3.8671875,39.958740234375],[3.853417968750051,40.06303710937502],[4.22578125000004,40.032373046874966],[4.293652343750011,39.84184570312499]]],[[[-1.794042968749949,43.407324218750006],[-1.410693359374932,43.240087890625034],[-1.460839843749937,43.05175781250006],[-1.300048828124943,43.10097656250002],[-0.586425781249943,42.798974609374966],[0.631640625000045,42.689599609374994],[0.696875,42.84511718750005],[1.428320312499977,42.59589843749998],[1.414843750000074,42.54838867187499],[1.448828124999977,42.43745117187504],[1.534082031250051,42.44169921875002],[1.7060546875,42.50332031250005],[1.859765625000051,42.457080078125045],[1.927929687500068,42.42631835937499],[2.032714843750028,42.353515625],[3.21142578125,42.43115234375],[3.248046875,41.94423828125002],[3.0048828125,41.76743164062506],[2.082617187500063,41.287402343750045],[1.032910156250068,41.06206054687496],[0.714648437500074,40.822851562500006],[0.891113281250057,40.72236328125004],[0.59609375000008,40.614501953125],[-0.327001953124949,39.519873046875006],[-0.204931640624949,39.062597656250034],[0.20156250000008,38.75917968750002],[-0.520800781249989,38.317285156249966],[-0.814648437500011,37.76992187500002],[-0.721582031249966,37.63105468749998],[-1.327539062499937,37.561132812500034],[-1.640966796874949,37.38696289062497],[-2.111523437499983,36.77666015624999],[-4.366845703124994,36.71811523437506],[-4.67412109374996,36.506445312500006],[-5.171484374999949,36.423779296874955],[-5.3609375,36.134912109374994],[-5.62548828125,36.02592773437499],[-6.040673828124937,36.18842773437498],[-6.38413085937492,36.63701171874996],[-6.216796875000028,36.91357421875],[-6.396191406249983,36.831640625],[-6.863769531250028,37.27890625],[-7.406152343749937,37.17944335937497],[-7.44394531249992,37.72827148437497],[-6.957568359374932,38.18789062499999],[-7.106396484374983,38.181005859375006],[-7.343017578124943,38.45742187500002],[-6.997949218749994,39.05644531250002],[-7.53569335937496,39.66157226562501],[-7.117675781249972,39.681689453125045],[-6.975390624999932,39.79838867187502],[-6.896093749999949,40.02182617187506],[-7.032617187499966,40.16791992187498],[-6.8101562499999,40.343115234375034],[-6.928466796874972,41.009130859375006],[-6.2125,41.53203125],[-6.542187499999955,41.672509765624994],[-6.61826171874992,41.9423828125],[-7.147119140625023,41.98115234374998],[-7.40361328124996,41.833691406249955],[-8.152490234374937,41.81196289062498],[-8.266064453124983,42.13740234375001],[-8.777148437500017,41.941064453124994],[-8.887207031249943,42.105273437500045],[-8.690917968749943,42.274169921875],[-8.815820312499966,42.285253906250034],[-8.730029296874989,42.411718750000034],[-8.8115234375,42.64033203124998],[-9.033105468750023,42.593847656250006],[-8.927197265624926,42.79858398437497],[-9.235205078124977,42.97690429687498],[-9.178076171874977,43.17402343749998],[-8.248925781249937,43.43940429687498],[-8.256738281249937,43.57988281249999],[-8.004687499999932,43.69438476562496],[-7.503613281249983,43.73994140625001],[-7.060986328124955,43.55395507812503],[-5.846679687499943,43.645068359375045],[-4.52304687499992,43.41572265625004],[-3.604638671874966,43.51948242187504],[-3.045605468749926,43.37158203125],[-2.875048828125017,43.454443359375006],[-2.337109374999926,43.32802734375002],[-1.794042968749949,43.407324218750006]]]]},"properties":{"name":"Spain","childNum":12,"cp":[-2.9366964,40.3438963]}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[22.61738281250004,58.62124023437502],[23.323242187500057,58.45083007812502],[22.730273437500045,58.23066406250001],[22.371679687499977,58.217138671875006],[21.996875,57.93134765624998],[22.187695312500068,58.15434570312502],[21.88212890624999,58.262353515624994],[21.862304687500057,58.497167968750034],[22.61738281250004,58.62124023437502]]],[[[23.343554687500017,58.550341796875045],[23.10908203125004,58.65922851562502],[23.332812500000045,58.648583984374994],[23.343554687500017,58.550341796875045]]],[[[22.923730468750023,58.826904296875],[22.54218750000001,58.68999023437499],[22.411035156250023,58.863378906250034],[22.05625,58.94360351562506],[22.6494140625,59.08710937499998],[22.90986328125004,58.99121093749997],[22.923730468750023,58.826904296875]]],[[[28.0125,59.484277343749966],[28.15107421875004,59.374414062499966],[27.434179687500006,58.787255859374994],[27.502441406250057,58.221337890624994],[27.778515625000068,57.87070312500006],[27.542089843750063,57.799414062500006],[27.4,57.66679687499999],[27.35195312500005,57.528125],[26.96601562500001,57.60913085937506],[26.532617187499994,57.53100585937503],[26.29804687500001,57.60107421875],[25.66015625,57.920166015625],[25.27265625000001,58.009375],[25.11103515625004,58.06342773437498],[24.45888671875005,57.907861328124994],[24.3625,57.86616210937501],[24.322558593750074,57.87060546875003],[24.529101562500045,58.35424804687497],[24.114843750000034,58.26611328125006],[23.767578125000057,58.36083984374997],[23.50927734375003,58.65854492187498],[23.680761718750063,58.787158203125074],[23.43203125,58.920654296875],[23.494433593750017,59.19565429687498],[24.083398437500023,59.29189453125005],[24.38037109375003,59.47265625],[25.44375,59.52114257812502],[25.50927734374997,59.63901367187506],[26.974707031250006,59.450634765624955],[28.0125,59.484277343749966]]]]},"properties":{"name":"Estonia","childNum":4}},{"geometry":{"type":"Polygon","coordinates":[[[38.43144531250002,14.428613281249994],[38.50439453125,14.424414062499991],[38.81201171875,14.482324218749994],[38.995703125,14.586865234374997],[39.02382812500002,14.628222656250003],[39.07421875,14.628222656250003],[39.13544921875001,14.581884765624991],[39.19804687500002,14.479394531249994],[39.531835937500006,14.53671875],[40.22148437500002,14.43115234375],[40.82011718750002,14.111669921874991],[40.938574218750006,13.983105468749997],[41.362890625,13.499804687500003],[41.76503906250002,13.183935546874991],[41.85957031250001,13.02587890625],[41.9521484375,12.88232421875],[42.13427734375,12.771435546874997],[42.225,12.661962890624991],[42.28994140625002,12.570214843749994],[42.378515625,12.46640625],[41.79267578125001,11.68603515625],[41.79824218750002,10.98046875],[42.557714843750006,11.080761718749997],[42.92275390625002,10.999316406249989],[42.65644531250001,10.6],[42.84160156250002,10.203076171874997],[43.181640625,9.879980468749991],[43.482519531250006,9.379492187499991],[43.98378906250002,9.008837890624989],[46.97822265625001,7.9970703125],[47.97822265625001,7.9970703125],[44.940527343750006,4.912011718749994],[43.988867187500006,4.950537109374991],[43.58349609375,4.85498046875],[43.12568359375001,4.644482421874997],[42.85664062500001,4.32421875],[42.02412109375001,4.137939453125],[41.91533203125002,4.031298828124989],[41.88398437500001,3.977734375],[41.73769531250002,3.979052734374989],[41.48193359375,3.96328125],[41.37246093750002,3.946191406249994],[41.22089843750001,3.943554687499997],[41.02080078125002,4.057470703124991],[40.765234375,4.27304687499999],[39.84218750000002,3.851464843749994],[39.79033203125002,3.754248046874991],[39.65751953125002,3.577832031249997],[39.49443359375002,3.456103515624989],[38.608007812500006,3.60009765625],[38.45156250000002,3.604833984374991],[38.22529296875001,3.618994140624991],[38.08613281250001,3.64882812499999],[37.15458984375002,4.254541015624994],[36.90556640625002,4.411474609374991],[36.02197265625,4.468115234374991],[35.76308593750002,4.808007812499994],[35.75615234375002,4.950488281249989],[35.779296875,5.105566406249991],[35.80029296875,5.156933593749997],[35.74501953125002,5.343994140625],[35.325292968750006,5.364892578124994],[35.2646484375,5.412060546874997],[35.26386718750001,5.457910156249994],[35.26835937500002,5.492285156249991],[34.98359375000001,5.858300781249994],[34.71064453125001,6.660302734374994],[34.06425781250002,7.225732421874994],[33.902441406250006,7.509521484375],[32.99892578125002,7.899511718749991],[33.28105468750002,8.437255859375],[33.95332031250001,8.443505859374994],[34.07275390625,8.545263671874991],[34.078125,9.461523437499991],[34.31123046875001,10.190869140624997],[34.34394531250001,10.658642578124997],[34.571875,10.880175781249989],[34.77128906250002,10.746191406249991],[34.93144531250002,10.864794921874989],[35.1123046875,11.816552734374994],[35.67021484375002,12.623730468749997],[36.12519531250001,12.75703125],[36.52431640625002,14.2568359375],[36.54238281250002,14.25820312499999],[36.67910156250002,14.307568359374997],[36.81191406250002,14.315039062499991],[37.024511718750006,14.27197265625],[37.25722656250002,14.453759765624994],[37.50722656250002,14.156396484374994],[37.54677734375002,14.143847656250003],[37.57119140625002,14.149072265624994],[37.6484375,14.322558593750003],[37.70839843750002,14.457226562499997],[37.8203125,14.70849609375],[37.88417968750002,14.852294921875],[37.943457031250006,14.810546875],[38.002539062500006,14.737109375],[38.22148437500002,14.649658203125],[38.43144531250002,14.428613281249994]]]},"properties":{"name":"Ethiopia","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[22.17509765624999,60.370751953124994],[22.41552734375003,60.30336914062505],[22.36054687500004,60.165576171875045],[22.07714843750003,60.286328124999955],[22.17509765624999,60.370751953124994]]],[[[21.450878906250068,60.529589843750045],[21.3,60.47978515625002],[21.224707031250006,60.62060546875003],[21.450878906250068,60.529589843750045]]],[[[21.2177734375,63.241308593750034],[21.415625,63.19736328125006],[21.25341796875,63.152001953124966],[21.08388671875008,63.277539062499955],[21.2177734375,63.241308593750034]]],[[[24.848242187500034,64.99101562499999],[24.576562500000023,65.04287109375],[24.970605468750023,65.05532226562502],[24.848242187500034,64.99101562499999]]],[[[28.96582031250003,69.02197265625],[28.414062500000057,68.90415039062506],[28.77285156250005,68.84003906249995],[28.470703125000057,68.48837890625],[28.685156250000034,68.189794921875],[29.343847656250006,68.06186523437506],[29.988085937500017,67.66826171874999],[29.066210937500045,66.89174804687497],[30.102734375000097,65.72626953125004],[29.715917968750063,65.62456054687502],[29.608007812500006,65.248681640625],[29.826953125000017,65.14506835937502],[29.60419921875004,64.968408203125],[30.072851562500063,64.76503906250005],[30.04189453125005,64.44335937499997],[30.513769531250006,64.2],[30.50390625000003,64.02060546875],[29.991503906250074,63.73515625000002],[31.180859375000097,63.208300781250074],[31.533984375000017,62.885400390624994],[31.18671875000004,62.48139648437504],[29.69013671875004,61.54609375000001],[27.797656250000074,60.53613281250003],[26.53466796874997,60.412890625000074],[26.56933593750003,60.62456054687502],[26.377734375000074,60.42407226562503],[25.955957031250023,60.474218750000034],[26.03583984375004,60.34150390625001],[25.75800781250004,60.26752929687504],[25.65644531250004,60.33320312499998],[24.44560546874999,60.021289062500045],[23.46357421875004,59.986230468749994],[23.021289062500074,59.81601562500006],[23.19843750000001,60.02182617187498],[22.911718750000063,60.20971679687497],[22.749804687500017,60.057275390624994],[22.462695312500045,60.029199218749966],[22.5849609375,60.380566406249955],[21.436035156250057,60.596386718749955],[21.605957031250057,61.59155273437503],[21.255957031250063,61.98964843750005],[21.143847656250045,62.73999023437506],[21.650976562500063,63.039306640625],[21.545117187499983,63.204296874999955],[22.31972656250005,63.310449218749994],[22.532324218750034,63.647851562499994],[23.598925781250074,64.04091796874997],[24.557910156250045,64.801025390625],[25.288183593750063,64.8603515625],[25.34785156250004,65.47924804687497],[24.674902343750006,65.67070312499999],[24.628027343750034,65.85917968750002],[24.15546875000004,65.80527343750006],[23.700292968750034,66.25263671874998],[23.988574218750045,66.81054687500003],[23.64150390625005,67.12939453124997],[23.733593750000068,67.42290039062499],[23.454882812500045,67.46025390625007],[23.63886718750004,67.95439453125002],[22.854101562500034,68.36733398437502],[21.99746093750005,68.52060546874998],[20.622167968750006,69.036865234375],[21.065722656250017,69.04174804687503],[21.06611328125001,69.21411132812497],[21.59375,69.273583984375],[22.410937500000074,68.719873046875],[23.324023437500017,68.64897460937502],[23.85400390625,68.80590820312503],[24.94140625000003,68.59326171875006],[25.748339843750017,68.99013671875],[26.07246093750004,69.69155273437497],[26.525390625000057,69.91503906250003],[27.127539062500063,69.90649414062497],[27.747851562500045,70.06484375],[29.14160156250003,69.67143554687505],[29.33339843750005,69.47299804687503],[28.846289062500006,69.17690429687502],[28.96582031250003,69.02197265625]]]]},"properties":{"name":"Finland","childNum":5}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[178.48789062500018,-18.97412109375],[177.95869140624998,-19.121582031250014],[178.33427734375013,-18.93447265625001],[178.48789062500018,-18.97412109375]]],[[[179.34931640625015,-18.10234375000003],[179.25351562500018,-18.030566406249974],[179.30644531250013,-17.944042968750026],[179.34931640625015,-18.10234375000003]]],[[[178.28017578124994,-17.37197265625001],[178.59160156249996,-17.651464843750006],[178.66767578125004,-18.080859375],[177.95546875000005,-18.264062500000023],[177.32138671875,-18.077539062500037],[177.26396484375007,-17.86347656250004],[177.5044921875,-17.539550781250043],[177.81796875000012,-17.38847656249999],[178.28017578124994,-17.37197265625001]]],[[[180,-16.96308593750001],[179.89697265625003,-16.96406250000004],[180,-16.785742187500034],[180,-16.96308593750001]]],[[[-179.97490234374996,-16.92480468750003],[-180,-16.96298828124999],[-180,-16.907812500000034],[-180,-16.82431640624999],[-180,-16.78554687499999],[-179.86098632812502,-16.68828124999999],[-179.97490234374996,-16.92480468750003]]],[[[-179.92944335937503,-16.502832031250037],[-179.999951171875,-16.540039062499986],[-179.900927734375,-16.431542968749994],[-179.92944335937503,-16.502832031250037]]],[[[179.99921875000004,-16.168554687499977],[179.56416015625004,-16.636914062499997],[179.56816406249996,-16.747460937499966],[179.93037109375004,-16.51943359375005],[179.9279296875001,-16.74443359374996],[179.41933593750005,-16.80654296875001],[179.20234375000004,-16.71269531249999],[179.00683593750003,-16.90019531249999],[178.70664062500018,-16.97617187500002],[178.4974609375,-16.78789062500003],[178.58359375000012,-16.621875],[178.80507812499994,-16.631445312500034],[179.55175781250003,-16.249902343750023],[180,-16.15292968749999],[179.99921875000004,-16.168554687499977]]]]},"properties":{"name":"Fiji","childNum":7}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-61.01875,-51.7857421875],[-60.87597656250003,-51.79423828125004],[-60.94755859374996,-51.94628906250002],[-61.14501953125003,-51.83945312500001],[-61.01875,-51.7857421875]]],[[[-60.28623046874995,-51.461914062500014],[-59.38759765625002,-51.35996093750003],[-59.26806640625,-51.42753906250003],[-59.92138671874997,-51.969531250000045],[-60.246337890625,-51.98642578125003],[-60.35346679687498,-52.13994140625004],[-60.686376953125034,-52.18837890624996],[-60.96142578125003,-52.05732421874999],[-60.23847656249998,-51.771972656250036],[-60.58251953125,-51.71269531250004],[-60.24516601562493,-51.638867187500004],[-60.56845703124998,-51.357812499999945],[-60.28623046874995,-51.461914062500014]]],[[[-60.11171875000002,-51.39589843749998],[-60.275341796874955,-51.28056640625002],[-60.06982421875,-51.307910156249996],[-60.11171875000002,-51.39589843749998]]],[[[-58.85019531249995,-51.26992187499998],[-58.42583007812502,-51.32421875000003],[-58.508935546874994,-51.48359375],[-58.271582031250034,-51.57470703124999],[-58.25922851562501,-51.417089843750034],[-57.976513671874955,-51.384375],[-57.80849609375002,-51.51796875],[-57.96044921874997,-51.58320312500003],[-57.79179687499999,-51.63613281249998],[-58.68349609375002,-51.93623046875001],[-58.65278320312498,-52.09921875],[-59.19584960937496,-52.01767578125],[-59.06801757812502,-52.17304687500003],[-59.341503906249955,-52.19599609375],[-59.395654296874966,-52.308007812499994],[-59.64873046875002,-52.134375],[-59.57080078124994,-51.92539062500003],[-59.05952148437498,-51.685449218749994],[-59.09663085937498,-51.49140624999998],[-58.85019531249995,-51.26992187499998]]]]},"properties":{"name":"Falkland Is.","childNum":4}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[55.79736328125003,-21.33935546875003],[55.36269531250005,-21.27363281250004],[55.23281250000005,-21.05839843749999],[55.311328125000074,-20.90410156249999],[55.661914062500074,-20.90625],[55.8390625000001,-21.13857421874998],[55.79736328125003,-21.33935546875003]]],[[[45.180273437500006,-12.97675781250004],[45.069433593750006,-12.895605468750034],[45.09238281250006,-12.653027343749997],[45.22314453124997,-12.752148437500026],[45.180273437500006,-12.97675781250004]]],[[[-51.65253906249998,4.061279296874972],[-52.327880859375,3.18173828125002],[-52.58300781250003,2.528906249999977],[-52.90346679687502,2.211523437499977],[-53.76777343749998,2.354833984375048],[-54.13007812499998,2.121044921875026],[-54.43310546875,2.207519531250057],[-54.51508789062498,2.245458984374963],[-54.55048828125001,2.293066406249991],[-54.59194335937502,2.313769531250031],[-54.61625976562499,2.326757812500006],[-54.60473632812497,2.335791015624991],[-54.56840820312502,2.342578125000031],[-54.53593749999999,2.343310546875003],[-54.48554687500001,2.416113281250006],[-54.402001953124966,2.46152343750002],[-54.25673828125002,2.713720703124977],[-54.19550781249998,2.817871093750057],[-54.17070312499999,2.993603515624969],[-54.203125,3.138183593750028],[-54.18803710937499,3.178759765625031],[-54.063183593749955,3.353320312499989],[-54.00957031249993,3.448535156250017],[-54.03422851562499,3.62939453125],[-54.350732421874994,4.054101562500023],[-54.47968749999998,4.836523437499991],[-53.91992187499997,5.768994140624983],[-52.899316406249966,5.425048828124986],[-52.29052734375003,4.942187500000031],[-52.324609374999966,4.770898437500037],[-52.21997070312494,4.862792968750014],[-52.05810546875003,4.717382812499963],[-52.00292968749997,4.352294921875014],[-51.82753906250002,4.635693359375026],[-51.65253906249998,4.061279296874972]]],[[[-60.826269531250006,14.494482421874991],[-61.063720703125,14.467089843750017],[-61.01132812499998,14.601904296875034],[-61.21333007812501,14.848583984375011],[-60.927148437499966,14.755175781249989],[-60.826269531250006,14.494482421874991]]],[[[-61.23046875000003,15.889941406250074],[-61.310742187499955,15.894677734374966],[-61.25,16.006298828124983],[-61.23046875000003,15.889941406250074]]],[[[-61.58955078125001,16.006933593750006],[-61.759423828124966,16.062060546875045],[-61.74804687499997,16.355273437500017],[-61.55234374999998,16.270898437499966],[-61.58955078125001,16.006933593750006]]],[[[-61.3271484375,16.230419921874983],[-61.522167968749955,16.22802734375003],[-61.47119140624994,16.506640625000045],[-61.17260742187497,16.25610351562497],[-61.3271484375,16.230419921874983]]],[[[9.480371093750023,42.80541992187503],[9.550683593750051,42.12973632812506],[9.186132812500034,41.38491210937502],[8.80751953125008,41.58837890625],[8.886816406249977,41.70068359375003],[8.621875,41.93071289062502],[8.700976562500045,42.09560546875002],[8.565625,42.35771484374996],[8.81484375000008,42.60791015625003],[9.313378906250023,42.71318359374999],[9.363183593750051,43.01738281249996],[9.480371093750023,42.80541992187503]]],[[[-1.17832031249992,45.904052734375],[-1.213574218750011,45.81660156250004],[-1.388671874999972,46.05039062500006],[-1.17832031249992,45.904052734375]]],[[[5.789746093749983,49.53828125000001],[5.823437500000011,49.50507812499998],[5.9013671875,49.48974609374997],[5.928906250000011,49.47753906249997],[5.959472656250028,49.45463867187502],[6.01142578125004,49.44545898437502],[6.074121093750023,49.45463867187502],[6.119921875000017,49.485205078125034],[6.181054687500051,49.498925781249966],[6.344335937500006,49.45273437499998],[6.735449218750006,49.16059570312498],[7.450585937500051,49.152197265625034],[8.134863281250006,48.97358398437498],[7.616601562500023,48.15678710937502],[7.615625,47.59272460937504],[7.343164062499994,47.43310546875003],[7.136035156249989,47.489843750000034],[6.968359375000034,47.453222656250034],[6.900390625000028,47.39423828125001],[7.000585937500034,47.339453125000034],[7.000585937500034,47.32250976562506],[6.978515625000057,47.30205078124996],[6.95205078125008,47.26718750000006],[6.820703125000051,47.163183593750006],[6.688085937500034,47.05825195312505],[6.66689453125008,47.026513671874966],[6.624804687500017,47.00434570312498],[6.45625,46.948339843750034],[6.429003906250017,46.832275390625],[6.129687500000045,46.56699218750006],[6.06025390625004,46.42817382812501],[6.095898437500011,46.279394531250006],[5.970019531250045,46.214697265625034],[5.971484375000074,46.151220703125006],[6.006640625000045,46.14233398437506],[6.086621093750068,46.14702148437502],[6.19941406250004,46.19306640624998],[6.234667968750045,46.332617187500006],[6.321875,46.39370117187502],[6.428906250000011,46.43051757812506],[6.578222656250034,46.437353515625034],[6.758105468750017,46.41577148437497],[6.772070312500006,46.16513671874998],[6.897265625000017,46.05175781249997],[6.953710937500063,46.017138671875045],[7.00390625,45.95883789062506],[7.021093750000034,45.92578124999997],[6.790917968750023,45.740869140624966],[7.146386718750051,45.381738281249994],[7.07832031250004,45.23994140624998],[6.634765625000028,45.06816406249996],[6.99267578125,44.82729492187502],[6.900195312499989,44.33574218749996],[7.318554687500068,44.13798828125002],[7.637207031250057,44.16484375],[7.4931640625,43.767138671875045],[6.570214843750023,43.199072265625034],[6.115917968750011,43.07236328124998],[5.406542968750074,43.228515625],[5.05976562500004,43.44453125000004],[4.712109375000011,43.373291015625],[3.910839843750011,43.563085937500034],[3.258886718750063,43.193212890625006],[3.051757812500057,42.915136718750006],[3.21142578125,42.43115234375],[2.032714843750028,42.353515625],[1.927929687500068,42.42631835937499],[1.859765625000051,42.457080078125045],[1.7060546875,42.50332031250005],[1.709863281250051,42.604443359374955],[1.568164062500045,42.63500976562506],[1.501367187500023,42.64272460937502],[1.428320312499977,42.59589843749998],[0.696875,42.84511718750005],[0.631640625000045,42.689599609374994],[-0.586425781249943,42.798974609374966],[-1.300048828124943,43.10097656250002],[-1.460839843749937,43.05175781250006],[-1.410693359374932,43.240087890625034],[-1.794042968749949,43.407324218750006],[-1.484863281249943,43.56376953124999],[-1.245507812499937,44.55986328124999],[-1.07695312499996,44.68984375],[-1.152880859374989,44.764013671875006],[-1.245214843749977,44.66669921874998],[-1.081005859374983,45.532421874999955],[-0.548486328124966,45.00058593750006],[-0.790771484375028,45.46801757812497],[-1.195996093749983,45.714453125],[-1.03173828125,45.741064453125006],[-1.14628906249996,46.311376953125034],[-1.786523437499937,46.51484375000001],[-2.059375,46.81030273437497],[-2.01889648437492,47.03764648437502],[-2.197070312499989,47.16293945312506],[-2.027587890625028,47.27358398437502],[-1.742529296874949,47.21596679687502],[-1.97539062499996,47.31069335937505],[-2.503125,47.31206054687496],[-2.427685546874983,47.47089843749998],[-2.770312499999989,47.513867187499955],[-2.787207031249949,47.62553710937496],[-4.312109374999949,47.82290039062502],[-4.678808593749949,48.03950195312501],[-4.32944335937492,48.169970703125045],[-4.577148437499943,48.2900390625],[-4.241406249999926,48.30366210937501],[-4.719384765624966,48.363134765625034],[-4.7625,48.45024414062502],[-4.531201171874983,48.61997070312506],[-3.231445312499972,48.84082031250003],[-2.692333984374983,48.53681640624998],[-2.446191406249937,48.64829101562506],[-2.00371093749996,48.58208007812499],[-1.905712890624955,48.69711914062506],[-1.376464843749972,48.65258789062503],[-1.565478515624932,48.805517578125034],[-1.583105468749977,49.20239257812506],[-1.856445312499972,49.68378906249998],[-1.258642578124949,49.68017578125006],[-1.138525390624977,49.38789062500001],[-0.163476562499937,49.296777343749994],[0.41689453125008,49.448388671874994],[0.129394531250028,49.508447265624966],[0.186718749999983,49.703027343749994],[1.245507812500051,49.99824218750001],[1.5927734375,50.25219726562506],[1.672265625000023,50.885009765625],[2.52490234375,51.097119140624955],[2.759375,50.750634765624994],[3.10683593750008,50.779443359374994],[3.27333984375008,50.53154296875002],[3.595410156250068,50.47734374999999],[3.689355468750023,50.30605468750002],[4.174609375000017,50.24648437500005],[4.149316406250023,49.971582031249994],[4.545019531250063,49.96025390624999],[4.818652343750045,50.153173828125034],[4.867578125000051,49.78813476562502],[5.50732421875,49.51088867187502],[5.789746093749983,49.53828125000001]]]]},"properties":{"name":"France","childNum":10,"cp":[2.8719426,46.8222422]}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-7.186865234374949,62.139306640624966],[-7.116796874999977,62.046826171874955],[-7.379101562499926,62.07480468749998],[-7.186865234374949,62.139306640624966]]],[[[-6.631054687499955,62.22788085937498],[-6.655810546874932,62.09360351562498],[-6.840527343749983,62.119287109374994],[-6.725195312499949,61.95146484374999],[-7.17216796874996,62.28559570312501],[-6.631054687499955,62.22788085937498]]],[[[-6.406054687499932,62.258642578125034],[-6.544140624999926,62.20561523437499],[-6.554589843749994,62.35566406250001],[-6.406054687499932,62.258642578125034]]]]},"properties":{"name":"Faeroe Is.","childNum":3}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[158.31484375,6.813671875],[158.18339843750002,6.801269531250057],[158.13476562499997,6.944824218749986],[158.29462890625004,6.951074218750023],[158.31484375,6.813671875]]],[[[138.14267578125006,9.50068359375004],[138.06708984375004,9.419042968750006],[138.18583984375007,9.593310546874989],[138.14267578125006,9.50068359375004]]]]},"properties":{"name":"Micronesia","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[13.293554687500006,2.161572265624997],[13.172167968750017,1.78857421875],[13.21630859375,1.2484375],[13.851367187500017,1.41875],[14.180859375000011,1.370214843749991],[14.429882812500011,0.901464843749991],[14.32421875,0.62421875],[13.949609375000023,0.353808593749989],[13.860058593750011,-0.203320312500011],[14.47412109375,-0.573437500000011],[14.383984375000011,-1.890039062500009],[14.162890625000017,-2.217578125],[14.199804687500006,-2.354199218750011],[13.993847656250011,-2.490625],[13.886914062500011,-2.465429687500006],[13.733789062500023,-2.138476562500003],[13.464941406250006,-2.395410156250009],[12.991992187500017,-2.313378906250009],[12.793554687500006,-1.931835937500011],[12.590429687500006,-1.826855468750011],[12.43212890625,-1.928906250000011],[12.446386718750006,-2.329980468750009],[12.064453125,-2.41259765625],[11.60546875,-2.342578125],[11.537792968750011,-2.83671875],[11.760156250000023,-2.983105468750011],[11.715429687500006,-3.176953125000011],[11.934179687500006,-3.318554687500011],[11.8798828125,-3.665917968750009],[11.685742187500011,-3.68203125],[11.504296875000023,-3.5203125],[11.234472656250006,-3.690820312500009],[11.130175781250017,-3.916308593750003],[10.34765625,-3.013085937500009],[9.722070312500023,-2.467578125],[10.06201171875,-2.549902343750006],[9.624609375,-2.367089843750009],[9.298925781250006,-1.903027343750011],[9.483203125000017,-1.894628906250006],[9.265625,-1.825097656250009],[9.036328125000011,-1.308886718750003],[9.31884765625,-1.632031250000011],[9.501074218750006,-1.55517578125],[9.295800781250023,-1.515234375],[9.3466796875,-1.325],[9.203808593750011,-1.382421875],[9.064648437500011,-1.29833984375],[8.703125,-0.591015625000011],[8.946386718750006,-0.688769531250003],[9.296679687500017,-0.351269531250011],[9.354882812500023,0.343603515624991],[9.468164062500023,0.15976562499999],[9.796777343750023,0.044238281249989],[10.00146484375,0.194970703124994],[9.546484375,0.295947265624989],[9.324804687500006,0.552099609374991],[9.495312500000011,0.664843749999989],[9.617968750000017,0.576513671874991],[9.5908203125,1.031982421875],[9.636132812500023,1.046679687499989],[9.676464843750011,1.07470703125],[9.70458984375,1.079980468749994],[9.760546875000017,1.07470703125],[9.788671875,1.025683593749989],[9.803906250000011,0.998730468749997],[9.90673828125,0.960107421874994],[11.335351562500023,0.999707031249997],[11.332324218750017,1.528369140624989],[11.328710937500006,2.167431640624997],[11.348437500000017,2.299707031249994],[11.558984375000023,2.302197265624997],[13.2203125,2.256445312499991],[13.293554687500006,2.161572265624997]]]},"properties":{"name":"Gabon","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-1.065576171874966,50.69023437500002],[-1.25146484375,50.58881835937498],[-1.563427734374955,50.666113281250006],[-1.31279296874996,50.77348632812502],[-1.065576171874966,50.69023437500002]]],[[[-4.196777343749972,53.321435546874966],[-4.04936523437496,53.30576171874998],[-4.373046875,53.13417968750002],[-4.56787109375,53.386474609375],[-4.315087890625023,53.41723632812503],[-4.196777343749972,53.321435546874966]]],[[[-6.218017578125,54.08872070312506],[-6.649804687499937,54.05864257812496],[-7.007714843749937,54.40668945312501],[-7.324511718750017,54.13344726562502],[-7.606542968750006,54.14384765625002],[-8.118261718749977,54.41425781250004],[-7.75439453125,54.59492187499998],[-7.910595703124955,54.698339843750006],[-7.55039062499992,54.767968749999966],[-7.218652343749937,55.09199218749998],[-6.475048828124955,55.24101562499999],[-6.035791015624994,55.14453125000003],[-5.71684570312496,54.817480468750034],[-5.878613281249955,54.64130859375001],[-5.582519531249943,54.66342773437498],[-5.470410156249926,54.500195312499955],[-5.671093749999955,54.54975585937501],[-5.60678710937492,54.272558593750034],[-6.019042968749972,54.05126953124997],[-6.218017578125,54.08872070312506]]],[[[-5.105419921875011,55.448828125000034],[-5.331494140624955,55.481054687500034],[-5.318115234375,55.709179687499955],[-5.105419921875011,55.448828125000034]]],[[[-6.128906249999972,55.93056640625002],[-6.055322265624994,55.69531249999997],[-6.305078124999966,55.60693359375],[-6.286425781249989,55.77250976562499],[-6.491357421874994,55.697314453125045],[-6.462841796874955,55.808251953124994],[-6.128906249999972,55.93056640625002]]],[[[-5.970068359374949,55.814550781250034],[-6.071972656250011,55.893115234375045],[-5.72514648437496,56.118554687499966],[-5.970068359374949,55.814550781250034]]],[[[-5.77788085937496,56.344335937500034],[-6.313427734374983,56.29365234375001],[-6.138867187499955,56.490625],[-6.286328124999983,56.61186523437502],[-6.102734374999955,56.645654296874966],[-5.760839843749949,56.49067382812501],[-5.77788085937496,56.344335937500034]]],[[[-7.249853515624977,57.115332031250006],[-7.410546874999937,57.38110351562506],[-7.26713867187496,57.37177734375001],[-7.249853515624977,57.115332031250006]]],[[[-6.144726562499983,57.50498046874998],[-6.135546874999989,57.31425781250002],[-5.672460937499977,57.252685546875],[-5.94907226562492,57.045166015625],[-6.034375,57.20122070312499],[-6.322705078124926,57.20249023437498],[-6.761132812499994,57.4423828125],[-6.305957031249989,57.67197265624998],[-6.144726562499983,57.50498046874998]]],[[[-7.205566406250028,57.682958984375006],[-7.182617187499972,57.53330078125006],[-7.514746093749949,57.60195312500002],[-7.205566406250028,57.682958984375006]]],[[[-6.198681640624983,58.36328125000003],[-6.554589843749994,58.092871093750006],[-6.425195312499937,58.02128906249999],[-6.983105468749983,57.75],[-7.083447265624926,57.81376953124999],[-6.856835937499937,57.92353515624998],[-7.085253906249932,58.18217773437499],[-6.726464843749937,58.189404296874955],[-6.776464843750006,58.30151367187497],[-6.237451171874966,58.50283203125005],[-6.198681640624983,58.36328125000003]]],[[[-3.109667968749932,58.515478515625034],[-3.212353515624983,58.32124023437501],[-3.99003906249996,57.95903320312502],[-4.035595703124926,57.85200195312498],[-3.857128906249983,57.81855468750001],[-4.134521484375,57.57773437500006],[-3.402783203124955,57.708251953125],[-2.074072265624977,57.70239257812506],[-1.780664062499994,57.474023437499966],[-2.592675781249937,56.56157226562499],[-3.309960937499966,56.36347656250004],[-2.885156249999937,56.397509765625045],[-2.674267578124955,56.25341796875],[-3.362255859374955,56.02763671875002],[-3.789062499999972,56.09521484375],[-3.048730468749937,55.951953125000045],[-2.599316406249955,56.02729492187501],[-2.14707031249992,55.90297851562502],[-1.655371093749949,55.57036132812502],[-1.232421874999943,54.703710937500034],[-0.084375,54.118066406249994],[-0.20556640625,54.021728515625],[0.115332031250006,53.609277343749994],[-0.270019531249972,53.73676757812504],[-0.659912109375,53.72402343750002],[-0.293701171875,53.69233398437504],[0.270996093750028,53.33549804687499],[0.355761718750045,53.15996093750002],[0.0458984375,52.90561523437498],[0.279785156250028,52.80869140625006],[0.55878906250004,52.96694335937505],[1.05556640625008,52.95898437500003],[1.656738281249972,52.753710937500045],[1.74658203125,52.46899414062503],[1.59140625,52.11977539062502],[1.232421875000057,51.97124023437496],[1.188476562500057,51.803369140624966],[0.752246093750017,51.729589843750034],[0.890917968750017,51.571435546874966],[0.42451171875004,51.465625],[1.414941406250023,51.36328125],[1.397558593750034,51.18203125000002],[0.960156250000011,50.92587890624998],[0.299707031249994,50.775976562500006],[-0.785253906249949,50.76542968749999],[-1.416455078124955,50.896875],[-1.334472656249943,50.82080078124997],[-1.516748046874937,50.747460937499966],[-2.031054687499932,50.72539062499999],[-2.035839843749926,50.603076171875045],[-2.999414062499937,50.71660156249999],[-3.40458984374996,50.63242187499998],[-3.679785156250006,50.239941406249955],[-4.194580078124972,50.39331054687503],[-4.727978515624926,50.29047851562504],[-5.11850585937492,50.038330078125],[-5.622119140624932,50.05068359375002],[-4.188183593749926,51.18852539062502],[-3.135986328124972,51.20502929687501],[-2.433056640624926,51.74072265625],[-3.293115234374994,51.390429687500045],[-3.890771484374994,51.591650390625006],[-4.234570312499955,51.56909179687503],[-4.091015624999926,51.65991210937506],[-4.38627929687496,51.74106445312506],[-4.902294921874926,51.626269531250045],[-5.168359374999937,51.74072265625],[-5.183349609374972,51.94965820312501],[-4.217724609374983,52.277441406250006],[-3.980322265624949,52.54174804687503],[-4.101464843750023,52.915478515624955],[-4.683056640624926,52.80615234374997],[-4.268554687499943,53.14453125],[-3.427734374999972,53.34067382812498],[-3.097558593749937,53.260302734375045],[-3.064746093749932,53.426855468750034],[-2.74951171875,53.310205078124994],[-3.064599609374994,53.512841796874966],[-2.84648437499996,54.135302734375045],[-3.165966796874955,54.12792968750006],[-3.56938476562496,54.46757812499996],[-3.464599609374943,54.77309570312505],[-3.036230468749977,54.95307617187501],[-3.550439453124937,54.94741210937502],[-3.957910156249994,54.780957031249955],[-4.818066406249983,54.84614257812501],[-4.911230468749949,54.68945312500006],[-5.032324218749949,54.76137695312505],[-5.172705078124949,54.98588867187496],[-4.676757812499972,55.50131835937498],[-4.871679687499977,55.87392578125005],[-4.58408203124992,55.93867187500001],[-4.844091796874949,56.05117187499999],[-4.80029296875,56.158349609374994],[-5.228222656249983,55.886328125],[-5.084326171874977,56.197460937499955],[-5.41044921874996,55.995361328125],[-5.55644531249996,55.389599609374955],[-5.730664062499926,55.33413085937502],[-5.504492187499949,55.80239257812502],[-5.609570312499955,56.055273437500034],[-5.188378906249937,56.75805664062503],[-5.652441406249977,56.531982421875],[-6.133691406249966,56.706689453124966],[-5.730615234374994,56.853076171875045],[-5.86142578124992,56.902685546875006],[-5.561914062499994,57.23271484375002],[-5.794921874999972,57.37880859375002],[-5.581787109374972,57.546777343749966],[-5.744921874999989,57.668310546875034],[-5.608349609374955,57.88134765625],[-5.157226562499972,57.88134765625],[-5.413183593750006,58.06972656250002],[-5.338281250000023,58.23872070312498],[-5.008300781250028,58.262646484374955],[-5.016748046874966,58.566552734374966],[-4.433251953124937,58.51284179687505],[-3.25913085937492,58.65],[-3.053076171874949,58.63481445312502],[-3.109667968749932,58.515478515625034]]],[[[-3.057421874999932,59.02963867187498],[-2.793017578124989,58.906933593749955],[-3.331640624999949,58.97124023437499],[-3.31035156249996,59.13081054687498],[-3.057421874999932,59.02963867187498]]],[[[-1.30810546875,60.5375],[-1.052441406249955,60.44448242187502],[-1.299462890624994,59.87866210937503],[-1.290917968749937,60.153466796874966],[-1.663769531249983,60.282519531250074],[-1.374609374999949,60.33291015625002],[-1.571777343749972,60.494433593750074],[-1.363964843750011,60.60957031249998],[-1.30810546875,60.5375]]]]},"properties":{"name":"United Kingdom","childNum":14,"cp":[-2.5830348,54.4598409]}},{"geometry":{"type":"Polygon","coordinates":[[[46.30546875000002,41.507714843749994],[46.61894531250002,41.34375],[46.67255859375001,41.28681640625],[46.66240234375002,41.245507812499994],[46.62636718750002,41.15966796875],[46.534375,41.08857421875],[46.43095703125002,41.077050781249994],[46.086523437500006,41.183837890625],[45.28095703125001,41.449560546875],[45.21718750000002,41.423193359375],[45.00136718750002,41.290966796875],[44.97587890625002,41.277490234374994],[44.81132812500002,41.259375],[44.077246093750006,41.182519531249994],[43.43339843750002,41.155517578125],[43.20546875000002,41.199169921875],[43.15283203125,41.23642578125],[43.14101562500002,41.26484375],[43.17128906250002,41.287939453125],[43.149023437500006,41.30712890625],[43.05712890625,41.352832031249996],[42.90673828125,41.466845703124996],[42.82167968750002,41.4923828125],[42.78789062500002,41.563720703125],[42.75410156250001,41.57890625],[42.68242187500002,41.585742187499996],[42.60683593750002,41.57880859375],[42.590429687500006,41.57070312499999],[42.5673828125,41.55927734375],[42.46640625,41.43984375],[41.92578125,41.495654296874996],[41.82353515625002,41.432373046875],[41.779394531250006,41.44052734375],[41.701757812500006,41.471582031249994],[41.57656250000002,41.497314453125],[41.51005859375002,41.517480468749994],[41.701757812500006,41.705419921875],[41.76298828125002,41.970019531249996],[41.48876953125,42.659326171874994],[40.83662109375001,43.0634765625],[40.46210937500001,43.145703125],[39.97832031250002,43.419824218749994],[40.02373046875002,43.48486328125],[40.084570312500006,43.553125],[40.648046875,43.53388671875],[40.941992187500006,43.41806640625],[41.083105468750006,43.374462890625],[41.35820312500002,43.333398437499994],[41.46074218750002,43.276318359375],[41.58056640625,43.21923828125],[42.76064453125002,43.169580078124994],[42.99160156250002,43.09150390625],[43.00019531250001,43.049658203125],[43.08916015625002,42.9890625],[43.55781250000001,42.844482421875],[43.623046875,42.80771484375],[43.78261718750002,42.747021484375],[43.79873046875002,42.727783203125],[43.79541015625,42.702978515625],[43.74990234375002,42.657519531249996],[43.738378906250006,42.616992187499996],[43.759863281250006,42.59384765625],[43.82597656250002,42.571533203125],[43.95742187500002,42.566552734374994],[44.00468750000002,42.595605468749994],[44.10273437500001,42.616357421874994],[44.32949218750002,42.70351562499999],[44.505859375,42.7486328125],[44.77109375,42.616796875],[44.85048828125002,42.746826171875],[44.87099609375002,42.756396484374996],[44.943359375,42.730273437499996],[45.07158203125002,42.694140625],[45.160253906250006,42.675],[45.34375,42.52978515625],[45.56289062500002,42.5357421875],[45.70527343750001,42.498095703124996],[45.7275390625,42.475048828125],[45.63427734375,42.234716796875],[45.63857421875002,42.205078125],[46.21269531250002,41.989892578124994],[46.42988281250001,41.890966796875],[46.18427734375001,41.7021484375],[46.30546875000002,41.507714843749994]]]},"properties":{"name":"Georgia","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-0.068603515625,11.115625],[0.009423828125023,11.02099609375],[-0.08632812499999,10.673046875],[0.380859375,10.291845703124991],[0.264550781250023,9.644726562499997],[0.342578125000017,9.604150390624994],[0.2333984375,9.463525390624994],[0.525683593750017,9.398486328124989],[0.48876953125,8.851464843749994],[0.37255859375,8.75927734375],[0.686328125000017,8.354882812499994],[0.5,7.546875],[0.634765625,7.353662109374994],[0.525585937500011,6.850927734374991],[0.736914062500006,6.452587890624997],[1.187207031250011,6.089404296874989],[0.94970703125,5.810253906249997],[0.259667968750023,5.75732421875],[-2.001855468749994,4.762451171875],[-3.114013671875,5.088671874999989],[-2.815673828125,5.153027343749997],[-2.754980468749977,5.432519531249994],[-2.793652343749983,5.60009765625],[-2.998291015625,5.71132812499999],[-3.227148437499977,6.749121093749991],[-2.959082031249977,7.454541015624997],[-2.789746093749983,7.931933593749989],[-2.668847656249994,8.022216796875],[-2.613378906249977,8.046679687499989],[-2.600976562499994,8.082226562499997],[-2.619970703124977,8.12109375],[-2.61171875,8.147558593749991],[-2.538281249999983,8.171630859375],[-2.505859375,8.208740234375],[-2.600390624999989,8.800439453124994],[-2.649218749999989,8.956591796874989],[-2.689892578124983,9.025097656249997],[-2.746923828124977,9.045117187499997],[-2.705761718749983,9.351367187499989],[-2.695849609374989,9.481347656249994],[-2.706201171874994,9.533935546875],[-2.765966796874977,9.658056640624991],[-2.780517578125,9.745849609375],[-2.791162109374994,10.432421874999989],[-2.914892578124977,10.592333984374989],[-2.829931640624977,10.998388671874991],[-1.04248046875,11.010058593749989],[-0.627148437499983,10.927392578124994],[-0.299462890624994,11.166894531249994],[-0.068603515625,11.115625]]]},"properties":{"name":"Ghana","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-11.389404296875,12.404394531249991],[-11.502197265625,12.198632812499994],[-11.30517578125,12.015429687499989],[-10.933203124999977,12.205175781249991],[-10.709228515625,11.898730468749989],[-10.274853515624983,12.212646484375],[-9.754003906249977,12.029931640624994],[-9.358105468749983,12.255419921874989],[-9.395361328124977,12.464648437499989],[-9.043066406249977,12.40234375],[-8.818310546874983,11.922509765624994],[-8.822021484375,11.673242187499994],[-8.398535156249977,11.366552734374991],[-8.666699218749983,11.009472656249997],[-8.33740234375,10.990625],[-8.266650390624989,10.485986328124994],[-8.007275390624983,10.321875],[-7.990625,10.1625],[-8.155175781249994,9.973193359374989],[-8.136962890625,9.49570312499999],[-7.896191406249983,9.415869140624991],[-7.918066406249977,9.188525390624989],[-7.839404296874989,9.151611328125],[-7.7998046875,9.115039062499989],[-7.777978515624994,9.080859374999989],[-7.902099609375,9.01708984375],[-7.938183593749983,8.979785156249989],[-7.950976562499989,8.786816406249997],[-7.719580078124977,8.643017578124997],[-7.696093749999989,8.375585937499991],[-7.823583984374977,8.467675781249994],[-7.953125,8.477734375],[-8.236962890624994,8.455664062499991],[-8.244140625,8.407910156249997],[-8.256103515625,8.253710937499989],[-8.217138671874977,8.219677734374997],[-8.140625,8.181445312499989],[-8.048583984375,8.169726562499989],[-8.009863281249977,8.07851562499999],[-8.126855468749994,7.867724609374989],[-8.115429687499983,7.7607421875],[-8.205957031249994,7.59023437499999],[-8.231884765624983,7.556738281249991],[-8.429980468749989,7.601855468749989],[-8.486425781249977,7.558496093749994],[-8.659765624999977,7.688378906249994],[-8.8896484375,7.2626953125],[-9.11757812499999,7.215917968749991],[-9.463818359374983,7.415869140624991],[-9.369140625,7.703808593749997],[-9.518261718749983,8.34609375],[-9.781982421875,8.537695312499991],[-10.064355468749994,8.429882812499997],[-10.147412109374983,8.519726562499997],[-10.233056640624994,8.488818359374989],[-10.283203125,8.485156249999989],[-10.360058593749983,8.495507812499994],[-10.394433593749994,8.48095703125],[-10.496435546874977,8.362109374999989],[-10.557714843749977,8.315673828125],[-10.686962890624983,8.321679687499994],[-10.712109374999983,8.335253906249989],[-10.677343749999977,8.400585937499997],[-10.500537109374989,8.687548828124989],[-10.615966796875,9.059179687499991],[-10.726855468749989,9.081689453124994],[-10.747021484374983,9.095263671874989],[-10.749951171874983,9.122363281249989],[-10.687646484374994,9.261132812499994],[-10.682714843749977,9.289355468749989],[-10.758593749999989,9.385351562499991],[-11.047460937499977,9.786328125],[-11.180859374999983,9.925341796874989],[-11.205664062499977,9.977734375],[-11.273632812499983,9.996533203124997],[-11.911083984374983,9.993017578124991],[-12.142333984375,9.87539062499999],[-12.427978515625,9.898144531249997],[-12.557861328125,9.704980468749994],[-12.755859375,9.373583984374989],[-12.958789062499989,9.263330078124994],[-13.077294921874994,9.069628906249989],[-13.292675781249983,9.04921875],[-13.436279296875,9.4203125],[-13.691357421874983,9.535791015624994],[-13.689794921874977,9.927783203124989],[-13.820117187499989,9.88720703125],[-14.045019531249977,10.141259765624994],[-14.426904296874994,10.248339843749989],[-14.609570312499983,10.549853515624989],[-14.593505859375,10.766699218749991],[-14.677343749999977,10.68896484375],[-14.775927734374989,10.931640625],[-14.88671875,10.968066406249989],[-14.975,10.803417968749997],[-15.051220703124983,10.834570312499991],[-15.043017578124989,10.940136718749997],[-14.9990234375,10.9921875],[-14.944433593749977,11.072167968749994],[-14.779296875,11.405517578125],[-14.720263671874989,11.48193359375],[-14.682958984374977,11.508496093749997],[-14.604785156249989,11.511621093749994],[-14.452441406249989,11.556201171874989],[-14.327832031249983,11.629785156249994],[-14.265576171874983,11.659912109375],[-14.122314453125,11.65195312499999],[-13.953222656249977,11.664599609374989],[-13.732763671874977,11.736035156249997],[-13.730664062499983,11.959863281249994],[-13.737988281249983,12.009667968749994],[-13.816308593749994,12.054492187499989],[-13.948876953124994,12.178173828124997],[-13.8875,12.246875],[-13.759765625,12.262353515624994],[-13.673535156249983,12.478515625],[-13.732617187499983,12.592822265624989],[-13.729248046875,12.673925781249991],[-13.082910156249994,12.633544921875],[-13.061279296875,12.489990234375],[-12.930712890624989,12.532275390624989],[-12.399072265624994,12.340087890625],[-11.389404296875,12.404394531249991]]]},"properties":{"name":"Guinea","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-16.763330078124994,13.064160156249997],[-16.824804687499977,13.341064453125],[-16.669335937499994,13.475],[-16.41337890624999,13.269726562499997],[-15.427490234375,13.46835937499999],[-16.135449218749983,13.4482421875],[-16.351806640625,13.34335937499999],[-16.56230468749999,13.587304687499994],[-15.509667968749994,13.586230468750003],[-15.426855468749977,13.727001953124997],[-15.108349609374983,13.81210937499999],[-14.405468749999983,13.503710937500003],[-13.977392578124977,13.54345703125],[-13.826708984374989,13.4078125],[-14.246777343749983,13.23583984375],[-15.151123046875,13.556494140624991],[-15.286230468749977,13.39599609375],[-15.814404296874983,13.325146484374997],[-15.834277343749989,13.156445312499997],[-16.648779296874977,13.154150390624991],[-16.763330078124994,13.064160156249997]]]},"properties":{"name":"Gambia","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-15.895898437499966,11.082470703124969],[-15.963964843749977,11.05898437499998],[-15.937695312499955,11.192773437499966],[-15.895898437499966,11.082470703124969]]],[[[-16.11450195312503,11.059423828124977],[-16.236425781249977,11.113427734374966],[-16.06733398437501,11.197216796874983],[-16.11450195312503,11.059423828124977]]],[[[-15.901806640624926,11.4658203125],[-16.02319335937497,11.477148437499991],[-15.964550781249926,11.59829101562498],[-15.901806640624926,11.4658203125]]],[[[-15.986425781249949,11.882031249999969],[-16.038330078124943,11.759716796875011],[-16.15244140624992,11.876806640624963],[-15.986425781249949,11.882031249999969]]],[[[-13.759765625,12.262353515624994],[-13.8875,12.246875],[-13.948876953124966,12.178173828124997],[-13.737988281250011,12.009667968750037],[-13.730664062499926,11.959863281250009],[-13.73276367187492,11.736035156249983],[-13.953222656249977,11.664599609374989],[-14.265576171874926,11.659912109375014],[-14.327832031250011,11.629785156250009],[-14.452441406249989,11.556201171875017],[-14.604785156249932,11.511621093749994],[-14.682958984374949,11.508496093749983],[-14.720263671875017,11.481933593749986],[-14.779296874999972,11.405517578125057],[-14.944433593749949,11.072167968749994],[-14.999023437499972,10.992187500000043],[-15.04301757812496,10.940136718750011],[-15.09375,11.011035156249974],[-15.054589843749994,11.141943359375006],[-15.222119140624926,11.030908203125037],[-15.216699218749994,11.15625],[-15.39311523437496,11.217236328124983],[-15.354687499999955,11.396337890624963],[-15.479492187499972,11.410302734374966],[-15.072656249999937,11.597802734374966],[-15.230371093750023,11.686767578124972],[-15.412988281249994,11.615234374999972],[-15.501904296875011,11.723779296874966],[-15.467187499999937,11.842822265624974],[-15.078271484374937,11.968994140625014],[-15.941748046875006,11.786621093749986],[-15.92021484374996,11.93779296874996],[-16.138427734375,11.917285156250045],[-16.32807617187501,12.051611328124963],[-16.244580078124955,12.237109375],[-16.43681640624996,12.204150390625045],[-16.711816406249937,12.354833984375006],[-16.656933593749955,12.364355468749991],[-16.52133789062495,12.348632812499986],[-16.41630859374996,12.367675781250057],[-16.24150390624996,12.443310546875011],[-16.144189453124937,12.457421875000037],[-15.839550781249955,12.437890624999966],[-15.57480468749992,12.490380859375009],[-15.19609375,12.679931640624986],[-14.3492187499999,12.67641601562498],[-14.064843749999966,12.675292968750014],[-13.729248046875,12.673925781250006],[-13.732617187499983,12.592822265625003],[-13.673535156249926,12.478515624999986],[-13.759765625,12.262353515624994]]]]},"properties":{"name":"Guinea-Bissau","childNum":5}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[11.332324218750017,1.528369140624989],[11.335351562500023,0.999707031250011],[9.906738281250028,0.960107421875037],[9.80390625000004,0.998730468749997],[9.788671875000034,1.025683593749974],[9.760546874999989,1.074707031250014],[9.704589843750057,1.079980468750023],[9.676464843750011,1.074707031250014],[9.636132812500051,1.046679687499989],[9.590820312500057,1.031982421875014],[9.599414062500045,1.054443359374972],[9.509863281250006,1.114794921875017],[9.385937500000068,1.13925781250002],[9.807031250000051,1.927490234375028],[9.77968750000008,2.068212890625006],[9.800781250000028,2.304443359375],[9.826171875000057,2.297802734374969],[9.8369140625,2.242382812500054],[9.870117187500028,2.21328125],[9.979882812499994,2.167773437500045],[10.790917968750023,2.167578125],[11.096582031250051,2.167480468749986],[11.328710937500006,2.167431640624969],[11.332324218750017,1.528369140624989]]],[[[8.735742187500023,3.758300781249972],[8.910058593750023,3.758203125000051],[8.946093750000074,3.627539062499977],[8.704003906250051,3.223632812500028],[8.474902343749989,3.264648437500043],[8.464648437500045,3.450585937499994],[8.735742187500023,3.758300781249972]]]]},"properties":{"name":"Eq. Guinea","childNum":2}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[23.852246093749983,35.53544921874999],[24.166015625000057,35.59521484375],[24.108984374999977,35.49580078124998],[24.35400390625,35.359472656250034],[25.73017578125004,35.34858398437501],[25.791308593750074,35.122851562500045],[26.32021484375008,35.315136718749955],[26.165625,35.018603515625045],[24.79980468750003,34.93447265625002],[24.70888671875008,35.08906250000001],[24.463671875000045,35.160351562499955],[23.59277343749997,35.257226562499966],[23.56982421875,35.534765625000034],[23.67265624999999,35.51391601562506],[23.736914062500034,35.65551757812503],[23.852246093749983,35.53544921874999]]],[[[27.17607421874999,35.46528320312498],[27.070703125000023,35.59775390624998],[27.22314453125,35.820458984374966],[27.17607421874999,35.46528320312498]]],[[[23.053808593750034,36.18979492187498],[22.91083984375004,36.220996093750045],[22.950488281250045,36.38393554687502],[23.053808593750034,36.18979492187498]]],[[[27.84277343750003,35.929296875000034],[27.71552734375004,35.95732421874996],[27.71630859375003,36.17158203125001],[28.23183593750005,36.43364257812502],[28.087792968750023,36.06533203125002],[27.84277343750003,35.929296875000034]]],[[[25.48242187500003,36.39262695312502],[25.37050781250005,36.35893554687499],[25.408984375000074,36.473730468750006],[25.48242187500003,36.39262695312502]]],[[[26.46064453125001,36.58540039062501],[26.270019531250057,36.54692382812499],[26.370019531250023,36.63857421875002],[26.46064453125001,36.58540039062501]]],[[[26.94960937500005,36.72709960937502],[27.214941406250006,36.89863281249998],[27.352148437499977,36.86889648437506],[26.94960937500005,36.72709960937502]]],[[[25.859375,36.79042968750005],[25.74316406250003,36.78974609374998],[26.06445312500003,36.90273437500002],[25.859375,36.79042968750005]]],[[[27.01972656250004,36.95903320312502],[26.91992187500003,36.94521484375005],[26.88867187499997,37.087255859375034],[27.01972656250004,36.95903320312502]]],[[[25.278906250000034,37.06840820312502],[25.105468750000057,37.034960937500045],[25.235058593750068,37.148535156250006],[25.278906250000034,37.06840820312502]]],[[[25.54589843749997,36.96757812499999],[25.45673828125001,36.9296875],[25.361914062500063,37.07041015624998],[25.52529296875005,37.19638671875006],[25.54589843749997,36.96757812499999]]],[[[24.523535156250063,37.125097656250006],[24.42480468750003,37.131982421874994],[24.48378906250005,37.21020507812503],[24.523535156250063,37.125097656250006]]],[[[25.402734375000023,37.419140624999955],[25.312695312500068,37.48930664062496],[25.462988281250063,37.47109375],[25.402734375000023,37.419140624999955]]],[[[26.029296875000057,37.529394531250034],[26.086328125000023,37.63491210937505],[26.351367187500017,37.67431640625],[26.029296875000057,37.529394531250034]]],[[[25.255859375000057,37.59960937500006],[25.156347656250034,37.54506835937505],[24.99648437500005,37.676904296874994],[25.255859375000057,37.59960937500006]]],[[[24.35595703125003,37.57685546875004],[24.28896484375005,37.52827148437498],[24.37910156250004,37.682714843750006],[24.35595703125003,37.57685546875004]]],[[[26.82441406250004,37.81142578125005],[27.05507812500005,37.70927734375002],[26.84492187500004,37.64472656250001],[26.58105468750003,37.723730468750034],[26.82441406250004,37.81142578125005]]],[[[20.888476562500074,37.805371093749955],[20.993945312500074,37.70800781250003],[20.81855468750004,37.66474609375001],[20.61953125000008,37.855029296875045],[20.691503906250006,37.929541015625034],[20.888476562500074,37.805371093749955]]],[[[24.991699218750057,37.75961914062506],[24.962207031250074,37.69238281250003],[24.7001953125,37.961669921875],[24.956347656250045,37.90478515625006],[24.991699218750057,37.75961914062506]]],[[[20.61230468750003,38.38334960937502],[20.761328125,38.07055664062497],[20.523535156250063,38.106640624999955],[20.4521484375,38.23417968750002],[20.35253906250003,38.179882812499955],[20.563183593750068,38.474951171875034],[20.61230468750003,38.38334960937502]]],[[[26.094042968750017,38.21806640625002],[25.891894531250045,38.243310546874994],[25.991406250000068,38.353515625],[25.846093750000023,38.57402343749996],[26.16035156250001,38.54072265625001],[26.094042968750017,38.21806640625002]]],[[[20.68671875000001,38.60869140625002],[20.5546875,38.58256835937502],[20.69414062499999,38.84423828125003],[20.68671875000001,38.60869140625002]]],[[[24.67470703125005,38.80922851562502],[24.54101562499997,38.788671875],[24.485644531250074,38.980273437500045],[24.67470703125005,38.80922851562502]]],[[[23.41542968750008,38.958642578124994],[23.525,38.8134765625],[24.127539062500034,38.648486328125045],[24.27578125000005,38.22001953124996],[24.58837890625003,38.12397460937504],[24.53652343750005,37.97973632812506],[24.212011718750006,38.11752929687506],[24.040136718750006,38.389990234375034],[23.65078125000008,38.44306640625001],[23.25214843750004,38.80122070312498],[22.870312500000068,38.870507812499966],[23.258203125000023,39.03134765625006],[23.41542968750008,38.958642578124994]]],[[[26.41015625000003,39.329443359375034],[26.59560546875005,39.04882812499997],[26.488671875000023,39.074804687500034],[26.46875,38.97280273437502],[26.10791015625,39.08105468749997],[26.273144531249983,39.19755859374999],[26.072363281250034,39.095605468749994],[25.84414062500008,39.20004882812506],[26.16542968750008,39.37353515625006],[26.41015625000003,39.329443359375034]]],[[[20.077929687500045,39.432714843750034],[19.883984375000068,39.461523437500034],[19.646484375,39.76708984375003],[19.926074218750017,39.773730468750045],[19.8466796875,39.66811523437502],[20.077929687500045,39.432714843750034]]],[[[25.43769531250004,39.98330078125002],[25.357031250000063,39.80810546875003],[25.24941406250005,39.89414062500006],[25.06220703125004,39.852392578125006],[25.05800781250005,39.999658203124966],[25.43769531250004,39.98330078125002]]],[[[24.774218750000074,40.615185546874955],[24.515527343750023,40.64702148437496],[24.623339843750045,40.79291992187501],[24.774218750000074,40.615185546874955]]],[[[26.03896484375008,40.726757812499955],[25.10449218750003,40.994726562500006],[24.792968750000057,40.857519531250034],[24.47705078125,40.94775390625003],[24.082324218750074,40.72407226562504],[23.762792968750063,40.74780273437497],[23.866796875000034,40.41855468750006],[24.21279296875008,40.32778320312502],[24.343359375000034,40.14770507812503],[23.913183593750063,40.35878906250005],[23.72792968750008,40.329736328124994],[23.96748046875001,40.11455078125002],[23.947070312500045,39.96557617187506],[23.66455078125003,40.22382812499998],[23.42626953125,40.26396484374999],[23.62734375,39.92407226562503],[22.896484375000057,40.39990234374997],[22.92226562500008,40.59086914062499],[22.629492187500034,40.49555664062501],[22.59218750000005,40.03691406250002],[23.327734374999977,39.174902343750006],[23.15468750000008,39.10146484375005],[23.16171875,39.25776367187501],[22.92138671874997,39.30634765625004],[22.886035156250074,39.16997070312496],[23.066699218750017,39.03793945312498],[22.569140625000074,38.86748046874999],[23.25292968750003,38.66123046875006],[23.68398437500008,38.35244140625002],[23.96699218750001,38.275],[24.024511718750006,38.139794921874966],[24.01972656250001,37.67773437499997],[23.50175781249999,38.03486328124998],[23.03632812500004,37.87836914062501],[23.48925781250003,37.440185546875],[23.16152343750005,37.333837890625006],[22.725390625000017,37.542138671874966],[23.16015625000003,36.448095703125034],[22.717187500000023,36.79394531250006],[22.42773437500003,36.47578124999998],[22.08046875000008,37.028955078124966],[21.95556640625003,36.990087890625034],[21.892382812500045,36.73730468749997],[21.58291015625005,37.080957031249994],[21.678906250000068,37.38720703125003],[21.124707031250068,37.89160156250003],[21.40371093750005,38.19667968750002],[21.658398437500068,38.17509765624996],[21.82470703125003,38.328125],[22.846386718750068,37.96757812499996],[23.18349609375008,38.133691406249966],[22.421679687500045,38.43852539062499],[22.319921875,38.35683593750005],[21.96533203124997,38.412451171875006],[21.47255859375005,38.321386718750006],[21.3310546875,38.48730468749997],[21.303320312500034,38.373925781249966],[21.113183593750023,38.38466796875002],[20.768554687500057,38.874414062499966],[21.111621093750045,38.89628906249999],[21.11835937500001,39.029980468749955],[20.71337890625,39.03515625000003],[20.300781250000057,39.32709960937501],[20.19140625,39.545800781249966],[20.099414062500074,39.641259765624966],[20.001269531250074,39.70942382812501],[20.022558593750063,39.710693359375],[20.059765624999983,39.69912109375002],[20.13105468750004,39.66162109375003],[20.206835937500017,39.65351562499998],[20.382421875,39.802636718749994],[20.381640625000017,39.84179687500006],[20.311328125000074,39.95078125000006],[20.311132812500034,39.97944335937504],[20.338476562500006,39.991064453125006],[20.38369140625008,40.0171875],[20.408007812500074,40.049462890624994],[20.4560546875,40.065576171874994],[20.657421875000068,40.11738281249998],[20.881640625000017,40.467919921874994],[21.030859375000034,40.62246093750002],[20.95576171875001,40.775292968749994],[20.96425781250005,40.84990234374999],[21.575781250000034,40.86894531249996],[21.627539062500006,40.896337890625034],[21.77949218750004,40.95043945312506],[21.99335937500001,41.13095703125006],[22.18447265625005,41.15864257812501],[22.49355468750005,41.118505859375006],[22.603613281249977,41.14018554687499],[22.724804687500068,41.17851562499999],[22.78388671875004,41.33198242187498],[23.155957031250068,41.32207031249999],[23.239843750000034,41.38496093750001],[23.372070312500057,41.3896484375],[23.433398437500017,41.39873046874999],[23.53583984375001,41.38603515624999],[23.63515625000008,41.386767578125045],[24.011328124999977,41.460058593750034],[24.03291015625004,41.469091796875034],[24.05605468750005,41.527246093749966],[24.38671875,41.523535156250006],[24.487890625,41.55522460937499],[24.518261718750068,41.55253906249996],[24.773730468750045,41.356103515624994],[24.99355468750008,41.36499023437503],[25.133398437500063,41.31577148437506],[25.251171875000068,41.243554687499994],[25.923339843750057,41.311914062499966],[26.066406250000057,41.35068359375006],[26.135351562499977,41.3857421875],[26.155175781250023,41.43486328124999],[26.143554687500057,41.52153320312496],[26.085546875000063,41.704150390625045],[26.10742187499997,41.72568359374998],[26.20058593750005,41.74379882812502],[26.320898437500034,41.716552734375],[26.581347656250074,41.60126953125004],[26.62490234375008,41.401757812499994],[26.330664062499977,41.23876953125],[26.331054687500057,40.954492187499994],[26.03896484375008,40.726757812499955]]]]},"properties":{"name":"Greece","childNum":29}},{"geometry":{"type":"Polygon","coordinates":[[[-61.71552734375,12.012646484374997],[-61.714990234374994,12.18515625],[-61.60703125,12.223291015624994],[-61.71552734375,12.012646484374997]]]},"properties":{"name":"Grenada","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-46.266699218750006,60.781396484374994],[-46.381542968749955,60.66030273437502],[-46.7880859375,60.758398437500034],[-46.205224609374994,60.943505859374994],[-46.266699218750006,60.781396484374994]]],[[[-37.03125,65.53198242187497],[-37.23842773437494,65.60986328125003],[-37.047509765624966,65.722265625],[-37.03125,65.53198242187497]]],[[[-51.01367187499994,69.55249023437497],[-51.202050781249966,69.525],[-51.33886718749994,69.73203125000006],[-51.094580078125006,69.92416992187503],[-50.67900390624999,69.84853515625],[-51.01367187499994,69.55249023437497]]],[[[-52.73115234375001,69.94472656250005],[-52.0453125,69.8072265625],[-51.90019531249999,69.60478515625007],[-53.57841796874996,69.25664062500002],[-54.18271484374995,69.40351562500001],[-53.65830078124998,69.46513671875005],[-53.825,69.54033203124999],[-54.91914062499998,69.71362304687503],[-54.78789062499996,69.94985351562502],[-54.322607421875034,69.94189453125],[-54.83076171875001,70.13295898437502],[-54.37163085937499,70.31728515625],[-53.296728515625034,70.20537109375002],[-52.73115234375001,69.94472656250005]]],[[[-51.67514648437498,70.855224609375],[-52.11938476562497,70.87065429687502],[-52.10673828124999,70.96801757812497],[-51.67514648437498,70.855224609375]]],[[[-25.43232421875001,70.92133789062495],[-25.402246093749994,70.65268554687503],[-26.217871093749977,70.45405273437498],[-26.604687499999926,70.55336914062497],[-28.03525390624995,70.48681640625],[-27.61723632812496,70.91376953125001],[-26.621777343749955,70.87563476562497],[-25.81889648437499,71.04365234375001],[-25.43232421875001,70.92133789062495]]],[[[-53.53520507812493,71.04082031250005],[-53.9578125,71.12773437499999],[-53.58447265625003,71.29707031249995],[-53.53520507812493,71.04082031250005]]],[[[-55.01689453124999,72.79111328125003],[-55.56660156249998,72.56435546875002],[-56.214794921874955,72.71918945312495],[-55.01689453124999,72.79111328125003]]],[[[-18.000537109374932,75.40732421875003],[-17.391992187499937,75.03691406250007],[-18.670800781249966,75.00166015624998],[-18.856054687499977,75.31914062500002],[-18.000537109374932,75.40732421875003]]],[[[-18.58261718749995,76.042333984375],[-19.085351562499966,76.43037109375001],[-18.882470703124937,76.70380859375001],[-18.58261718749995,76.042333984375]]],[[[-71.667333984375,77.32529296874998],[-72.48955078124999,77.43164062499997],[-71.43344726562495,77.394384765625],[-71.667333984375,77.32529296874998]]],[[[-17.6125,79.82587890624995],[-18.662011718749966,79.72001953125005],[-19.13828125,79.85234375000002],[-17.98291015625,80.05517578125003],[-17.471386718749955,80.02871093749997],[-17.6125,79.82587890624995]]],[[[-44.86455078124999,82.08364257812502],[-46.75190429687501,82.34819335937502],[-47.27226562499996,82.65693359375001],[-46.399169921875,82.692138671875],[-44.91748046875003,82.48051757812505],[-44.86455078124999,82.08364257812502]]],[[[-29.952880859375,83.56484374999997],[-25.795068359374994,83.26098632812497],[-31.99267578125,83.0853515625],[-32.03271484374997,82.98344726562502],[-25.12338867187495,83.15961914062501],[-24.47031249999995,82.87739257812498],[-21.582519531249943,82.6341796875],[-23.118066406249966,82.32470703125003],[-29.57939453124996,82.16118164062502],[-29.887402343749983,82.05483398437502],[-29.543847656249994,81.93994140624997],[-27.839501953124966,82.04887695312505],[-25.148828124999966,82.001123046875],[-24.293066406249977,81.70097656250005],[-23.103710937499983,82.01181640625003],[-21.337988281249977,82.068701171875],[-21.230517578125017,81.60136718749999],[-23.11772460937499,80.77817382812498],[-19.62993164062499,81.63989257812503],[-17.456054687499943,81.397705078125],[-16.12070312499995,81.776611328125],[-14.241992187500017,81.81386718750005],[-12.434423828125006,81.68251953125002],[-11.430664062499972,81.45683593750005],[-13.126220703124972,81.08779296875],[-14.452343749999955,80.99311523437498],[-14.503564453124994,80.76328125000006],[-16.76059570312492,80.573388671875],[-15.937255859374972,80.42763671874997],[-16.48876953124997,80.25195312499997],[-18.070947265624994,80.17207031249995],[-19.429199218749943,80.25771484375],[-20.150146484375,80.01123046874997],[-18.99199218749996,79.17836914062502],[-21.133740234374926,78.65864257812501],[-21.729589843749977,77.70854492187499],[-20.862597656249932,77.91186523437503],[-19.490429687499983,77.71889648437497],[-19.46752929687503,77.56582031250005],[-20.162060546874926,77.68984375],[-20.680810546875023,77.61899414062503],[-20.23193359374997,77.36840820312497],[-19.30029296874997,77.22236328124995],[-18.442626953124943,77.259375],[-18.51030273437496,76.77817382812498],[-20.48671875,76.92080078125],[-21.614697265624926,76.68789062499997],[-22.18525390625001,76.79409179687502],[-22.609326171874983,76.70429687500004],[-21.877343749999966,76.57348632812503],[-21.488232421874926,76.271875],[-20.10361328124992,76.21909179687503],[-19.508984374999926,75.75751953124995],[-19.52636718750003,75.18022460937505],[-20.484960937500006,75.31425781249999],[-21.649316406249966,75.02343749999997],[-22.232861328124926,75.11972656249998],[-21.69511718749999,74.96445312500003],[-20.985791015624983,75.07436523437497],[-20.86157226562497,74.63593750000001],[-20.41708984374995,74.9751953125],[-19.98491210937499,74.9751953125],[-19.287011718750023,74.54638671875006],[-19.36914062499997,74.28403320312498],[-20.256445312499977,74.2828125],[-20.653125,74.13735351562502],[-21.954931640624977,74.24428710937497],[-21.942919921874932,74.56572265624999],[-22.32158203124999,74.30253906250002],[-22.134814453124932,73.99047851562503],[-20.36728515624992,73.8482421875],[-20.509667968749966,73.49287109375001],[-22.346875,73.26923828125001],[-23.23320312499999,73.39770507812497],[-24.157714843749943,73.76445312499999],[-24.67724609375,73.602197265625],[-25.521289062500017,73.85161132812499],[-24.79125976562497,73.51127929687502],[-26.062304687500017,73.25302734375],[-27.270410156250023,73.43627929687503],[-26.541845703125006,73.24897460937495],[-27.561621093750006,73.13847656250002],[-27.348046875000023,73.06782226562501],[-25.057031250000023,73.396484375],[-24.132666015625006,73.409375],[-22.036328124999955,72.91845703125006],[-22.29321289062497,72.11953125],[-24.06904296875001,72.49873046874998],[-24.629980468749977,73.03764648437499],[-26.657617187499966,72.71582031249997],[-24.81333007812492,72.90151367187497],[-24.65,72.58251953125],[-25.117871093749983,72.34697265625005],[-24.66684570312492,72.437353515625],[-21.959667968749955,71.74467773437502],[-22.479638671874937,71.38344726562497],[-22.417578125,71.24868164062505],[-22.29902343750001,71.43232421874998],[-21.75224609374999,71.47832031250002],[-21.522656249999926,70.52622070312503],[-22.38413085937492,70.46240234375],[-22.437011718749943,70.860009765625],[-22.690673828124943,70.43730468750002],[-23.327832031249983,70.45097656250007],[-23.97138671875001,70.64946289062499],[-24.562207031249926,71.22353515624997],[-25.885156249999966,71.571923828125],[-27.08720703124999,71.6265625],[-27.107031250000034,71.53266601562498],[-25.842724609374955,71.48017578124995],[-25.74223632812499,71.18359375],[-26.717919921874994,70.95048828125005],[-28.39843749999997,70.99291992187497],[-27.99218749999997,70.89521484374998],[-28.06987304687499,70.69902343750005],[-29.07207031249999,70.444970703125],[-26.621777343749955,70.46337890625],[-26.576806640625023,70.35708007812502],[-27.560839843749932,70.12446289062498],[-27.384179687500023,69.9916015625],[-27.027734374999966,70.20122070312499],[-25.529882812499977,70.35317382812502],[-23.66733398437495,70.139306640625],[-22.28447265624996,70.12583007812498],[-22.287060546874955,70.03339843749998],[-23.03364257812501,69.90083007812498],[-23.04956054687497,69.79272460937497],[-23.86572265624997,69.73671875000002],[-23.739404296874994,69.58862304687497],[-24.296679687500017,69.58554687500006],[-24.295556640624966,69.439306640625],[-25.188574218750006,69.26054687500002],[-25.092431640624937,69.16518554687502],[-25.697998046874943,68.889892578125],[-26.48291015624997,68.67592773437502],[-29.24951171874997,68.29877929687501],[-29.86850585937495,68.31157226562505],[-30.318115234375,68.19331054687501],[-30.72001953124999,68.25117187499998],[-30.610742187499994,68.11791992187503],[-30.97856445312499,68.06132812500005],[-32.32744140624999,68.43730468749999],[-32.16455078125,67.99111328125002],[-33.15698242187497,67.62670898437506],[-34.1982421875,66.65507812499999],[-35.18857421874995,66.25029296875002],[-35.86723632812502,66.44140624999997],[-35.630078124999926,66.13994140625002],[-36.37919921874996,65.830810546875],[-36.52724609375002,66.00771484375],[-36.665185546874966,65.79008789062507],[-37.06279296874996,65.87143554687503],[-37.410058593749994,65.65634765625],[-37.954785156249955,65.63359375000007],[-37.278710937499994,66.30439453124995],[-38.156640624999966,66.38559570312498],[-37.75234375000002,66.26152343750002],[-38.13994140625002,65.90351562499998],[-38.52036132812498,66.00966796875002],[-38.20336914062497,65.71171874999999],[-40.17353515624998,65.55615234375],[-39.57792968749996,65.34077148437501],[-39.937255859375,65.14160156250003],[-40.253125,65.04887695312505],[-41.08442382812501,65.10083007812497],[-40.966015624999955,64.86884765624995],[-40.655468749999926,64.91533203125002],[-40.18222656249998,64.47993164062495],[-40.78173828125,64.22177734375003],[-41.581005859374926,64.29833984375],[-41.03056640624996,64.12104492187504],[-40.61777343749998,64.13173828125],[-40.550390625000034,63.72524414062505],[-40.77519531249999,63.53364257812501],[-41.04873046875002,63.51381835937505],[-41.387890624999926,63.06186523437498],[-41.84448242187497,63.07026367187501],[-42.174511718749955,63.20878906249999],[-41.63447265624998,62.972460937500074],[-41.90898437499996,62.73710937499999],[-42.94165039062503,62.72021484375003],[-42.15297851562502,62.568457031250006],[-42.32148437499998,62.15273437500005],[-42.110205078125006,61.857226562500074],[-42.58530273437498,61.71748046875001],[-42.34736328125001,61.61743164062497],[-42.717041015625,60.767480468749994],[-43.04409179687502,60.523681640625],[-43.92270507812495,60.59536132812502],[-43.21298828124998,60.390673828125074],[-43.122900390625006,60.06123046875001],[-43.32011718749993,59.928125],[-43.95502929687498,60.025488281250006],[-43.65791015625001,59.85864257812503],[-43.90654296874996,59.815478515625045],[-44.11699218750002,59.83193359375002],[-44.06547851562499,59.92480468750003],[-44.412939453125006,59.922607421875],[-44.22436523437494,60.273535156250006],[-44.61328124999997,60.01665039062499],[-45.37924804687495,60.20292968750002],[-45.367773437500006,60.37294921875002],[-44.97470703124995,60.457226562499955],[-44.756738281249966,60.66459960937502],[-45.38051757812494,60.444921875],[-46.04663085937503,60.61572265625],[-46.141943359375006,60.776513671874994],[-45.87021484374998,61.21831054687502],[-46.87446289062501,60.81640625000003],[-48.180810546874966,60.76923828125001],[-47.77031249999999,60.99775390625001],[-48.386425781249926,61.004736328125034],[-48.42817382812501,61.18740234375002],[-48.92207031249998,61.27744140624998],[-49.28906249999997,61.58994140625006],[-49.380273437499994,61.89018554687502],[-48.82871093749998,62.0796875],[-49.62377929687494,61.99858398437499],[-49.553466796875,62.23271484374999],[-50.319238281249966,62.473193359375045],[-50.298730468749966,62.72197265625002],[-49.793115234374994,63.04462890625004],[-50.39008789062501,62.82202148437497],[-51.46884765624995,63.64228515625001],[-51.547509765624994,64.00610351562497],[-50.260693359374955,64.21425781250002],[-50.48662109374996,64.20888671875],[-50.43706054687499,64.31284179687503],[-51.58491210937498,64.10317382812502],[-51.70786132812498,64.205078125],[-51.403759765624926,64.46318359375002],[-50.49208984375002,64.69316406250005],[-50.00898437500001,64.44726562499997],[-50.12163085937493,64.703759765625],[-50.51699218750002,64.76650390625],[-50.96064453124998,65.20112304687498],[-50.721582031249966,64.79760742187503],[-51.22060546875002,64.62846679687502],[-51.25537109375,64.75810546875005],[-51.92260742187503,64.21875],[-52.259033203125,65.154931640625],[-52.537695312500034,65.32880859374998],[-51.61914062500003,65.71318359375002],[-51.091894531250006,65.77578125],[-51.7234375,65.723486328125],[-52.55126953125003,65.46137695312498],[-52.760937499999926,65.59082031249997],[-53.198974609375,65.59404296875002],[-53.106347656249966,65.97714843749998],[-53.39204101562498,66.04833984375],[-51.225,66.88154296875001],[-53.035791015624966,66.20141601562503],[-53.538769531249955,66.13935546874998],[-53.41875,66.64853515624998],[-53.038281249999955,66.82680664062497],[-52.38686523437502,66.88115234375005],[-53.44360351562503,66.924658203125],[-53.88442382812502,67.13554687499999],[-53.79858398437494,67.41816406250001],[-52.666455078124955,67.74970703124995],[-50.613476562499955,67.5279296875],[-51.171044921874966,67.693603515625],[-50.96884765624998,67.80664062500003],[-51.765234375000034,67.73784179687505],[-52.34482421874998,67.83691406249997],[-53.735205078125006,67.54902343750004],[-53.151562499999926,68.20776367187503],[-51.779980468749926,68.05673828124998],[-51.456494140624926,68.116064453125],[-51.21015625000001,68.419921875],[-52.19853515624993,68.22080078125],[-53.38315429687495,68.29736328124997],[-53.03945312500002,68.61088867187499],[-52.60458984374998,68.70874023437503],[-51.62314453124995,68.53481445312505],[-50.945703124999966,68.68266601562505],[-50.807714843750006,68.81699218749998],[-51.24941406250002,68.73994140625001],[-51.084863281249994,69.12827148437498],[-50.29736328124994,69.17060546874998],[-51.07695312499996,69.20947265625],[-50.291699218749955,70.01445312500005],[-52.254638671875,70.05893554687503],[-53.02304687499995,70.30190429687497],[-54.01445312499996,70.42167968750005],[-54.53076171875,70.69926757812502],[-54.16582031249999,70.82011718750005],[-52.801953124999955,70.7505859375],[-50.87236328124993,70.36489257812502],[-50.66328124999998,70.417578125],[-51.32285156249998,70.58876953124997],[-51.25659179687497,70.85268554687502],[-51.77431640625002,71.01044921875001],[-51.018945312499966,71.001318359375],[-51.37666015625001,71.11904296875],[-53.007568359375,71.17998046874999],[-52.89184570312497,71.457666015625],[-51.76992187500002,71.67172851562498],[-53.44008789062502,71.57900390625002],[-53.14453125000003,71.80742187500002],[-53.65214843749996,72.36264648437506],[-53.92773437499997,72.31879882812501],[-53.47758789062502,71.84995117187506],[-54.01992187500002,71.657861328125],[-53.96298828124995,71.45898437499997],[-54.6890625,71.36723632812505],[-55.59404296874999,71.55351562500005],[-55.315576171874994,72.11069335937498],[-54.84013671874996,72.35610351562497],[-55.581445312499994,72.178857421875],[-55.63583984374998,72.300439453125],[-55.29570312499996,72.35439453124997],[-55.60170898437494,72.453466796875],[-54.924951171874994,72.57197265624998],[-54.737939453124994,72.87250976562501],[-55.07309570312498,73.01513671875003],[-55.28891601562498,72.93320312500003],[-55.66855468749998,73.00791015624998],[-55.288281249999955,73.32709960937498],[-56.10405273437496,73.55815429687499],[-55.83828125,73.75971679687501],[-56.22539062499999,74.12910156249995],[-57.23056640624995,74.12529296875007],[-56.70634765625002,74.21918945312501],[-56.717675781249994,74.42924804687499],[-56.25546874999998,74.52680664062498],[-58.56552734374998,75.35273437500001],[-58.249658203124994,75.50668945312503],[-58.51621093749995,75.68906250000006],[-61.18823242187494,76.157861328125],[-63.29130859374996,76.35205078125003],[-63.84306640624999,76.21713867187498],[-64.307275390625,76.31650390624998],[-65.36992187499993,76.13056640625004],[-65.87573242187494,76.23833007812505],[-66.46577148437498,76.13916015625],[-66.99257812500002,76.21293945312502],[-66.67480468750003,75.977392578125],[-68.14873046875002,76.06704101562497],[-69.48408203125001,76.39916992187503],[-68.1142578125,76.65063476562503],[-69.67382812499994,76.73588867187507],[-69.69423828125002,76.98945312500004],[-70.613134765625,76.82182617187499],[-71.14145507812498,77.02866210937503],[-70.86284179687496,77.175439453125],[-68.97832031250002,77.19531250000006],[-68.13554687499999,77.37958984375001],[-66.38945312499999,77.28027343750003],[-66.69121093749999,77.68120117187502],[-67.68808593749995,77.523779296875],[-68.62153320312498,77.60185546875002],[-69.35136718749999,77.467138671875],[-70.53540039062497,77.699560546875],[-70.11445312500001,77.84135742187505],[-71.27163085937494,77.81313476562497],[-72.81806640624995,78.1943359375],[-72.47250976562498,78.48203125],[-71.65131835937493,78.62314453124998],[-68.99345703124999,78.857421875],[-68.37705078124998,79.037841796875],[-65.82553710937503,79.17373046874997],[-64.79228515624993,80.00063476562502],[-64.17915039062498,80.09926757812497],[-66.84365234374997,80.07622070312507],[-67.05063476562503,80.384521484375],[-64.51552734374997,81],[-63.72197265624993,81.05732421875001],[-63.028662109375006,80.88955078125002],[-62.90336914062496,81.21835937500003],[-61.43598632812498,81.13359375000002],[-60.842871093750034,81.85537109374997],[-59.28193359374998,81.88403320312503],[-56.615136718749994,81.362890625],[-59.26181640624998,82.00664062500005],[-54.54887695312496,82.35063476562505],[-53.671337890624955,82.16406249999997],[-53.55566406250003,81.65327148437501],[-53.022558593750034,82.32172851562504],[-50.894433593749994,81.89521484375001],[-49.54106445312496,81.91806640625003],[-50.93554687500003,82.38281250000003],[-50.03710937499994,82.472412109375],[-44.7294921875,81.77983398437505],[-44.23886718749998,82.3681640625],[-45.55654296875002,82.74702148437498],[-41.87646484375,82.680322265625],[-41.36962890625003,82.75],[-46.136816406250006,82.85883789062504],[-46.169042968750006,83.06386718749997],[-45.41459960937496,83.01767578124998],[-43.00927734375003,83.26459960937501],[-41.300146484375006,83.10078125000004],[-40.35683593750002,83.332177734375],[-38.15625,82.9986328125],[-38.74956054687496,83.37084960937497],[-37.72333984374998,83.49775390624998],[-29.952880859375,83.56484374999997]]]]},"properties":{"name":"Greenland","childNum":14}},{"geometry":{"type":"Polygon","coordinates":[[[-89.2328125,15.888671875],[-88.89404296875,15.890625],[-88.60336914062499,15.76416015625],[-88.5939453125,15.950292968749991],[-88.22832031249999,15.72900390625],[-88.271435546875,15.694873046875003],[-88.36455078124999,15.616015625],[-88.68447265625,15.360498046874994],[-88.96098632812499,15.152441406249991],[-89.142578125,15.072314453125003],[-89.22236328125,14.866064453124991],[-89.16220703124999,14.669238281250003],[-89.17177734375,14.606884765624997],[-89.28671875,14.529980468749997],[-89.36259765624999,14.416015625],[-89.5736328125,14.390087890624997],[-89.54716796874999,14.241259765625003],[-90.04814453124999,13.904052734375],[-90.09521484375,13.736523437499997],[-90.60693359375,13.929003906250003],[-91.37734375,13.990185546874997],[-92.23515624999999,14.54541015625],[-92.15854492187499,14.963574218749997],[-92.14423828125,15.001953125],[-92.09873046874999,15.026757812499994],[-92.07480468749999,15.07421875],[-92.187158203125,15.320898437499991],[-92.08212890624999,15.495556640624997],[-91.9572265625,15.703222656249991],[-91.736572265625,16.07016601562499],[-91.433984375,16.070458984374994],[-90.97958984374999,16.07080078125],[-90.70322265624999,16.071044921875],[-90.52197265625,16.071191406249994],[-90.44716796875,16.072705078124997],[-90.45986328125,16.162353515625],[-90.450146484375,16.261376953124994],[-90.4169921875,16.351318359375],[-90.4169921875,16.39101562499999],[-90.47109375,16.43955078124999],[-90.57578125,16.467822265625003],[-90.63408203124999,16.5107421875],[-90.634375,16.565136718749997],[-90.65996093749999,16.630908203125003],[-90.710693359375,16.70810546874999],[-90.975830078125,16.867822265624994],[-91.409619140625,17.255859375],[-91.1955078125,17.254101562499997],[-90.99296874999999,17.25244140625],[-90.98916015625,17.81640625],[-89.16147460937499,17.81484375],[-89.2328125,15.888671875]]]},"properties":{"name":"Guatemala","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[144.74179687500003,13.25927734375],[144.64931640625002,13.4287109375],[144.87539062500002,13.614648437499994],[144.94082031250002,13.5703125],[144.74179687500003,13.25927734375]]]},"properties":{"name":"Guam","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-57.194775390625,5.5484375],[-57.3185546875,5.335351562499994],[-57.20981445312499,5.195410156249991],[-57.331005859375,5.020166015624994],[-57.711083984374994,4.991064453124991],[-57.91704101562499,4.820410156249991],[-57.84599609374999,4.668164062499997],[-58.05429687499999,4.101660156249991],[-57.646728515625,3.39453125],[-57.303662109375,3.377099609374994],[-57.19736328124999,2.853271484375],[-56.704345703125,2.036474609374991],[-56.4828125,1.942138671875],[-56.96953124999999,1.91640625],[-57.03759765625,1.936474609374997],[-57.092675781249994,2.005810546874997],[-57.118896484375,2.013964843749989],[-57.31748046874999,1.963476562499991],[-57.41269531249999,1.908935546875],[-57.500439453125,1.77382812499999],[-57.54575195312499,1.72607421875],[-57.59443359375,1.7041015625],[-57.795654296875,1.7],[-57.8734375,1.667285156249989],[-57.9828125,1.6484375],[-58.03466796875,1.520263671875],[-58.34067382812499,1.587548828124994],[-58.38037109375,1.530224609374997],[-58.39580078124999,1.481738281249989],[-58.5060546875,1.438671875],[-58.511865234374994,1.28466796875],[-58.68461914062499,1.281054687499989],[-58.73032226562499,1.247509765624997],[-58.78720703124999,1.20849609375],[-58.82177734375,1.201220703124989],[-59.231201171875,1.376025390624989],[-59.53569335937499,1.7],[-59.66660156249999,1.746289062499997],[-59.66850585937499,1.842333984374989],[-59.74072265625,1.874169921874994],[-59.75620117187499,1.900634765625],[-59.75522460937499,2.274121093749997],[-59.8896484375,2.362939453124994],[-59.9943359375,2.689990234374989],[-59.854394531249994,3.5875],[-59.55112304687499,3.933544921874997],[-59.557763671874994,3.960009765624989],[-59.62021484374999,4.023144531249997],[-59.73857421874999,4.226757812499997],[-59.69970703125,4.353515625],[-60.1486328125,4.533251953124989],[-59.990673828125,5.082861328124991],[-60.142041015625,5.238818359374989],[-60.241650390625,5.257958984374994],[-60.335205078125,5.199316406249991],[-60.45952148437499,5.188085937499991],[-60.6513671875,5.221142578124997],[-60.742138671875,5.202050781249994],[-61.37680664062499,5.906982421875],[-61.3908203125,5.938769531249989],[-61.303125,6.049511718749997],[-61.22495117187499,6.129199218749989],[-61.15947265624999,6.174414062499991],[-61.12871093749999,6.214306640624997],[-61.152294921875,6.385107421874991],[-61.151025390624994,6.446533203125],[-61.181591796875,6.513378906249997],[-61.20361328125,6.58837890625],[-61.14560546874999,6.69453125],[-60.717919921874994,6.768310546875],[-60.35209960937499,7.002880859374997],[-60.32207031249999,7.092041015625],[-60.32548828124999,7.133984375],[-60.34506835937499,7.15],[-60.46494140624999,7.166552734374989],[-60.523193359375,7.143701171874994],[-60.583203125,7.156201171874997],[-60.63330078125,7.211083984374994],[-60.718652343749994,7.535937499999989],[-60.513623046875,7.813183593749997],[-60.032421875,8.053564453124991],[-59.99072265625,8.162011718749994],[-59.96484375,8.191601562499997],[-59.849072265625,8.248681640624994],[-59.83164062499999,8.305957031249989],[-60.017529296875,8.54931640625],[-59.20024414062499,8.07460937499999],[-58.51108398437499,7.39804687499999],[-58.48056640624999,7.038134765624989],[-58.67294921874999,6.390771484374994],[-58.414990234375,6.85117187499999],[-57.982568359374994,6.785888671875],[-57.54013671874999,6.33154296875],[-57.2275390625,6.178417968749997],[-57.194775390625,5.5484375]]]},"properties":{"name":"Guyana","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[73.70742187500002,-53.13710937499999],[73.46513671875002,-53.184179687500006],[73.25117187500001,-52.97578125000001],[73.83779296875002,-53.11279296875],[73.70742187500002,-53.13710937499999]]]},"properties":{"name":"Heard I. and McDonald Is.","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-83.635498046875,14.876416015624997],[-84.53764648437496,14.633398437499963],[-84.64594726562498,14.661083984375011],[-84.86044921874998,14.809765625000011],[-84.98515624999999,14.752441406249972],[-85.059375,14.582958984374997],[-85.20834960937498,14.311816406250003],[-85.73393554687496,13.85869140625006],[-85.75341796875,13.852050781250028],[-85.78671874999995,13.844433593749997],[-85.98378906249997,13.965673828125006],[-86.04038085937503,14.050146484374977],[-86.33173828124995,13.770068359375031],[-86.37695312500003,13.755664062500031],[-86.61025390624997,13.774853515625026],[-86.73364257812494,13.763476562500017],[-86.75898437499995,13.746142578125045],[-86.77060546875003,13.698730468749972],[-86.763525390625,13.635253906250014],[-86.72958984375,13.4072265625],[-86.710693359375,13.31337890624998],[-86.72929687499996,13.284375],[-86.79213867187497,13.279785156249972],[-86.87353515624994,13.266503906250023],[-86.918212890625,13.223583984374983],[-87.00932617187499,13.007812499999986],[-87.0591796875,12.991455078125028],[-87.337255859375,12.979248046875028],[-87.48911132812503,13.352929687500051],[-87.814208984375,13.399169921875057],[-87.781884765625,13.521386718749994],[-87.71533203125003,13.812695312500011],[-87.73144531250003,13.841064453125014],[-87.80224609374997,13.889990234375034],[-87.89199218749997,13.894970703124983],[-87.99101562499996,13.879638671874972],[-88.15102539062497,13.987353515624974],[-88.44912109374994,13.850976562499994],[-88.48266601562503,13.854248046875043],[-88.49765624999998,13.904541015624986],[-88.50434570312501,13.964208984374963],[-88.51254882812498,13.97895507812504],[-89.12050781249994,14.370214843749991],[-89.36259765624996,14.416015625],[-89.17177734375,14.606884765624983],[-89.16220703125,14.669238281249989],[-89.22236328125001,14.86606445312502],[-89.142578125,15.072314453125031],[-88.96098632812496,15.15244140625002],[-88.68447265625002,15.360498046875037],[-88.36455078124996,15.616015625000045],[-88.27143554687498,15.694873046875045],[-88.22832031249999,15.729003906249972],[-88.131103515625,15.701025390625034],[-87.87495117187495,15.879345703124955],[-86.35664062499998,15.783203125],[-85.93627929687497,15.953417968750045],[-85.98564453124999,16.02416992187497],[-85.48369140624996,15.899511718749977],[-84.97373046874998,15.989892578124994],[-84.55966796875,15.802001953125],[-84.26142578124998,15.822607421875034],[-83.765283203125,15.405468750000054],[-83.972802734375,15.519628906250034],[-84.11132812499997,15.492431640625],[-84.09506835937503,15.400927734375017],[-83.92744140624998,15.394042968750028],[-83.76044921874998,15.220361328124994],[-83.49794921874997,15.222119140624997],[-83.64638671875,15.368408203125043],[-83.36918945312493,15.239990234375],[-83.29086914062498,15.078906250000045],[-83.2255859375,15.042285156250045],[-83.15751953124999,14.993066406249966],[-83.41503906249994,15.008056640625],[-83.5365234375,14.977001953124983],[-83.635498046875,14.876416015624997]]]},"properties":{"name":"Honduras","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[17.60781250000005,42.76904296875],[17.744238281250063,42.70034179687505],[17.34414062500008,42.790380859375006],[17.60781250000005,42.76904296875]]],[[[16.650683593750017,42.99658203125],[17.188281250000045,42.917041015625045],[16.850683593750006,42.8955078125],[16.650683593750017,42.99658203125]]],[[[17.667578125000063,42.897119140624994],[18.436328125000017,42.559716796874994],[18.517480468750023,42.43291015624999],[17.823828125,42.79741210937502],[17.045410156250057,43.014892578125],[17.667578125000063,42.897119140624994]]],[[[16.785253906250006,43.270654296874966],[16.490332031250034,43.28618164062502],[16.44892578125004,43.38706054687506],[16.89130859375001,43.314648437499955],[16.785253906250006,43.270654296874966]]],[[[15.371386718750074,43.973828124999955],[15.437207031250068,43.899511718750006],[15.270019531250028,44.01074218750003],[15.371386718750074,43.973828124999955]]],[[[14.488085937500074,44.66005859375005],[14.31240234375008,44.90039062499997],[14.33125,45.16499023437498],[14.488085937500074,44.66005859375005]]],[[[14.810253906250068,44.97705078124997],[14.45039062500004,45.079199218750006],[14.571093750000017,45.224755859374994],[14.810253906250068,44.97705078124997]]],[[[18.905371093750006,45.931738281250034],[18.839062499999983,45.83574218750002],[19.064257812500045,45.51499023437506],[19.004687500000074,45.39951171875006],[19.4,45.2125],[19.062890625000023,45.13720703125],[19.007128906250045,44.86918945312502],[18.83642578125,44.883251953124955],[18.66259765625,45.07744140624999],[17.812792968750074,45.078125],[16.918652343749983,45.27656249999998],[16.53066406250008,45.21669921875002],[16.29335937500005,45.00883789062496],[16.028320312500057,45.18959960937502],[15.788085937500057,45.17895507812497],[15.736621093750045,44.76582031250001],[16.10341796875008,44.52099609375006],[16.300097656250017,44.12451171875],[17.27382812500005,43.44575195312501],[17.650488281250063,43.006591796875],[17.585156250000068,42.93837890625005],[16.903125,43.392431640625006],[16.393945312500023,43.54335937500002],[15.985546875000068,43.519775390625],[15.185839843750017,44.17211914062503],[15.122949218749994,44.256787109374955],[15.470996093750045,44.27197265625003],[14.981347656250023,44.60292968750005],[14.854589843750034,45.08100585937501],[14.550488281249983,45.297705078125006],[14.31269531250004,45.33779296875002],[13.86074218750008,44.83740234375003],[13.517187500000063,45.481787109375034],[13.878710937500017,45.428369140624994],[14.369921875000074,45.48144531250006],[14.427343750000034,45.50576171875002],[14.56884765625,45.65722656249997],[14.591796875000057,45.65126953125002],[14.649511718750006,45.57148437500001],[14.793066406250034,45.47822265625001],[14.95458984375,45.499902343749994],[15.110449218750034,45.450781250000034],[15.242089843750023,45.44140624999997],[15.339453125000063,45.46704101562506],[15.326660156250028,45.502294921875034],[15.291210937500011,45.541552734375045],[15.283593750000051,45.5796875],[15.35371093750004,45.659912109375],[15.27705078125004,45.73261718749998],[15.652148437500074,45.86215820312498],[15.675585937500045,45.98369140624996],[15.666210937500011,46.04848632812502],[15.596875,46.10922851562506],[15.592578125000017,46.139990234375006],[15.608984374999977,46.171923828125045],[16.1064453125,46.382226562499994],[16.32119140625005,46.53461914062504],[16.42763671875005,46.5244140625],[16.516210937499977,46.499902343749966],[16.569921875,46.48500976562505],[16.748046875000057,46.41640625000002],[16.87148437500008,46.33930664062504],[17.310644531250006,45.99614257812502],[17.80712890625,45.79042968750002],[18.358300781250023,45.75302734375006],[18.533593750000023,45.79614257812503],[18.56464843750004,45.81328124999999],[18.666015625,45.90747070312497],[18.905371093750006,45.931738281250034]]]]},"properties":{"name":"Croatia","childNum":8}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-72.80458984374997,18.777685546875063],[-72.82221679687501,18.707128906249977],[-73.07797851562498,18.790917968749994],[-73.27641601562499,18.95405273437501],[-72.80458984374997,18.777685546875063]]],[[[-71.647216796875,19.195947265624994],[-71.80712890624997,18.987011718749983],[-71.733642578125,18.85639648437501],[-71.72705078125,18.80322265625003],[-71.74321289062502,18.73291015625],[-71.86650390624999,18.61416015625005],[-71.98686523437499,18.61035156249997],[-72.000390625,18.59790039062503],[-71.94038085937493,18.51259765625005],[-71.87255859374997,18.416210937499955],[-71.76191406249998,18.34130859374997],[-71.73725585937495,18.27080078124999],[-71.76831054687497,18.039160156250063],[-71.85292968749997,18.119140625],[-71.94609375,18.186083984375045],[-72.05986328124993,18.228564453125017],[-72.87666015624998,18.151757812499994],[-73.38515625000002,18.251171874999983],[-73.747314453125,18.190234375000017],[-73.88496093749998,18.041894531249994],[-74.478125,18.45],[-74.3875,18.624707031249983],[-74.22773437499998,18.662695312499977],[-72.78935546874996,18.434814453125],[-72.37607421874998,18.57446289062503],[-72.34765624999994,18.674951171874994],[-72.81108398437496,19.071582031250074],[-72.70322265625,19.441064453125023],[-73.43837890624994,19.722119140624983],[-73.21777343750003,19.88369140625005],[-72.63701171875002,19.90087890625],[-72.21982421875003,19.744628906250057],[-71.834716796875,19.696728515624983],[-71.77924804687498,19.718164062499994],[-71.75742187499998,19.68818359375001],[-71.71147460937493,19.486572265625057],[-71.74648437499997,19.28583984375001],[-71.647216796875,19.195947265624994]]]]},"properties":{"name":"Haiti","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[22.1318359375,48.405322265624996],[22.253710937500017,48.407373046874994],[22.582421875000023,48.134033203125],[22.769140625,48.109619140625],[22.87666015625001,47.947265625],[21.99970703125001,47.505029296874994],[21.121679687500006,46.282421875],[20.76025390625,46.246240234374994],[20.613671875000023,46.13349609375],[20.508105468750017,46.166943359375],[20.28095703125001,46.1330078125],[20.241796875,46.10859375],[20.21015625000001,46.126025390624996],[20.161425781250017,46.141894531249996],[19.93408203125,46.161474609375],[19.84443359375001,46.145898437499994],[19.61347656250001,46.169189453125],[19.421289062500023,46.064453125],[18.666015625,45.907470703125],[18.56464843750001,45.81328125],[18.533593750000023,45.796142578125],[18.358300781250023,45.75302734375],[17.80712890625,45.790429687499994],[17.310644531250006,45.996142578124996],[16.871484375000023,46.339306640625],[16.748046875,46.41640625],[16.569921875,46.485009765624994],[16.516210937500006,46.499902343749994],[16.283593750000023,46.857275390625],[16.093066406250017,46.86328125],[16.453417968750017,47.006787109375],[16.44287109375,47.39951171875],[16.676562500000017,47.536035156249994],[16.421289062500023,47.674462890624994],[17.06660156250001,47.707568359374996],[17.147363281250023,48.00595703125],[17.76191406250001,47.770166015624994],[18.72421875,47.787158203124996],[18.791894531250023,48.000292968749996],[19.625390625000023,48.223095703125],[19.95039062500001,48.146630859374994],[20.333789062500017,48.295556640624994],[20.490039062500017,48.526904296874996],[21.45136718750001,48.55224609375],[21.766992187500023,48.3380859375],[22.1318359375,48.405322265624996]]]},"properties":{"name":"Hungary","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[122.9489257812501,-10.90927734375002],[122.82617187500003,-10.899121093749983],[122.84570312500003,-10.761816406249991],[123.37109375000003,-10.474902343749989],[123.41816406250004,-10.651269531250037],[122.9489257812501,-10.90927734375002]]],[[[121.8830078125001,-10.590332031249957],[121.70468750000006,-10.5556640625],[121.99833984375002,-10.446972656249983],[121.8830078125001,-10.590332031249957]]],[[[123.41621093750004,-10.302636718749966],[123.3255859375,-10.264160156249943],[123.45878906250002,-10.13994140624996],[123.41621093750004,-10.302636718749966]]],[[[120.0125,-9.374707031250026],[120.78447265625002,-9.95703125],[120.83261718750006,-10.0375],[120.69804687500002,-10.206640624999949],[120.4391601562501,-10.294042968749991],[120.14482421875002,-10.200097656249952],[119.60107421874997,-9.773535156250006],[119.08544921875003,-9.706933593750023],[118.95878906250002,-9.519335937500003],[119.29589843749997,-9.3671875],[119.9420898437501,-9.301464843750026],[120.0125,-9.374707031250026]]],[[[125.06816406250002,-9.511914062499997],[124.42753906250002,-10.14863281250004],[123.7472656250001,-10.347167968749986],[123.60478515625002,-10.270117187500006],[123.71640625000012,-10.078613281249986],[123.5892578125,-9.966796875000028],[123.709375,-9.61484375],[124.0363281250001,-9.341601562500031],[124.28232421875012,-9.427929687500026],[124.44443359375012,-9.190332031250023],[124.92226562500005,-8.942480468749977],[124.93681640625007,-9.053417968750026],[125.14902343750012,-9.042578125000034],[125.10048828125,-9.189843750000023],[124.96015625000004,-9.213769531250009],[125.06816406250002,-9.511914062499997]]],[[[115.60996093750012,-8.769824218749974],[115.48046875000003,-8.715429687500006],[115.56142578125,-8.669921874999972],[115.60996093750012,-8.769824218749974]]],[[[122.97734375000002,-8.54521484374996],[122.88779296875006,-8.587304687500009],[123.01054687500002,-8.448339843750034],[123.153125,-8.475781250000026],[122.97734375000002,-8.54521484374996]]],[[[119.46406250000004,-8.741015624999974],[119.38554687500002,-8.736035156250026],[119.4464843750001,-8.429199218749957],[119.55722656250012,-8.518847656250003],[119.46406250000004,-8.741015624999974]]],[[[123.31748046875012,-8.354785156249974],[123.02500000000012,-8.395507812500014],[123.21708984375002,-8.235449218750006],[123.33603515625006,-8.269042968750014],[123.31748046875012,-8.354785156249974]]],[[[116.64082031250004,-8.613867187500006],[116.51425781250012,-8.820996093750011],[116.58652343750012,-8.886132812499966],[116.23935546875006,-8.912109375000014],[115.85732421875005,-8.787890625000017],[116.07646484375002,-8.744921874999974],[116.06113281250006,-8.437402343750023],[116.4015625000001,-8.204199218750034],[116.7189453125001,-8.336035156249977],[116.64082031250004,-8.613867187500006]]],[[[124.28662109375003,-8.32949218749998],[124.14667968750004,-8.531445312499997],[123.92773437500003,-8.448925781249969],[124.23955078125002,-8.20341796874996],[124.28662109375003,-8.32949218749998]]],[[[123.92480468750003,-8.2724609375],[123.55302734375007,-8.566796875],[123.23007812500006,-8.530664062500023],[123.47587890625007,-8.322265625000014],[123.39121093750012,-8.280468750000026],[123.77597656250006,-8.190429687499986],[123.92480468750003,-8.2724609375]]],[[[138.89511718750006,-8.388671874999957],[138.56337890625,-8.30908203125],[138.79619140625007,-8.173632812500017],[138.89511718750006,-8.388671874999957]]],[[[117.55634765625004,-8.367285156249949],[117.49052734375007,-8.183398437499974],[117.66503906249997,-8.148242187500003],[117.55634765625004,-8.367285156249949]]],[[[124.5755859375,-8.140820312499997],[125.05029296874997,-8.179589843749994],[125.13173828125,-8.326464843749989],[124.38066406250002,-8.41513671875002],[124.43066406249997,-8.18320312500002],[124.5755859375,-8.140820312499997]]],[[[127.8234375000001,-8.098828124999969],[128.11923828125012,-8.17070312499996],[128.02353515625006,-8.255371093749972],[127.82089843750012,-8.190234375000031],[127.8234375000001,-8.098828124999969]]],[[[122.7829101562501,-8.61171875],[121.65136718749997,-8.898730468749946],[121.41464843750006,-8.81484375],[121.32832031250004,-8.916894531250009],[121.03525390625012,-8.935449218749966],[120.55048828125004,-8.80185546875002],[119.909375,-8.857617187500011],[119.80791015625002,-8.697656250000023],[119.87480468750007,-8.419824218749994],[120.61025390625005,-8.24042968750004],[121.44453125000004,-8.57783203125004],[121.96650390625004,-8.455175781250006],[122.32324218749997,-8.628320312500023],[122.85048828125,-8.304394531250011],[122.91914062500004,-8.221875],[122.75859375000002,-8.185937499999952],[122.91699218749997,-8.105566406250006],[123.00595703125006,-8.329101562499986],[122.7829101562501,-8.61171875]]],[[[130.86220703125,-8.31875],[130.77519531250002,-8.34990234374996],[131.02011718750012,-8.091308593749943],[131.17636718750006,-8.130761718749994],[130.86220703125,-8.31875]]],[[[118.24238281250004,-8.317773437499994],[118.61191406250006,-8.28066406249998],[118.71386718749997,-8.41494140624998],[118.926171875,-8.297656249999974],[119.12968750000002,-8.668164062499969],[118.74589843750002,-8.735449218749991],[118.83261718750012,-8.833398437499966],[118.47861328125012,-8.856445312499957],[118.37890625000003,-8.674609375000031],[118.18994140624997,-8.840527343749997],[117.06132812500002,-9.099023437499994],[116.78847656250005,-9.006347656250028],[116.83505859375012,-8.532421875000026],[117.16484375000007,-8.367187500000014],[117.56708984375004,-8.426367187499991],[117.80605468750005,-8.711132812500011],[117.96953125000002,-8.728027343749986],[118.23486328124997,-8.591894531249963],[117.81484375000005,-8.342089843749974],[117.7552734375,-8.149511718749991],[118.11748046875007,-8.12226562500004],[118.24238281250004,-8.317773437499994]]],[[[115.44785156250012,-8.155175781249994],[115.70429687500004,-8.40712890624998],[115.14492187500005,-8.849023437500037],[115.05507812500005,-8.573046874999946],[114.61318359375,-8.37832031249998],[114.46757812500007,-8.166308593749946],[114.93847656249997,-8.18710937500002],[115.15400390625004,-8.065722656249974],[115.44785156250012,-8.155175781249994]]],[[[129.83886718749997,-7.954589843749986],[129.71347656250012,-8.04072265625004],[129.60898437500006,-7.803417968750011],[129.81298828124997,-7.819726562499952],[129.83886718749997,-7.954589843749986]]],[[[126.80097656250004,-7.667871093750009],[126.4720703125,-7.950390625000011],[126.04003906250003,-7.885839843750006],[125.79824218750005,-7.984570312499969],[125.97529296875004,-7.663378906249989],[126.21367187500002,-7.706738281250026],[126.60957031250004,-7.571777343749972],[126.80097656250004,-7.667871093750009]]],[[[127.41943359375003,-7.623046875000028],[127.37070312500012,-7.512792968749949],[127.47519531250012,-7.531054687500031],[127.41943359375003,-7.623046875000028]]],[[[138.53535156250004,-8.273632812499969],[138.2962890625,-8.405175781250037],[137.65039062499997,-8.386132812499966],[138.08183593750002,-7.566210937500003],[138.29550781250012,-7.4384765625],[138.76982421875002,-7.390429687499974],[138.98906250000002,-7.696093749999989],[138.53535156250004,-8.273632812499969]]],[[[131.3255859375,-7.999511718749986],[131.11376953125003,-7.997363281249989],[131.13779296875012,-7.684863281250017],[131.64345703125,-7.11279296875],[131.73613281250007,-7.197070312500017],[131.64384765625002,-7.266894531249946],[131.62441406250005,-7.626171874999955],[131.3255859375,-7.999511718749986]]],[[[131.98203125000006,-7.202050781249966],[131.75078125000002,-7.116796875],[131.92226562500005,-7.104492187499986],[131.98203125000006,-7.202050781249966]]],[[[128.6701171875001,-7.183300781249969],[128.52978515625003,-7.134570312499989],[128.62773437500007,-7.06875],[128.6701171875001,-7.183300781249969]]],[[[120.77441406250003,-7.118945312500003],[120.64082031250004,-7.115820312499991],[120.63339843750006,-7.018261718750011],[120.77441406250003,-7.118945312500003]]],[[[113.84453125000007,-7.105371093749994],[113.12695312499997,-7.224121093750028],[112.72587890625007,-7.072753906250014],[112.86806640625,-6.899902343749972],[113.06738281250003,-6.879980468749991],[113.97470703125012,-6.873046875],[114.0736328125,-6.960156249999983],[113.84453125000007,-7.105371093749994]]],[[[115.37705078125006,-6.97080078125002],[115.22031250000012,-6.952539062500037],[115.24052734375007,-6.861230468749994],[115.54609375000004,-6.938671874999955],[115.37705078125006,-6.97080078125002]]],[[[105.25283203125005,-6.640429687499946],[105.12138671875007,-6.614941406249997],[105.26054687500002,-6.523925781250014],[105.25283203125005,-6.640429687499946]]],[[[134.53681640625004,-6.442285156249994],[134.32275390624997,-6.84873046875002],[134.09082031249997,-6.833789062500003],[134.10703125000006,-6.471582031250009],[134.19462890625007,-6.459765625],[134.11464843750005,-6.190820312500009],[134.53681640625004,-6.442285156249994]]],[[[107.37392578125005,-6.007617187499989],[107.66679687500002,-6.215820312499957],[108.33017578125012,-6.286035156249966],[108.67783203125006,-6.790527343749972],[110.42626953124997,-6.947265625000028],[110.83476562500002,-6.424218749999952],[110.97226562500012,-6.435644531249977],[111.18154296875005,-6.686718749999969],[111.54033203125002,-6.648242187500031],[112.0873046875,-6.89335937499996],[112.53925781250004,-6.926464843749955],[112.64873046875007,-7.221289062499977],[112.7943359375,-7.304492187499974],[112.79453125000012,-7.55244140625004],[113.01357421875005,-7.657714843749986],[113.49765625000006,-7.723828124999955],[114.07070312500005,-7.633007812500011],[114.40927734375012,-7.79248046875],[114.38691406250004,-8.405175781250037],[114.58378906250002,-8.769628906250034],[113.25332031250005,-8.286718749999963],[112.67880859375006,-8.409179687499957],[111.50996093750004,-8.30507812499998],[110.60722656250002,-8.149414062499972],[109.28164062500005,-7.704882812500003],[108.74121093749997,-7.667089843750034],[108.45175781250006,-7.79697265625002],[107.91748046875003,-7.724121093750014],[107.28496093750007,-7.471679687500014],[106.45527343750004,-7.368652343749986],[106.51972656250004,-7.053710937499943],[106.19824218749997,-6.927832031249977],[105.25546875000012,-6.835253906250031],[105.37089843750002,-6.664355468750031],[105.48369140625007,-6.781542968750017],[105.65507812500002,-6.469531249999946],[105.78691406250002,-6.456933593749966],[105.86826171875006,-6.11640625000004],[106.075,-5.914160156249963],[106.82519531249997,-6.098242187499977],[107.0462890625,-5.90419921874998],[107.37392578125005,-6.007617187499989]]],[[[120.52832031249997,-6.2984375],[120.48730468749997,-6.464843749999972],[120.47734375000007,-5.775292968750009],[120.52832031249997,-6.2984375]]],[[[112.7194335937501,-5.81103515625],[112.58603515625006,-5.803613281249994],[112.69003906250006,-5.726171875000034],[112.7194335937501,-5.81103515625]]],[[[132.80712890625003,-5.850781250000011],[132.68144531250002,-5.91259765625],[132.63017578125002,-5.60703125],[132.80712890625003,-5.850781250000011]]],[[[134.74697265625,-5.707031249999957],[134.71416015625007,-6.29511718750004],[134.44111328125004,-6.334863281249966],[134.15488281250006,-6.06289062499998],[134.3019531250001,-6.009765624999986],[134.34306640625002,-5.833007812499943],[134.20537109375002,-5.707226562499997],[134.34130859375003,-5.712890624999986],[134.57080078124997,-5.42734375],[134.74697265625,-5.707031249999957]]],[[[132.92626953124997,-5.902050781249983],[132.84501953125002,-5.987988281249997],[133.13847656250002,-5.317871093749986],[133.11962890625003,-5.575976562499989],[132.92626953124997,-5.902050781249983]]],[[[102.36718750000003,-5.478710937499983],[102.1107421875,-5.32255859374996],[102.3717773437501,-5.366406250000011],[102.36718750000003,-5.478710937499983]]],[[[123.62675781250007,-5.271582031249963],[123.58261718750006,-5.36738281250004],[123.54277343750002,-5.271093749999963],[123.62675781250007,-5.271582031249963]]],[[[122.04296874999997,-5.437988281250028],[121.80849609375,-5.256152343750017],[121.91367187500012,-5.072265624999957],[122.04101562500003,-5.158789062499991],[122.04296874999997,-5.437988281250028]]],[[[122.64511718750012,-5.26943359374998],[122.5638671875,-5.3875],[122.28310546875,-5.319531249999969],[122.39628906250002,-5.069824218749986],[122.36894531250007,-4.767187499999977],[122.70195312500002,-4.61865234375],[122.75986328125012,-4.933886718750003],[122.61406250000007,-5.138671874999986],[122.64511718750012,-5.26943359374998]]],[[[123.17978515625006,-4.551171875000023],[123.195703125,-4.82265625],[123.05517578124997,-4.748242187500026],[122.97167968750003,-5.138476562500031],[123.18730468750007,-5.333007812499957],[122.96875,-5.405761718749943],[122.81210937500012,-5.671289062499952],[122.64501953124997,-5.663378906250031],[122.58642578124997,-5.488867187500006],[122.76650390625005,-5.210156249999983],[122.85332031250007,-4.618359375000026],[123.074609375,-4.38691406250004],[123.17978515625006,-4.551171875000023]]],[[[133.57080078124997,-4.245898437500003],[133.621875,-4.299316406249957],[133.32089843750006,-4.111035156249969],[133.57080078124997,-4.245898437500003]]],[[[123.2423828125001,-4.112988281250011],[123.07617187499997,-4.227148437499991],[122.96904296875002,-4.029980468749969],[123.21191406250003,-3.997558593750028],[123.2423828125001,-4.112988281250011]]],[[[128.56259765625012,-3.58544921875],[128.39160156250003,-3.637890625000026],[128.45156250000005,-3.514746093749991],[128.56259765625012,-3.58544921875]]],[[[128.2755859375001,-3.67460937499996],[127.97802734374997,-3.770996093749972],[127.925,-3.69931640625002],[128.32910156249997,-3.51591796874996],[128.2755859375001,-3.67460937499996]]],[[[116.42412109375007,-3.464453124999963],[116.38779296875012,-3.636718749999972],[116.3265625,-3.539062499999972],[116.42412109375007,-3.464453124999963]]],[[[116.30332031250006,-3.868164062499957],[116.05878906250004,-4.006933593749991],[116.06357421875006,-3.457910156249952],[116.26972656250004,-3.251074218750006],[116.30332031250006,-3.868164062499957]]],[[[126.86113281250007,-3.087890624999986],[127.22734375000007,-3.391015625],[127.22958984375006,-3.633007812500011],[126.68632812500007,-3.823632812500037],[126.21455078125004,-3.605175781250026],[126.05654296875,-3.420996093749991],[126.08828125,-3.105468750000014],[126.86113281250007,-3.087890624999986]]],[[[106.88642578125004,-3.005273437500023],[106.7428710937501,-2.932812500000011],[106.91064453124997,-2.93398437499998],[106.88642578125004,-3.005273437500023]]],[[[129.75468750000007,-2.865820312500034],[130.3791015625001,-2.989355468749977],[130.56992187500006,-3.130859375000028],[130.85996093750006,-3.570312500000028],[130.805078125,-3.85771484374996],[129.844140625,-3.327148437499957],[129.51171875000003,-3.32851562499998],[129.46767578125005,-3.453222656249977],[128.8625,-3.234960937500006],[128.51660156249997,-3.449121093750037],[128.13203125000004,-3.157421875000026],[127.90234374999997,-3.496289062499955],[127.87792968749997,-3.222070312499966],[128.19853515625002,-2.865917968749969],[128.99111328125,-2.82851562499998],[129.17441406250006,-2.933496093749966],[129.48417968750002,-2.785742187499977],[129.75468750000007,-2.865820312500034]]],[[[100.42509765625007,-3.182910156249974],[100.46513671875007,-3.32851562499998],[100.20429687500004,-2.98681640625],[100.19853515625002,-2.785546875000023],[100.45458984375003,-3.001953124999972],[100.42509765625007,-3.182910156249974]]],[[[108.2072265625001,-2.997656249999977],[108.05527343750006,-3.22685546874996],[107.85820312500002,-3.086328125000023],[107.61445312500004,-3.209375],[107.56347656250003,-2.920117187499997],[107.66630859375002,-2.566308593750037],[107.83779296875005,-2.530273437499972],[108.21513671875002,-2.696972656250011],[108.29062500000012,-2.829980468750023],[108.2072265625001,-2.997656249999977]]],[[[100.20410156249997,-2.741015625000017],[100.01494140625007,-2.819726562499966],[99.98789062500006,-2.525390624999957],[100.20410156249997,-2.741015625000017]]],[[[99.84306640625007,-2.343066406250031],[99.60703125000012,-2.257519531250011],[99.57216796875005,-2.025781249999966],[99.84306640625007,-2.343066406250031]]],[[[126.055078125,-2.451269531249963],[125.86289062500006,-2.077148437499943],[125.92275390625,-1.974804687499969],[126.055078125,-2.451269531249963]]],[[[126.02421875000007,-1.789746093750011],[126.33173828125004,-1.822851562500006],[125.47919921875004,-1.940039062499991],[125.38720703124997,-1.843066406249946],[126.02421875000007,-1.789746093750011]]],[[[130.35332031250007,-1.690527343749963],[130.41884765625,-1.971289062499963],[130.24804687500003,-2.047753906249994],[129.7376953125,-1.866894531250011],[130.35332031250007,-1.690527343749963]]],[[[124.96953125000007,-1.70546875],[125.18789062500005,-1.712890624999986],[125.31406250000006,-1.877148437499969],[124.41777343750002,-2.005175781250031],[124.32968750000012,-1.858886718749972],[124.41757812500006,-1.659277343749991],[124.96953125000007,-1.70546875]]],[[[135.47421875000006,-1.591796875000014],[136.89257812500003,-1.799707031249994],[136.22812500000012,-1.893652343749949],[135.47421875000006,-1.591796875000014]]],[[[108.953125,-1.61962890625],[108.83789062499997,-1.661621093750028],[108.80371093750003,-1.567773437499994],[108.953125,-1.61962890625]]],[[[106.04570312500002,-1.669433593750014],[106.36591796875004,-2.464843749999972],[106.81845703125006,-2.573339843749963],[106.6120117187501,-2.895507812499957],[106.66718750000004,-3.071777343749986],[105.99873046875004,-2.824902343749955],[105.7858398437501,-2.18134765625004],[105.13339843750012,-2.042578125],[105.45957031250006,-1.574707031249986],[105.58544921875003,-1.526757812499994],[105.7008789062501,-1.731054687499963],[105.7204101562501,-1.533886718750026],[105.91005859375,-1.504980468749991],[106.04570312500002,-1.669433593750014]]],[[[123.59755859375,-1.704296875000011],[123.48251953125006,-1.681445312499974],[123.52851562500004,-1.502832031250009],[123.59755859375,-1.704296875000011]]],[[[128.1530273437501,-1.66054687499998],[127.56162109375012,-1.728515624999972],[127.39501953125003,-1.589843749999972],[127.64667968750004,-1.332421875],[128.1530273437501,-1.66054687499998]]],[[[123.2123046875,-1.171289062499966],[123.23779296874997,-1.389355468749983],[123.43476562500004,-1.236816406249986],[123.54726562500005,-1.337402343749957],[123.51191406250004,-1.447363281249977],[123.27490234374997,-1.437207031249955],[123.17294921875006,-1.616015624999974],[123.15039062500003,-1.304492187500003],[122.89042968750007,-1.58720703124996],[122.81083984375002,-1.432128906249986],[122.90800781250002,-1.182226562499963],[123.2123046875,-1.171289062499966]]],[[[109.71025390625007,-1.1806640625],[109.46367187500002,-1.277539062500026],[109.4759765625,-0.9853515625],[109.74335937500004,-1.039355468749989],[109.71025390625007,-1.1806640625]]],[[[134.96533203124997,-1.116015624999974],[134.86171875,-1.114160156249952],[134.82792968750002,-0.978808593750003],[134.99628906250004,-1.03408203124998],[134.96533203124997,-1.116015624999974]]],[[[99.16386718750007,-1.777929687500006],[98.82773437500006,-1.609960937499977],[98.60175781250004,-1.197851562499949],[98.67607421875007,-0.970507812500003],[98.93261718750003,-0.954003906250009],[99.2672851562501,-1.62773437499996],[99.16386718750007,-1.777929687500006]]],[[[131.00185546875005,-1.315527343750034],[130.78232421875006,-1.255468749999963],[130.67294921875006,-0.959765625000031],[131.03300781250007,-0.917578124999963],[131.00185546875005,-1.315527343750034]]],[[[135.38300781250004,-0.6513671875],[135.89355468749997,-0.725781249999969],[136.37529296875007,-1.094042968750031],[136.1647460937501,-1.214746093750023],[135.91503906250003,-1.178417968749997],[135.74707031249997,-0.823046874999974],[135.64570312500004,-0.881933593749991],[135.38300781250004,-0.6513671875]]],[[[127.30039062500012,-0.780957031250026],[127.1564453125001,-0.760937500000026],[127.20908203125006,-0.619335937499955],[127.30039062500012,-0.780957031250026]]],[[[130.6266601562501,-0.528710937499966],[130.46542968750006,-0.486523437499983],[130.6159179687501,-0.417285156250003],[130.6266601562501,-0.528710937499966]]],[[[121.86435546875012,-0.406835937500006],[121.88125,-0.502636718749983],[121.65527343749997,-0.526171874999989],[121.86435546875012,-0.406835937500006]]],[[[140.97343750000007,-2.609765625],[140.97353515625,-2.803417968750026],[140.975,-6.346093750000023],[140.86230468749997,-6.740039062499989],[140.97519531250006,-6.90537109375002],[140.97617187500012,-9.11875],[140.00292968749997,-8.19550781250004],[140.11699218750002,-7.923730468750009],[139.93476562500004,-8.101171875],[139.38564453125,-8.189062499999963],[139.24882812500002,-7.982421874999972],[138.890625,-8.237792968749943],[139.08798828125012,-7.587207031250017],[138.74794921875,-7.25146484375],[139.17685546875006,-7.1904296875],[138.84570312500003,-7.13632812499999],[138.60136718750007,-6.936523437499972],[138.86455078125007,-6.858398437499943],[138.43867187500004,-6.343359375],[138.2962890625,-5.94902343749996],[138.37460937500006,-5.84365234374998],[138.19960937500005,-5.80703125],[138.33964843750007,-5.675683593749966],[138.08710937500004,-5.70917968750004],[138.06083984375002,-5.46523437499998],[137.27978515624997,-4.945410156249949],[136.61884765625004,-4.81875],[135.97968750000004,-4.530859374999963],[135.19560546875007,-4.450683593749972],[134.67968749999997,-4.079101562499943],[134.70654296875003,-3.954785156250026],[134.88652343750007,-3.938476562499986],[134.26621093750012,-3.945800781249972],[134.14707031250006,-3.79677734374998],[133.97382812500004,-3.817968750000034],[133.67832031250006,-3.4794921875],[133.8415039062501,-3.054785156249991],[133.70039062500004,-3.0875],[133.653125,-3.364355468749991],[133.51816406250012,-3.411914062500003],[133.40087890625003,-3.899023437500034],[133.24873046875004,-4.062304687499989],[132.91445312500005,-4.05693359374996],[132.75390625000003,-3.703613281250014],[132.86972656250006,-3.550976562499997],[132.75136718750005,-3.294628906249997],[131.97119140624997,-2.788574218750014],[132.2306640625001,-2.680371093749997],[132.725,-2.789062500000028],[133.19101562500006,-2.43779296874996],[133.70009765625005,-2.624609375],[133.75332031250005,-2.450683593750014],[133.90488281250012,-2.390917968750003],[133.79101562500003,-2.293652343749997],[133.92158203125004,-2.102050781249957],[132.96279296875005,-2.272558593749963],[132.30761718749997,-2.24228515625002],[132.02343749999997,-1.99033203125002],[131.93037109375004,-1.559667968750034],[131.29375,-1.393457031250009],[130.99589843750007,-1.42470703124998],[131.1908203125,-1.165820312500003],[131.2572265625,-0.855468750000014],[131.80429687500006,-0.703808593750026],[132.39375,-0.355468750000028],[132.85644531250003,-0.417382812500023],[133.47265624999997,-0.726171874999963],[133.97451171875,-0.744335937500026],[134.11152343750004,-0.84677734375002],[134.07197265625004,-1.001855468749994],[134.25957031250007,-1.362988281250026],[134.105859375,-1.720996093749946],[134.19482421875003,-2.309082031249943],[134.45996093749997,-2.83232421874996],[134.48330078125,-2.583007812499972],[134.62744140624997,-2.536718749999963],[134.70214843749997,-2.933593749999986],[134.84335937500006,-2.909179687499986],[134.88681640625006,-3.209863281249966],[135.25156250000012,-3.368554687499966],[135.48662109375002,-3.34511718749998],[135.85917968750002,-2.99531250000004],[136.38994140625002,-2.273339843750037],[137.07207031250002,-2.105078124999949],[137.1710937500001,-2.025488281249991],[137.1234375,-1.840917968749963],[137.80625000000012,-1.483203125],[139.78955078125003,-2.34824218750002],[140.62255859374997,-2.44580078125],[140.74746093750005,-2.607128906249997],[140.97343750000007,-2.609765625]]],[[[104.47421875000012,-0.334667968749955],[104.59013671875002,-0.466601562500017],[104.36318359375,-0.658593749999966],[104.25712890625002,-0.463281249999966],[104.47421875000012,-0.334667968749955]]],[[[127.56699218750006,-0.318945312499949],[127.68242187500002,-0.46835937500002],[127.60498046874997,-0.610156249999946],[127.88017578125002,-0.808691406249991],[127.7611328125,-0.883691406249994],[127.62382812500002,-0.76601562499999],[127.46269531250002,-0.80595703124996],[127.46865234375,-0.64296875],[127.3,-0.500292968749946],[127.32509765625,-0.335839843750023],[127.45517578125012,-0.406347656249991],[127.56699218750006,-0.318945312499949]]],[[[127.24990234375005,-0.4953125],[127.11914062500003,-0.520507812499986],[127.12646484375003,-0.278613281250003],[127.29003906250003,-0.284375],[127.24990234375005,-0.4953125]]],[[[103.73652343750004,-0.347949218750003],[103.461328125,-0.357617187500011],[103.54892578125006,-0.227539062499986],[103.73652343750004,-0.347949218750003]]],[[[130.81328125000007,-0.004101562500026],[131.27685546875003,-0.149804687499952],[131.33974609375005,-0.290332031249989],[131.00537109374997,-0.360742187500037],[130.62216796875006,-0.0859375],[130.89921875000002,-0.344433593749997],[130.7501953125001,-0.44384765625],[130.6886718750001,-0.296582031250011],[130.55078124999997,-0.366406250000026],[130.23662109375002,-0.209667968749983],[130.3625,-0.072851562500006],[130.81328125000007,-0.004101562500026]]],[[[98.45927734375007,-0.530468749999969],[98.30966796875012,-0.531835937499977],[98.4271484375,-0.226464843750037],[98.3229492187501,-0.000781249999974],[98.54414062500004,-0.257617187499989],[98.45927734375007,-0.530468749999969]]],[[[104.77861328125007,-0.175976562499955],[105.00537109374997,-0.282812499999963],[104.44707031250002,-0.189160156249983],[104.54267578125004,0.01772460937498],[104.77861328125007,-0.175976562499955]]],[[[103.28447265625002,0.541943359375011],[103.13955078125,0.549072265625043],[103.18740234375,0.699755859375017],[103.28447265625002,0.541943359375011]]],[[[103.0275390625001,0.746630859374974],[102.4904296875001,0.856640625],[102.50664062500002,1.088769531250037],[103.00244140624997,0.859277343750009],[103.0275390625001,0.746630859374974]]],[[[103.42392578125012,1.048339843749972],[103.31542968750003,1.071289062500028],[103.37998046875006,1.133642578125034],[103.42392578125012,1.048339843749972]]],[[[103.16640625000005,0.870166015625003],[102.7018554687501,1.0537109375],[102.72558593749997,1.158837890625023],[102.99941406250005,1.067773437500023],[103.16640625000005,0.870166015625003]]],[[[104.02480468750005,1.180566406250009],[104.13984375000004,1.165576171874974],[104.06611328125004,0.989550781249989],[103.93222656250012,1.071386718749963],[104.02480468750005,1.180566406250009]]],[[[104.58535156250005,1.21611328124996],[104.66289062500002,1.04951171875004],[104.57519531250003,0.831933593750037],[104.43925781250002,1.050439453125051],[104.25195312499997,1.014892578125],[104.36181640624997,1.18149414062502],[104.58535156250005,1.21611328124996]]],[[[102.4271484375,0.990136718750023],[102.27958984375002,1.075683593750043],[102.25634765625003,1.397070312499963],[102.44287109374997,1.234228515625006],[102.4271484375,0.990136718750023]]],[[[97.48154296875006,1.465087890624972],[97.93193359375002,0.973925781250003],[97.82041015625012,0.564453124999986],[97.683984375,0.596093750000037],[97.60390625000005,0.83388671874998],[97.40537109375012,0.946972656250026],[97.07919921875006,1.425488281249983],[97.35595703124997,1.539746093749997],[97.48154296875006,1.465087890624972]]],[[[102.49189453125004,1.459179687500011],[102.49941406250005,1.330908203124991],[102.02402343750012,1.607958984375031],[102.49189453125004,1.459179687500011]]],[[[124.88886718750004,0.995312500000011],[124.42753906250002,0.470605468750051],[123.75380859375,0.305517578124991],[123.26542968750007,0.326611328125026],[122.996875,0.493505859375006],[121.01298828125002,0.441699218750017],[120.57900390625,0.5283203125],[120.19228515625,0.268505859374997],[120.01328125000012,-0.196191406249994],[120.062890625,-0.555566406250023],[120.240625,-0.868261718749949],[120.51757812499997,-1.039453125],[120.66738281250005,-1.370117187499972],[121.14853515625012,-1.33945312500002],[121.5755859375,-0.828515625000023],[121.96962890625005,-0.933300781249969],[122.27998046875004,-0.757031250000026],[122.88876953125006,-0.755175781250003],[122.8294921875,-0.658886718750026],[123.17148437500012,-0.57070312499999],[123.37968750000002,-0.648535156249949],[123.43417968750006,-0.778222656249994],[123.37792968749997,-1.004101562500011],[122.90283203125003,-0.900976562499963],[122.25068359375004,-1.555273437500034],[121.8585937500001,-1.69326171874998],[121.65097656250006,-1.895410156249952],[121.35546874999997,-1.878222656250003],[122.29169921875004,-2.907617187500023],[122.39902343750006,-3.200878906249997],[122.25292968749997,-3.620410156250017],[122.68964843750004,-4.084472656249972],[122.84794921875002,-4.064550781250006],[122.8722656250001,-4.391992187500009],[122.71972656250003,-4.340722656249952],[122.11425781250003,-4.540234375000011],[122.03808593749997,-4.832421875000023],[121.58867187500007,-4.759570312500017],[121.48652343750004,-4.581054687499972],[121.61806640625,-4.092675781249952],[120.89179687500004,-3.520605468750034],[121.05429687500012,-3.167089843749949],[121.0521484375,-2.751660156249955],[120.87939453124997,-2.64560546875002],[120.65361328125002,-2.667578124999977],[120.26103515625007,-2.949316406249991],[120.43662109375012,-3.70732421874996],[120.42011718750004,-4.617382812500011],[120.27929687499997,-5.146093749999977],[120.4303710937501,-5.591015625000026],[119.9515625,-5.577636718749972],[119.71728515625003,-5.693359375000014],[119.55742187500007,-5.611035156250026],[119.36035156249997,-5.314160156250026],[119.59404296875007,-4.523144531249997],[119.62363281250006,-4.034375],[119.46748046875004,-3.512988281249989],[118.99462890624997,-3.537597656250028],[118.86767578124997,-3.39804687500002],[118.78330078125006,-2.720800781249977],[119.09218750000005,-2.482910156250014],[119.32187500000012,-1.929687500000014],[119.308984375,-1.408203125],[119.508203125,-0.906738281249972],[119.71132812500005,-0.680761718750034],[119.84433593750006,-0.861914062499991],[119.721875,-0.088476562499991],[119.865625,0.040087890625003],[119.80927734375004,0.238671875000051],[119.9132812500001,0.445068359375],[120.26953125000003,0.970800781249991],[120.60253906249997,0.854394531249994],[120.86796875000007,1.25283203124998],[121.0817382812501,1.327636718750028],[121.40410156250002,1.243603515624969],[121.59179687499997,1.067968749999977],[122.43662109375006,1.018066406250028],[122.83828125,0.845703125],[123.06650390625006,0.941796875000037],[123.93076171875006,0.850439453124977],[124.53369140624997,1.230468750000043],[124.94707031250002,1.672167968749974],[125.11093750000012,1.685693359374966],[125.2337890625,1.502294921875006],[124.88886718750004,0.995312500000011]]],[[[101.70810546875006,2.078417968750045],[101.71943359375004,1.789160156250006],[101.50078125000002,1.733203124999974],[101.40966796875003,2.021679687500026],[101.70810546875006,2.078417968750045]]],[[[127.73271484375007,0.848144531250043],[127.8810546875001,0.832128906249977],[127.96728515624997,1.042578125000048],[128.16074218750006,1.1578125],[128.22246093750002,1.400634765624986],[128.68837890625,1.572558593750017],[128.70263671874997,1.106396484374997],[128.29882812500003,0.87680664062502],[128.26064453125,0.733789062500023],[128.61123046875,0.549951171875051],[128.89960937500004,0.216259765625011],[127.9831054687501,0.471875],[127.88740234375004,0.298339843750043],[127.97783203125002,-0.24833984374996],[128.4254882812501,-0.892675781249949],[128.04638671875003,-0.706054687499943],[127.69160156250004,-0.241894531249983],[127.70869140625004,0.288085937499986],[127.53710937500003,0.610888671875031],[127.60800781250006,0.848242187499977],[127.42851562500002,1.139990234374991],[127.63173828125,1.843701171875011],[128.03642578125002,2.199023437500017],[127.88681640625012,1.83295898437504],[128.0109375000001,1.701220703125031],[128.01171874999997,1.331738281249983],[127.65283203124997,1.013867187499969],[127.73271484375007,0.848144531250043]]],[[[97.3341796875001,2.075634765625011],[97.10830078125,2.216894531250006],[97.29140625,2.200830078125023],[97.3341796875001,2.075634765625011]]],[[[128.45390625000002,2.051757812500028],[128.29589843749997,2.034716796875017],[128.2179687500001,2.297460937499991],[128.60214843750012,2.59760742187504],[128.68847656250003,2.473681640625017],[128.62324218750004,2.224414062500031],[128.45390625000002,2.051757812500028]]],[[[96.46367187500002,2.360009765625037],[95.80859374999997,2.655615234375034],[95.7171875,2.825976562500017],[95.89580078125007,2.8890625],[96.41728515625007,2.515185546875031],[96.46367187500002,2.360009765625037]]],[[[108.8875,2.905419921875037],[108.7865234375,2.885644531250009],[108.88574218750003,2.998974609374997],[108.8875,2.905419921875037]]],[[[105.76035156250006,2.863037109375014],[105.69218750000002,3.0625],[105.83671875000007,2.97651367187504],[105.76035156250006,2.863037109375014]]],[[[106.28525390625006,3.15712890624998],[106.28369140624997,3.088232421874977],[106.20097656250002,3.204882812500031],[106.28525390625006,3.15712890624998]]],[[[117.65839843750004,3.280517578124986],[117.54785156250003,3.43198242187502],[117.68085937500004,3.407519531250017],[117.65839843750004,3.280517578124986]]],[[[125.65810546875,3.436035156250043],[125.51152343750007,3.461132812500011],[125.46884765625006,3.73325195312502],[125.65810546875,3.436035156250043]]],[[[117.88476562499997,4.186132812500006],[117.92285156250003,4.054296874999977],[117.73681640624997,4.004003906250034],[117.64902343750012,4.168994140624974],[117.88476562499997,4.186132812500006]]],[[[108.31601562500006,3.689648437500026],[108.10039062500002,3.70454101562504],[108.24326171875006,3.810351562500017],[108.00234375,3.982861328124983],[108.24833984375002,4.21713867187502],[108.39287109375007,3.986181640625034],[108.31601562500006,3.689648437500026]]],[[[117.5744140625001,4.17060546875004],[117.46533203124997,4.076074218749966],[117.77724609375005,3.689257812500031],[117.05595703125007,3.622656249999963],[117.34628906250006,3.426611328124991],[117.35244140625,3.19375],[117.61064453125002,3.064355468749994],[117.56914062500002,2.92929687500002],[117.69765625,2.887304687499991],[117.6388671875001,2.825292968749963],[118.0666015625001,2.317822265624969],[117.7892578125001,2.026855468750014],[118.98496093750006,0.982128906249983],[118.53476562500006,0.813525390625017],[118.19609375000002,0.874365234374977],[117.91162109374997,1.098681640625017],[117.96425781250005,0.889550781250051],[117.74511718749997,0.72963867187498],[117.52216796875004,0.235888671875017],[117.46289062500003,-0.323730468749957],[117.5625,-0.770898437500009],[116.91396484375,-1.223632812499972],[116.73984375000006,-1.044238281250017],[116.75341796874997,-1.327343749999955],[116.27548828125006,-1.784863281249997],[116.42431640625003,-1.784863281249997],[116.45195312500002,-1.923144531250017],[116.31396484374997,-2.139843750000011],[116.56542968749997,-2.299707031249994],[116.52929687499997,-2.51054687499996],[116.31679687500005,-2.55185546875002],[116.33066406250012,-2.902148437499974],[116.16630859375002,-2.934570312500014],[116.2572265625,-3.126367187500009],[115.95615234375012,-3.595019531250003],[114.6935546875001,-4.169726562500017],[114.5255859375001,-3.376660156250011],[114.44599609375004,-3.481835937500037],[114.34433593750012,-3.444433593749963],[114.34433593750012,-3.23515625],[114.23632812500003,-3.36113281249996],[114.0822265625001,-3.27890625],[113.70507812499997,-3.45527343750004],[113.6100585937501,-3.195703125],[113.34316406250005,-3.246484374999966],[113.03398437500002,-2.933496093749966],[112.97148437500002,-3.187109375000034],[112.75800781250004,-3.322167968750009],[112.60029296875004,-3.400488281249977],[112.28496093750002,-3.32099609375004],[111.85810546875004,-3.551855468750006],[111.82304687500007,-3.057226562499949],[111.69472656250005,-2.88945312499996],[110.93007812500005,-3.071093750000017],[110.82968750000012,-2.9951171875],[110.89931640625,-2.908593749999952],[110.703125,-3.020898437500009],[110.57402343750007,-2.89140625],[110.25605468750004,-2.966113281249946],[110.09658203125,-2.001367187499966],[109.95986328125,-1.862792968749972],[109.98330078125,-1.274804687499994],[109.78740234375007,-1.011328124999963],[109.25878906250003,-0.807421874999989],[109.37275390625004,-0.638183593749972],[109.12109375000003,-0.39091796874996],[109.2575195312501,0.031152343750051],[108.94453125000004,0.355664062499997],[108.91679687500007,0.912646484375045],[108.95859375000006,1.134619140624963],[109.1315429687501,1.253857421875011],[109.01025390624997,1.239648437500051],[109.07587890625004,1.495898437500031],[109.37851562500006,1.922705078125034],[109.62890625000003,2.027539062499983],[109.53896484375,1.89619140625004],[109.65400390625004,1.614892578125023],[110.50576171875005,0.861962890625023],[111.10136718750002,1.050537109374986],[111.80898437500005,1.011669921874969],[112.078515625,1.143359374999974],[112.1857421875001,1.4390625],[112.47617187500006,1.559082031250028],[112.94296875000006,1.566992187500034],[113.00654296875004,1.433886718750003],[113.6222656250001,1.2359375],[113.90234375000003,1.434277343749997],[114.5125,1.452001953124963],[114.83056640625003,1.980029296874989],[114.78642578125002,2.250488281250014],[115.1791015625,2.523193359374972],[115.08076171875004,2.63422851562504],[115.117578125,2.89487304687502],[115.24697265625005,3.025927734374989],[115.45439453125002,3.034326171875009],[115.67880859375006,4.193017578124994],[115.86074218750005,4.348046875000037],[116.51474609375006,4.370800781249969],[117.10058593750003,4.337060546875023],[117.5744140625001,4.17060546875004]]],[[[126.81660156250004,4.033496093750003],[126.70449218750005,4.070996093749997],[126.81357421875006,4.258496093750011],[126.72207031250005,4.344189453124969],[126.75732421874997,4.547900390624989],[126.9210937500001,4.291015624999972],[126.81660156250004,4.033496093750003]]],[[[96.49257812500005,5.229345703124991],[97.54716796875002,5.205859375],[98.2484375,4.41455078125],[98.3073242187501,4.09287109375002],[99.73232421875005,3.183056640625026],[100.523828125,2.18916015625004],[100.88789062500004,1.948242187499986],[100.82822265625012,2.242578125],[101.04619140625002,2.257470703125023],[101.47666015625006,1.693066406250054],[102.019921875,1.442138671875],[102.38994140625007,0.84199218750004],[103.03183593750006,0.57890625],[103.0075195312501,0.415332031249974],[102.55,0.216455078124966],[103.33896484375012,0.513720703125045],[103.67265625000007,0.288916015624977],[103.78671875000012,0.046972656249991],[103.42851562500007,-0.19179687499998],[103.40517578125005,-0.36220703124998],[103.5091796875,-0.465527343749969],[103.43857421875006,-0.575585937500009],[103.72109375,-0.886718749999986],[104.36054687500004,-1.038378906249974],[104.51591796875002,-1.81943359375002],[104.84521484375003,-2.092968749999969],[104.65078125000005,-2.595214843749972],[104.97080078125012,-2.370898437500017],[105.39697265624997,-2.380175781249946],[106.0443359375,-3.10625],[105.84375,-3.61367187499998],[105.93046875000007,-3.833007812499986],[105.83144531250005,-4.16289062499996],[105.88720703124997,-5.009570312499974],[105.74833984375007,-5.818261718749966],[105.34941406250007,-5.549511718750011],[105.08134765625002,-5.74550781249998],[104.63955078125005,-5.520410156250037],[104.68398437500005,-5.89267578125002],[104.60156249999997,-5.90458984374996],[103.8314453125,-5.079589843750028],[102.53769531250006,-4.152148437499989],[102.12753906250006,-3.599218749999963],[101.57861328124997,-3.166992187500014],[100.88955078125,-2.248535156249957],[100.85527343750002,-1.934179687499949],[100.30820312500006,-0.82666015625],[99.66982421875005,0.045068359375037],[99.15917968749997,0.351757812499997],[98.59531250000006,1.864599609375006],[97.70078125000006,2.358544921875009],[97.59082031249997,2.846582031250037],[97.3913085937501,2.975292968749969],[96.9689453125001,3.575146484374969],[96.44472656250005,3.81630859374998],[95.57861328125003,4.661962890625048],[95.20664062500006,5.284033203125034],[95.22783203125002,5.564794921875034],[95.62890625000003,5.609082031249997],[96.13330078125003,5.294287109374991],[96.49257812500005,5.229345703124991]]]]},"properties":{"name":"Indonesia","childNum":107}},{"geometry":{"type":"Polygon","coordinates":[[[-4.412060546874983,54.185351562499996],[-4.785351562499983,54.073046875],[-4.424707031249994,54.407177734375],[-4.412060546874983,54.185351562499996]]]},"properties":{"name":"Isle of Man","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[93.8900390625,6.831054687499986],[93.82880859375004,6.748681640624994],[93.65800781250007,7.016064453125026],[93.68417968750006,7.183593750000043],[93.8224609375001,7.236621093750017],[93.8900390625,6.831054687499986]]],[[[92.50283203125,10.55488281250004],[92.36953125,10.547412109375031],[92.35283203125007,10.751123046874966],[92.51035156250012,10.897460937500028],[92.50283203125,10.55488281250004]]],[[[92.69316406250002,11.381152343749974],[92.59570312499997,11.386425781249983],[92.64023437500012,11.50913085937502],[92.69316406250002,11.381152343749974]]],[[[93.01738281250002,12.036816406249969],[93.06210937500006,11.899414062500043],[92.95537109375007,12.002441406249986],[93.01738281250002,12.036816406249969]]],[[[92.71757812500002,12.864892578125009],[92.68574218750004,12.799951171875009],[92.71064453125004,12.96157226562498],[92.71757812500002,12.864892578125009]]],[[[92.72275390625012,11.536083984375011],[92.5338867187501,11.873388671874977],[92.6764648437501,12.192382812500043],[92.78828125000004,12.225781250000011],[92.72070312499997,12.541259765624972],[92.85732421875,13.35810546875004],[93.06230468750002,13.545458984375017],[93.0661132812501,13.221582031250023],[92.88623046875003,12.942285156249966],[92.99023437499997,12.53852539062504],[92.86367187500005,12.436035156250028],[92.72275390625012,11.536083984375011]]],[[[78.71972656250009,31.887646484374983],[78.69345703125006,31.740380859374994],[78.7550781250001,31.55029296875],[78.74355468750005,31.323779296875017],[79.10712890625004,31.402636718750102],[79.38847656250013,31.064208984375085],[79.66425781250004,30.96523437499999],[79.92451171875004,30.888769531250034],[80.20712890625006,30.683740234375023],[80.19121093750002,30.56840820312496],[80.87353515625003,30.290576171875045],[80.98544921875006,30.23710937499999],[81.01025390625014,30.164501953125097],[80.96611328125002,30.180029296875063],[80.90761718750005,30.171923828125017],[80.84814453125009,30.139746093750034],[80.81992187500012,30.119335937499955],[80.68408203125014,29.994335937500068],[80.54902343750015,29.899804687499994],[80.40185546875003,29.730273437500102],[80.31689453125014,29.572070312500017],[80.25488281250009,29.423339843750114],[80.25595703125006,29.318017578125136],[80.23300781250006,29.194628906250045],[80.16953125000012,29.124316406250102],[80.13046875000006,29.100390625000045],[80.08457031249995,28.994189453125074],[80.05166015625,28.870312500000068],[80.07070312500005,28.830175781250063],[80.22656250000003,28.723339843750125],[80.32480468750012,28.66640625000008],[80.41855468749995,28.61201171875001],[80.47910156250012,28.604882812499994],[80.49580078125015,28.635791015625074],[80.51787109375002,28.665185546875023],[80.58701171875006,28.64960937500004],[81.16894531250014,28.335009765625074],[81.85263671875018,27.867089843750136],[81.89687500000011,27.87446289062504],[81.94521484375005,27.89926757812495],[81.98769531250016,27.91376953125004],[82.03701171875,27.90058593750004],[82.11191406250006,27.86494140625004],[82.28769531250018,27.756542968749983],[82.45136718750004,27.671826171874955],[82.62988281249997,27.687060546875045],[82.67734375000006,27.67343749999995],[82.71083984375005,27.596679687500114],[82.73339843750003,27.518994140625097],[83.28974609375004,27.370996093750136],[83.36943359375002,27.410253906249977],[83.38398437500004,27.444824218750085],[83.44716796875011,27.46533203125],[83.55166015625011,27.456347656249932],[83.74697265625011,27.395947265625068],[83.8288085937501,27.377832031250108],[84.09101562499993,27.491357421875136],[84.22978515625007,27.427832031250006],[84.48085937500005,27.348193359375102],[84.61015625000002,27.298681640624977],[84.64072265625012,27.249853515624977],[84.65478515625014,27.20366210937499],[84.65380859375009,27.09169921875008],[84.68535156250013,27.041015625000057],[85.19179687500011,26.766552734375097],[85.29296875000009,26.741015625000045],[85.56845703125012,26.839843750000114],[85.64843749999997,26.829003906250023],[85.69990234375004,26.781640624999966],[85.73730468750003,26.639746093750034],[85.79453125000006,26.60415039062505],[86.00732421875009,26.64936523437504],[86.70136718750015,26.435058593750057],[87.01640625000002,26.555419921875085],[87.2874023437499,26.360302734375125],[87.41357421875014,26.42294921875009],[87.84921875000006,26.43691406250008],[87.99511718750014,26.38237304687499],[88.02695312500023,26.395019531250085],[88.05488281250004,26.43002929687492],[88.11152343750004,26.58642578125],[88.1615234375,26.724804687500125],[88.15722656250009,26.807324218750068],[88.1110351562501,26.928466796875057],[87.99316406250009,27.086083984374994],[87.984375,27.133935546874994],[88.14697265625014,27.749218750000097],[88.15029296875011,27.843310546875074],[88.10976562500005,27.87060546874997],[88.10898437499995,27.93300781250005],[88.14111328125003,27.948925781250097],[88.27519531250013,27.96884765625009],[88.42597656250015,28.011669921875097],[88.57792968750002,28.093359375000034],[88.80371093750003,28.006933593750034],[88.74902343749997,27.521875000000136],[88.7648437500001,27.429882812500068],[88.83251953125003,27.362841796875074],[88.89140625000002,27.316064453125136],[88.88164062500007,27.29746093750009],[88.76035156250006,27.21811523437509],[88.73876953125009,27.175585937499932],[88.85761718750015,26.961474609375017],[89.14824218750002,26.816162109375085],[89.33212890625018,26.848632812500114],[89.58613281250004,26.778955078125136],[89.60996093750012,26.719433593750097],[89.71093750000009,26.713916015625045],[89.76386718750004,26.7015625],[89.94316406250013,26.723925781249932],[90.12294921875011,26.754589843749983],[90.20605468749997,26.847509765625063],[90.34589843750004,26.890332031250097],[90.73964843750005,26.771679687500068],[91.2865234375,26.78994140625008],[91.42675781249997,26.867089843749966],[91.45585937500013,26.866894531250125],[91.51757812500009,26.807324218750068],[91.67158203124993,26.80200195312503],[91.84208984375013,26.852978515625125],[91.94375,26.860839843750114],[91.99833984375013,26.85498046875],[92.04970703125016,26.87485351562495],[92.73155507489682,26.833697862861648],[93.30975376159499,26.784950522650554],[93.61047043679247,27.32239435188504],[94.06979001484449,27.589407158584788],[95.10800937321915,27.749636881153737],[95.74000740838363,28.116850432722256],[96.19577594042592,28.04291597700983],[96.96279296875,27.698291015625017],[96.88359375000013,27.514843750000125],[96.90195312500012,27.43959960937508],[97.10371093749993,27.163330078125114],[97.10205078125003,27.115429687500125],[96.95341796875013,27.13330078125003],[96.79785156249997,27.29619140624999],[96.19082031250005,27.26127929687499],[95.20146484375007,26.641406250000017],[95.05976562500015,26.473974609375006],[95.06894531250006,26.191113281250097],[95.10839843750014,26.091406250000034],[95.12929687500011,26.070410156250034],[95.13242187500006,26.041259765624943],[94.99199218750002,25.77045898437504],[94.66777343750007,25.458886718749966],[94.55302734375013,25.215722656249994],[94.70371093750012,25.097851562499955],[94.49316406250003,24.637646484374983],[94.37724609375002,24.473730468750006],[94.29306640625012,24.321875],[94.07480468750006,23.8720703125],[93.68339843750007,24.00654296875004],[93.45214843750003,23.987402343750034],[93.32626953125006,24.064208984375057],[93.36601562500007,23.132519531249955],[93.34941406250007,23.08496093750003],[93.20390625000002,23.03701171875005],[93.07871093750018,22.718212890625097],[93.16201171875,22.360205078125006],[93.07060546875002,22.20942382812501],[92.96455078125015,22.003759765625034],[92.90947265625013,21.988916015625023],[92.85429687500002,22.010156250000108],[92.77138671875,22.104785156250017],[92.68896484375009,22.130957031250006],[92.63037109375014,22.011328124999977],[92.57490234374993,21.97807617187496],[92.5612304687501,22.04804687500001],[92.49140625000004,22.685400390625006],[92.46445312500006,22.734423828125045],[92.36162109375002,22.929003906250074],[92.33378906250002,23.242382812499955],[92.24609375000003,23.68359374999997],[92.04404296875006,23.677783203125017],[91.97851562500003,23.691992187500063],[91.92958984375011,23.685986328125097],[91.92949218750019,23.598242187499977],[91.93789062500011,23.504687500000102],[91.75419921875013,23.28730468750004],[91.75097656250003,23.053515625000017],[91.55351562500013,22.991552734375006],[91.43623046875004,23.19990234375001],[91.359375,23.06835937500003],[91.16044921875019,23.660644531250085],[91.35019531250012,24.06049804687501],[91.72656250000003,24.20507812499997],[91.84619140624997,24.175292968749943],[92.06416015625004,24.374365234375006],[92.11748046875002,24.493945312500017],[92.22666015625012,24.77099609374997],[92.22832031250002,24.881347656250085],[92.2512695312499,24.895068359375045],[92.38496093750004,24.848779296875023],[92.46835937500018,24.944140625000074],[92.04970703125016,25.16948242187499],[90.61308593750002,25.16772460937497],[90.11962890625003,25.21997070312497],[89.86630859375012,25.293164062499955],[89.81406250000006,25.305371093749955],[89.80087890625012,25.33613281250001],[89.82490234375004,25.56015625],[89.82294921875015,25.94140625000003],[89.67089843750009,26.213818359375125],[89.57275390625003,26.13232421875003],[89.54990234375006,26.00527343750008],[89.28925781250015,26.037597656250085],[89.01865234375012,26.410253906249977],[88.95195312500002,26.412109375],[88.97041015625004,26.250878906250023],[88.94072265625002,26.24536132812497],[88.68281250000004,26.291699218749983],[88.51826171875004,26.51777343750004],[88.36992187500002,26.56411132812508],[88.35146484375005,26.482568359374966],[88.38623046875003,26.471533203125034],[88.44042968749997,26.369482421875034],[88.33398437499997,26.257519531249955],[88.15078125000005,26.087158203125057],[88.1066406250001,25.841113281250045],[88.14746093749997,25.811425781250023],[88.50244140625009,25.53701171875008],[88.76914062500006,25.490478515625],[88.85478515625002,25.333544921875017],[88.94414062500002,25.290771484375],[88.92978515625012,25.222998046875063],[88.57382812500006,25.18789062499999],[88.45625,25.188427734375125],[88.37294921875016,24.961523437500063],[88.31337890625011,24.8818359375],[88.27949218750015,24.881933593750034],[88.18886718750016,24.920605468750097],[88.14980468750011,24.91464843749995],[88.04511718750015,24.71303710937508],[88.03027343750009,24.664453125000136],[88.02343750000003,24.627832031250136],[88.07910156250009,24.549902343750063],[88.14550781250003,24.485791015624955],[88.225,24.460644531249983],[88.3375,24.45385742187503],[88.49853515625003,24.34663085937504],[88.64228515625015,24.325976562500102],[88.72353515625011,24.27490234375],[88.7335937500001,24.230908203125097],[88.72656250000009,24.18623046875004],[88.71376953125016,24.069628906250102],[88.69980468750006,24.00253906249992],[88.56738281250009,23.674414062500034],[88.63574218749997,23.55],[88.69765625,23.493017578125034],[88.72441406250002,23.254980468750034],[88.89707031250018,23.21040039062501],[88.92812500000011,23.186621093749977],[88.89970703125002,22.843505859375057],[88.92070312500002,22.632031249999955],[89.05,22.274609374999983],[89.02792968750023,21.937207031249983],[88.94931640625018,21.937939453125125],[89.05166015625,21.654101562500045],[88.85751953125012,21.744677734375017],[88.74501953125011,21.584375],[88.74023437500003,22.005419921875017],[88.64160156250003,22.121972656250136],[88.58466796875015,21.659716796874932],[88.44599609375004,21.614257812500085],[88.28750000000016,21.758203125000108],[88.25371093750002,21.622314453124943],[88.0568359375001,21.694140625000017],[88.19628906249997,22.139550781249994],[87.94140625000003,22.374316406250045],[88.15927734375018,22.12172851562508],[87.82373046875003,21.727343750000045],[87.20068359375009,21.544873046874983],[86.95410156250014,21.365332031250006],[86.84228515625009,21.106347656249994],[86.97548828125005,20.70014648437501],[86.75039062500011,20.313232421875057],[86.37656250000006,20.006738281249966],[86.24521484375012,20.05302734374999],[86.27949218750021,19.919433593749943],[85.575,19.69291992187499],[85.496875,19.696923828125108],[85.50410156250004,19.887695312500057],[85.24863281250006,19.757666015625034],[85.18076171875018,19.59487304687508],[85.44160156249993,19.626562499999977],[84.77099609375009,19.125390625000023],[84.10410156250018,18.29267578125001],[82.35957031250004,17.09619140624997],[82.25878906250014,16.55986328124996],[81.76191406250015,16.32949218750008],[81.28613281249997,16.337060546875023],[80.97871093750004,15.758349609375074],[80.64658203125006,15.895019531250028],[80.29345703125014,15.710742187499989],[80.0534179687501,15.074023437499932],[80.17871093750003,14.478320312500074],[80.11171875000005,14.212207031250045],[80.30654296875016,13.485058593750054],[80.15625,13.713769531250108],[80.06210937500006,13.60625],[80.34238281250006,13.361328125000071],[80.22910156250018,12.690332031249966],[79.85849609375018,11.988769531250043],[79.69316406250007,11.312548828124946],[79.79902343750004,11.338671874999932],[79.84863281250009,11.196875],[79.83818359375002,10.322558593750045],[79.31455078125018,10.256689453124949],[78.93994140625009,9.565771484375063],[79.01992187500005,9.333349609374963],[79.41142578125002,9.192382812500014],[78.97958984375018,9.268554687500085],[78.42148437500006,9.105029296874989],[78.19248046874995,8.890869140625057],[78.06015625000006,8.384570312499932],[77.51757812500003,8.078320312500068],[77.06591796875003,8.315917968749986],[76.5534179687501,8.902783203124997],[76.32460937500016,9.452099609374997],[76.24238281250004,9.927099609374949],[76.37558593750006,9.539892578124935],[76.45878906250013,9.536230468750077],[76.34648437500002,9.922119140625],[76.19560546875002,10.086132812500026],[75.72382812500015,11.361767578125026],[74.94550781250004,12.56455078124992],[74.38222656250005,14.494726562500048],[73.94921875000014,15.074755859375088],[73.80078125000009,15.39697265625],[73.93193359375013,15.39697265625],[73.77177734375013,15.573046874999989],[73.83281250000013,15.659375],[73.67988281250015,15.708886718750136],[73.47607421875003,16.05424804687496],[72.87548828124997,18.642822265625114],[72.97207031250011,19.15332031250003],[72.8346679687501,18.975585937500057],[72.80302734375013,19.07929687500004],[72.81162109375,19.298925781250006],[72.98720703125,19.27744140625009],[72.78789062500013,19.362988281250097],[72.66777343750019,19.83095703125005],[72.89375,20.672753906250136],[72.81386718750011,21.117187500000085],[72.62382812500002,21.371972656250108],[72.73476562500016,21.470800781250006],[72.61328125000009,21.461816406250108],[73.1125,21.750439453125125],[72.54306640625,21.69658203124999],[72.70019531250003,21.971923828124943],[72.52226562500013,21.976220703125108],[72.55302734375007,22.159960937500074],[72.80917968749995,22.23330078125008],[72.18281250000015,22.26972656250004],[72.30644531250002,22.18920898437497],[72.27441406250009,22.089746093749966],[72.03720703125006,21.82304687499999],[72.2103515625,21.72822265625004],[72.25400390625006,21.531005859375],[72.01523437500012,21.155712890625097],[71.0246093750001,20.73886718750009],[70.71933593750006,20.740429687500068],[70.12734375,21.094677734375097],[68.96992187500021,22.29028320312497],[69.05166015625016,22.437304687500074],[69.27656250000004,22.285498046875063],[70.17724609375014,22.57275390624997],[70.48925781250009,23.08950195312508],[70.33945312500012,22.939746093749932],[69.66464843750006,22.759082031250074],[69.23593749999995,22.848535156250023],[68.64072265625006,23.189941406250114],[68.41748046875009,23.57148437500004],[68.7767578125,23.852099609375017],[68.23496093749995,23.596972656250074],[68.16503906250009,23.857324218749994],[68.28251953125013,23.927978515625],[68.38125000000016,23.950878906250068],[68.48867187500011,23.96723632812501],[68.5866210937501,23.966601562500074],[68.72412109375003,23.964697265625034],[68.72812500000012,24.265625],[68.73964843750016,24.291992187500085],[68.75898437499993,24.307226562500006],[68.78115234375011,24.313720703125085],[68.8,24.30908203125003],[68.82832031250004,24.26401367187509],[68.86347656250015,24.26650390625005],[68.90078125000011,24.29243164062501],[68.98457031250015,24.273095703124966],[69.05156250000013,24.28632812500001],[69.11953125000011,24.26865234374995],[69.23505859374993,24.268261718750068],[69.44345703124995,24.275390625000085],[69.55917968750006,24.273095703124966],[69.80517578125009,24.16523437500004],[70.0982421875,24.2875],[70.28906250000009,24.356298828125063],[70.54677734375,24.418310546875063],[70.56503906250006,24.385791015625017],[70.55585937500015,24.331103515625074],[70.57929687500015,24.279052734374943],[70.65947265625013,24.24609374999997],[70.71630859375009,24.237988281250097],[70.7672851562501,24.245410156250017],[70.80507812500011,24.26196289062503],[70.88623046875014,24.34375],[70.92812500000016,24.362353515625045],[70.98281250000011,24.361035156250125],[71.04404296875006,24.400097656250097],[71.04531250000005,24.42998046874996],[70.96982421875012,24.571875],[70.97636718750013,24.61875],[71.00234375000016,24.6539062499999],[71.04785156250003,24.687744140625085],[71.02070312500021,24.75766601562492],[70.95087890625015,24.89160156250003],[70.87773437500019,25.06298828124997],[70.65205078125004,25.422900390625102],[70.64843750000003,25.666943359375068],[70.5695312500001,25.705957031250023],[70.50585937500009,25.685302734375085],[70.44853515625013,25.681347656249983],[70.26464843750009,25.70654296874997],[70.10019531250006,25.91005859375005],[70.14921875000002,26.347558593749994],[70.11464843750016,26.548046874999983],[69.47001953125002,26.804443359375],[69.56796875,27.174609375000102],[69.89628906250007,27.473632812500085],[70.04980468750009,27.694726562500023],[70.14453125000003,27.849023437499994],[70.19394531250006,27.89487304687492],[70.24433593750004,27.934130859375102],[70.4037109375,28.025048828124994],[70.48857421875013,28.023144531250125],[70.62910156250015,27.937451171875068],[70.6916015625001,27.76899414062504],[70.79794921875012,27.709619140625023],[70.87490234375016,27.71445312499995],[71.18476562500004,27.831640625],[71.54296875000003,27.869873046875],[71.8703125000001,27.9625],[71.88886718750004,28.04746093749992],[71.94804687500002,28.177294921875102],[72.12851562500012,28.34633789062508],[72.29199218750003,28.69726562499997],[72.34189453125006,28.751904296875097],[72.90332031250003,29.02875976562501],[73.38164062500013,29.934375],[73.8091796875,30.093359375],[73.88652343750013,30.162011718750136],[73.93339843750002,30.222070312500108],[73.92460937500007,30.28164062499999],[73.88271484375,30.352148437499977],[73.89931640625,30.435351562500045],[74.00898437500004,30.519677734374994],[74.33935546875003,30.893554687499943],[74.38037109375003,30.89340820312509],[74.50976562500009,30.959667968750097],[74.63281250000014,31.034667968750114],[74.62578125000002,31.068750000000108],[74.61035156250009,31.112841796875045],[74.51767578125012,31.185595703124932],[74.53496093750007,31.261376953125108],[74.59394531249993,31.465380859375102],[74.58183593750013,31.523925781250114],[74.50996093750015,31.712939453125074],[74.52597656249995,31.765136718750057],[74.55556640625011,31.818554687500097],[74.63574218750003,31.889746093750034],[74.73945312500015,31.948828125],[75.07148437500015,32.08935546875003],[75.13876953125,32.10478515624999],[75.25410156250004,32.140332031250125],[75.33349609374997,32.279199218749994],[74.98730468749997,32.46220703124996],[74.78886718750013,32.4578125],[74.6857421875001,32.493798828124994],[74.66328125000004,32.75766601562495],[74.63242187499995,32.770898437500136],[74.58828125000011,32.7532226562501],[74.35458984375012,32.76870117187505],[74.30546875000007,32.81044921875002],[74.30361328125005,32.991796875000034],[73.98984375000006,33.22119140625006],[74.15,33.506982421874994],[73.97646484375016,33.72128906249998],[74.24648437500011,33.99018554687504],[73.9499023437501,34.018798828125],[73.90390625000012,34.10800781250006],[73.97949218750009,34.191308593749966],[73.97236328125004,34.23662109374996],[73.92460937500007,34.287841796875114],[73.80996093750016,34.32534179687511],[73.79453125000006,34.378222656250045],[73.96123046875007,34.653466796874994],[74.05585937500015,34.68066406250003],[74.17197265624995,34.72089843750004],[74.30039062500006,34.76538085937506],[75.70917968750004,34.50307617187508],[75.86210937500002,34.56025390625001],[75.93828125000019,34.612548828125],[76.04101562500014,34.66992187499997],[76.17246093750006,34.66772460937506],[76.4567382812501,34.756103515625114],[76.5944335937501,34.73583984375006],[76.69628906249997,34.78691406249999],[76.74902343750014,34.84755859375008],[76.7575195312501,34.87783203125005],[76.7829101562501,34.90019531249999],[77.00087890625011,34.99199218750002],[77.03066406250011,35.06235351562498],[77.04863281250007,35.109912109375074],[77.42343749999995,35.30258789062506],[77.57158203125002,35.37875976562495],[77.69697265625015,35.443261718750136],[77.79941406250006,35.49589843750002],[78.0426757812501,35.4797851562501],[78.07578125000006,35.13491210937502],[78.15849609375002,34.94648437499998],[78.32695312500007,34.60639648437498],[78.86484375000006,34.39033203125001],[78.93642578125,34.35195312500002],[78.97060546875011,34.22822265625004],[78.72666015625006,34.013378906249955],[78.78378906250006,33.80878906250004],[78.86503906250002,33.43110351562501],[78.94843750000004,33.346533203125006],[79.1125,33.22626953125001],[79.13515625000005,33.17192382812496],[79.10283203125007,33.05253906249996],[79.14550781250003,33.00146484375006],[79.16992187500003,32.497216796874994],[78.91894531249997,32.3582031250001],[78.75351562500012,32.49926757812506],[78.73671875,32.55839843750002],[78.38964843749997,32.51987304687498],[78.41748046874997,32.466699218749994],[78.4552734375001,32.30034179687502],[78.49589843750002,32.21577148437504],[78.72558593750009,31.983789062500023],[78.71972656250009,31.887646484374983]]]]},"properties":{"name":"India","childNum":7}},{"geometry":{"type":"Polygon","coordinates":[[[72.49199218750002,-7.37744140625],[72.42910156250002,-7.435351562500003],[72.34970703125,-7.263378906250011],[72.447265625,-7.395703125000011],[72.44560546875002,-7.220410156250011],[72.49199218750002,-7.37744140625]]]},"properties":{"name":"Br. Indian Ocean Ter.","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-9.948193359374926,53.91313476562499],[-10.265722656249949,53.977685546874994],[-9.99638671874996,54.00361328125004],[-9.948193359374926,53.91313476562499]]],[[[-6.218017578125,54.08872070312506],[-6.347607421874926,53.94130859375005],[-6.027392578124989,52.927099609375006],[-6.463183593749932,52.345361328124994],[-6.325,52.246679687500034],[-6.890234375,52.15922851562499],[-6.965771484374926,52.24951171875],[-8.057812499999926,51.82558593750005],[-8.4091796875,51.888769531250034],[-8.349121093749943,51.73930664062496],[-8.813427734374926,51.584912109374955],[-9.737304687499943,51.473730468750034],[-9.524902343750028,51.68110351562501],[-10.120751953124994,51.60068359375006],[-9.598828124999983,51.87441406250005],[-10.341064453124943,51.798925781250034],[-9.909667968749972,52.122949218749966],[-10.39023437499992,52.134912109374994],[-10.356689453125,52.20693359375002],[-9.772119140624937,52.250097656250034],[-9.90605468749996,52.403710937499966],[-9.632226562499937,52.54692382812502],[-8.783447265624943,52.679638671874955],[-8.990283203124989,52.755419921875045],[-9.175390624999949,52.634912109374994],[-9.916601562499977,52.56972656250005],[-9.46489257812496,52.82319335937498],[-9.299218749999966,53.09755859375002],[-8.930126953124983,53.207080078125045],[-9.51420898437496,53.23823242187498],[-10.091259765624926,53.41284179687503],[-10.116992187499932,53.548535156249955],[-9.720654296874926,53.6044921875],[-9.901611328124943,53.72719726562502],[-9.578222656249949,53.80541992187497],[-9.578857421875,53.879833984374955],[-9.9140625,53.863720703124955],[-9.856445312499972,54.095361328124994],[-10.092675781249966,54.15576171875003],[-10.056396484374943,54.25781250000006],[-8.545556640624994,54.24121093750003],[-8.623144531249977,54.346875],[-8.133447265624966,54.64082031250001],[-8.763916015624972,54.68120117187496],[-8.377294921874977,54.88945312500002],[-8.274609374999955,55.146289062500045],[-7.667089843749977,55.25649414062502],[-7.65874023437496,54.97094726562503],[-7.308789062500011,55.365820312500006],[-6.961669921874972,55.23789062500006],[-7.218652343749937,55.09199218749998],[-7.55039062499992,54.767968749999966],[-7.910595703124955,54.698339843750006],[-7.75439453125,54.59492187499998],[-8.118261718749977,54.41425781250004],[-7.606542968750006,54.14384765625002],[-7.324511718750017,54.13344726562502],[-7.007714843749937,54.40668945312501],[-6.649804687499937,54.05864257812496],[-6.218017578125,54.08872070312506]]]]},"properties":{"name":"Ireland","childNum":2}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[56.18798828125003,26.92114257812497],[55.95429687500004,26.70112304687501],[55.31152343749997,26.592626953125006],[55.76259765625005,26.81196289062504],[55.75761718750002,26.94765625000005],[56.279394531250006,26.952099609374983],[56.18798828125003,26.92114257812497]]],[[[46.1144531250001,38.877783203125034],[46.490625,38.90668945312498],[47.995898437500074,39.683935546875034],[48.322167968749994,39.39907226562502],[48.10439453125005,39.241113281249994],[48.292089843750006,39.01884765624999],[47.99648437499999,38.85375976562503],[48.59267578125005,38.41108398437498],[48.86875,38.43549804687498],[48.95996093750003,37.89013671875],[49.171191406250074,37.60058593749997],[50.13046875,37.407128906249994],[50.53320312499997,37.01367187500006],[51.11855468750005,36.742578124999966],[52.19013671875004,36.62172851562505],[53.76767578125006,36.93032226562502],[53.91542968750005,36.93032226562502],[53.67949218750002,36.853125],[53.970117187499994,36.818310546874955],[53.91416015625006,37.34355468750002],[54.6994140625001,37.47016601562498],[54.90009765625004,37.77792968750006],[55.38085937500003,38.051123046875034],[56.272070312500006,38.080419921875034],[56.440625,38.249414062499994],[57.1935546875001,38.216406250000034],[57.35371093750004,37.97333984374998],[58.261621093749994,37.665820312500045],[58.81542968750003,37.683496093749994],[59.30175781249997,37.51064453125005],[59.454980468749994,37.25283203125002],[60.06279296875002,36.962890625],[60.34130859375003,36.63764648437501],[61.11962890625003,36.64257812500003],[61.212011718750006,36.190527343750034],[61.15292968750006,35.97675781250001],[61.25214843750004,35.86762695312498],[61.26201171875002,35.61958007812498],[61.28183593750006,35.55341796875001],[61.2785156250001,35.513769531250006],[61.245507812499994,35.47407226562501],[61.18925781250002,35.31201171875003],[61.1,35.272314453125034],[61.08007812499997,34.85561523437505],[60.95117187499997,34.65385742187499],[60.91474609375004,34.63398437500001],[60.80234375000006,34.55463867187501],[60.73945312500004,34.544726562500045],[60.7262695312501,34.51826171874998],[60.736132812500074,34.491796875],[60.76259765625005,34.475244140624994],[60.88945312500002,34.31943359375006],[60.642675781250006,34.30717773437496],[60.48574218750005,34.09477539062502],[60.4859375,33.7119140625],[60.57382812500006,33.58833007812498],[60.91699218749997,33.505224609375006],[60.56054687499997,33.13784179687502],[60.5765625,32.99487304687503],[60.71044921874997,32.6],[60.82929687500004,32.24941406250005],[60.82724609375006,32.16796874999997],[60.789941406249994,31.98710937499999],[60.7875,31.87719726562497],[60.791601562500006,31.660595703124983],[60.82070312499999,31.495166015625045],[60.854101562500006,31.483251953125006],[61.110742187499994,31.45112304687504],[61.346484375000074,31.42163085937497],[61.66015625000003,31.382421874999977],[61.7550781250001,31.285302734374994],[61.814257812500074,31.072558593750017],[61.810839843750074,30.913281249999983],[61.78417968749997,30.831933593750023],[61.55947265625005,30.59936523437497],[61.33164062500006,30.36372070312501],[60.84335937500006,29.85869140624999],[61.03417968750003,29.663427734374977],[61.15214843750002,29.542724609375],[61.8898437500001,28.546533203124994],[62.7625,28.202050781249994],[62.782324218750006,27.800537109375],[62.75273437500002,27.265625],[63.16679687500002,27.25249023437499],[63.19609375000002,27.243945312500017],[63.25625,27.20791015625005],[63.30156250000002,27.151464843750006],[63.30517578124997,27.124560546875017],[63.242089843749994,27.07768554687499],[63.25039062499999,26.879248046875063],[63.24160156250005,26.86474609375003],[63.18613281250006,26.83759765625001],[63.168066406250006,26.66557617187496],[62.31230468750002,26.490869140624994],[62.23935546875006,26.357031249999977],[62.12597656249997,26.368994140625034],[61.842382812500006,26.225927734375006],[61.809960937499994,26.165283203125],[61.78076171874997,25.99584960937503],[61.75439453125003,25.843359375000063],[61.737695312499994,25.821093750000045],[61.66865234375004,25.76899414062501],[61.6618164062501,25.751269531250017],[61.67138671874997,25.69238281250003],[61.64013671875003,25.584619140624994],[61.61542968750004,25.28613281250003],[61.58789062499997,25.20234375000001],[61.533105468749994,25.195507812499955],[61.41220703125006,25.102099609375017],[60.66386718750002,25.28222656250003],[60.51054687500002,25.437060546875045],[60.40019531250002,25.311572265625074],[59.45605468749997,25.481494140625045],[59.0460937500001,25.417285156250017],[58.79785156249997,25.554589843750023],[57.334570312500006,25.791552734375074],[57.03603515625005,26.80068359375005],[56.728125,27.127685546875057],[56.118066406249994,27.14311523437499],[54.75927734375003,26.50507812500004],[54.24707031250003,26.696630859374977],[53.70576171875004,26.72558593750003],[52.69160156250004,27.323388671875023],[52.475878906250074,27.61650390624999],[52.03076171874997,27.824414062499955],[51.58906250000004,27.864208984374983],[51.27890625,28.13134765624997],[51.06201171874997,28.72612304687499],[50.86699218750002,28.870166015625017],[50.87578125000002,29.062695312499983],[50.67519531250005,29.146582031250034],[50.64960937500004,29.420068359374966],[50.16894531250003,29.921240234375034],[50.071582031250074,30.198535156250017],[49.55488281250004,30.028955078125023],[49.028125,30.333447265624983],[49.224511718749994,30.472314453125023],[49.00195312500003,30.506542968749983],[48.91914062500004,30.120898437500017],[48.54648437500006,29.962353515624955],[48.47851562499997,30.003808593749966],[48.43457031249997,30.03759765625],[48.33105468749997,30.28544921874996],[48.01494140625002,30.465625],[48.01064453125005,30.989794921875017],[47.679492187500074,31.00239257812501],[47.679492187500074,31.400585937499955],[47.75390624999997,31.601367187500017],[47.829980468749994,31.79443359375],[47.71455078125004,31.936425781249966],[47.5915039062501,32.087988281250034],[47.51191406250004,32.15083007812504],[47.3297851562501,32.45551757812501],[47.28515625000003,32.474023437499966],[47.121386718750074,32.46660156249996],[46.569921875,32.83393554687501],[46.37705078125006,32.92924804687499],[46.29824218750005,32.95024414062502],[46.11279296875003,32.957666015624994],[46.09306640625002,32.97587890624999],[46.08046875,33.028222656249994],[46.0807617187501,33.08652343750006],[46.14111328125003,33.174414062500034],[46.145898437499994,33.229638671874994],[46.01992187500005,33.41572265624998],[45.39707031250006,33.970849609374994],[45.542773437500074,34.21552734375004],[45.459375,34.470361328124994],[45.50078125000002,34.58159179687499],[45.6375,34.573828125],[45.678125,34.798437500000034],[45.92089843750003,35.02851562500001],[46.04179687500002,35.08017578125006],[46.13378906249997,35.127636718749955],[46.15468750000005,35.19672851562498],[46.112109375000074,35.32167968750005],[45.97109375000005,35.524169921875],[46.03740234375002,35.67314453124999],[46.180957031250074,35.71137695312504],[46.2625,35.74414062500006],[46.27343749999997,35.77324218750002],[46.16748046874997,35.820556640625],[45.77636718749997,35.82182617187499],[45.36162109375002,36.015332031249955],[45.241113281249994,36.35595703125],[45.20654296874997,36.397167968749955],[45.15527343749997,36.407373046874994],[45.11240234375006,36.409277343750034],[45.053125,36.47163085937501],[44.76513671875003,37.142431640625006],[44.79414062500004,37.290380859375034],[44.574023437500074,37.435400390625006],[44.589941406250006,37.710351562499966],[44.21132812499999,37.908056640625006],[44.4499023437501,38.33422851562506],[44.2985351562501,38.38627929687499],[44.27167968750004,38.83603515625006],[44.02324218750002,39.37744140625006],[44.3893554687501,39.422119140625],[44.58710937500004,39.76855468750006],[44.81718750000002,39.65043945312496],[45.4796875000001,39.00625],[46.1144531250001,38.877783203125034]]]]},"properties":{"name":"Iran","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[45.6375,34.573828125],[45.50078125000002,34.581591796874996],[45.459375,34.470361328124994],[45.54277343750002,34.21552734375],[45.397070312500006,33.970849609374994],[46.01992187500002,33.41572265625],[46.14589843750002,33.229638671874994],[46.14111328125,33.1744140625],[46.08076171875001,33.0865234375],[46.08046875000002,33.028222656249994],[46.09306640625002,32.975878906249996],[46.11279296875,32.957666015624994],[46.377050781250006,32.929248046874996],[46.569921875,32.833935546875],[47.12138671875002,32.466601562499996],[47.28515625,32.474023437499994],[47.32978515625001,32.455517578125],[47.51191406250001,32.150830078125],[47.59150390625001,32.08798828125],[47.71455078125001,31.936425781249994],[47.82998046875002,31.79443359375],[47.75390625,31.601367187499996],[47.67949218750002,31.400585937499997],[47.67949218750002,31.002392578124997],[48.01064453125002,30.989794921874996],[48.01494140625002,30.465625],[48.3310546875,30.285449218749996],[48.546484375,29.962353515624997],[48.454199218750006,29.9384765625],[48.354589843750006,29.956738281249997],[48.141699218750006,30.040917968749994],[47.982519531250006,30.011328125],[47.97871093750001,29.9828125],[47.64375,30.097314453124994],[47.14824218750002,30.0009765625],[46.905859375,29.5375],[46.76933593750002,29.347460937499996],[46.69375,29.259667968749994],[46.53144531250001,29.096240234374996],[46.3564453125,29.063671875],[44.71650390625001,29.193603515625],[43.77373046875002,29.84921875],[42.07441406250001,31.080371093749996],[40.47890625000002,31.893359375],[40.36933593750001,31.93896484375],[40.02783203125,31.995019531249994],[39.7041015625,32.042529296874996],[39.14541015625002,32.12451171875],[39.29277343750002,32.24384765625],[39.24746093750002,32.350976562499994],[39.04140625000002,32.3056640625],[38.773535156250006,33.372216796874994],[40.98701171875001,34.429052734375],[41.19472656250002,34.768994140625],[41.354101562500006,35.640429687499996],[41.295996093750006,36.383349609374996],[41.41679687500002,36.5146484375],[41.78857421875,36.59716796875],[42.358984375,37.10859375],[42.45585937500002,37.128710937499996],[42.63544921875001,37.249267578125],[42.74111328125002,37.3619140625],[42.77460937500001,37.371875],[42.869140625,37.334912109375],[42.936621093750006,37.324755859374996],[43.09248046875001,37.3673828125],[43.67578125,37.22724609375],[43.83642578125,37.223535156249994],[44.01318359375,37.313525390624996],[44.11445312500001,37.30185546875],[44.15625,37.282958984375],[44.19179687500002,37.249853515625],[44.20839843750002,37.20263671875],[44.20166015625,37.051806640624996],[44.281835937500006,36.97802734375],[44.32558593750002,37.0107421875],[44.401953125,37.058496093749994],[44.60595703125,37.176025390625],[44.66933593750002,37.173583984375],[44.73095703125,37.165283203125],[44.76513671875,37.142431640625],[45.053125,36.471630859375],[45.112402343750006,36.40927734375],[45.1552734375,36.407373046874994],[45.20654296875,36.39716796875],[45.24111328125002,36.35595703125],[45.36162109375002,36.01533203125],[45.7763671875,35.821826171874996],[46.16748046875,35.820556640625],[46.2734375,35.773242187499996],[46.2625,35.744140625],[46.18095703125002,35.711376953125],[46.03740234375002,35.673144531249996],[45.97109375000002,35.524169921875],[46.11210937500002,35.321679687499994],[46.15468750000002,35.196728515625],[46.1337890625,35.12763671875],[46.04179687500002,35.08017578125],[45.9208984375,35.028515625],[45.678125,34.7984375],[45.6375,34.573828125]]]},"properties":{"name":"Iraq","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-15.543115234374994,66.228515625],[-14.595849609374994,66.38154296875],[-15.117382812499983,66.125634765625],[-14.698193359374983,66.02021484375],[-14.827099609374983,65.7642578125],[-14.391845703125,65.78740234375],[-14.473388671875,65.575341796875],[-14.166943359374983,65.64228515625],[-13.617871093749983,65.5193359375],[-13.804785156249977,65.35478515625],[-13.599316406249983,65.0359375],[-14.04443359375,64.74189453125],[-14.385107421874977,64.74521484375],[-14.475390624999989,64.493994140625],[-14.927392578124994,64.319677734375],[-15.832910156249994,64.17666015625],[-16.640332031249983,63.865478515625],[-17.81572265624999,63.71298828125],[-17.946923828124994,63.5357421875],[-18.65361328124999,63.406689453125],[-20.198144531249994,63.555810546874994],[-20.494042968749994,63.687353515625],[-20.413964843749994,63.80517578125],[-20.65092773437499,63.73740234375],[-21.15239257812499,63.94453125],[-22.652197265624977,63.827734375],[-22.701171875,64.083203125],[-22.51005859374999,63.991455078125],[-22.187597656249977,64.039208984375],[-21.463330078124983,64.379150390625],[-22.053369140624994,64.313916015625],[-21.950341796874994,64.514990234375],[-21.590625,64.6263671875],[-22.10600585937499,64.533056640625],[-22.467041015625,64.794970703125],[-23.818994140624994,64.73916015625],[-24.02617187499999,64.863427734375],[-22.7880859375,65.046484375],[-21.89213867187499,65.048779296875],[-21.779980468749983,65.1876953125],[-22.50908203124999,65.19677734375],[-21.844384765624994,65.44736328125],[-22.902490234374994,65.58046875],[-23.89990234375,65.407568359375],[-24.475683593749977,65.5251953125],[-24.248925781249994,65.614990234375],[-23.85673828124999,65.53837890625],[-24.092626953124977,65.77646484375],[-23.615917968749983,65.67958984375],[-23.285351562499983,65.75],[-23.832617187499977,65.84921875],[-23.52495117187499,65.880029296875],[-23.77734375,66.017578125],[-23.434472656249994,66.02421875],[-23.452539062499994,66.181005859375],[-23.018994140624983,65.98212890625],[-22.659863281249983,66.025927734375],[-22.61601562499999,65.86748046875],[-22.44169921874999,65.90830078125],[-22.4453125,66.07001953125],[-22.947900390624994,66.212744140625],[-22.48442382812499,66.26630859375],[-23.116943359375,66.338720703125],[-22.9443359375,66.429443359375],[-22.426123046874977,66.430126953125],[-21.406884765624994,66.0255859375],[-21.374902343749994,65.74189453125],[-21.658447265625,65.723583984375],[-21.12968749999999,65.2666015625],[-20.804345703124994,65.63642578125],[-20.454833984375,65.571044921875],[-20.20751953125,66.10009765625],[-19.489697265624983,65.76806640625],[-19.382958984374994,66.07568359375],[-18.845898437499983,66.183935546875],[-18.141943359374977,65.73408203125],[-18.29716796874999,66.157421875],[-17.906982421875,66.143310546875],[-17.550439453124994,65.964404296875],[-17.153027343749983,66.20283203125],[-16.838037109374994,66.125244140625],[-16.485009765624994,66.195947265625],[-16.540673828124994,66.446728515625],[-16.24931640624999,66.522900390625],[-15.985400390624989,66.5146484375],[-15.543115234374994,66.228515625]]]},"properties":{"name":"Iceland","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[35.78730468750001,32.734912109374996],[35.572851562500006,32.640869140625],[35.56904296875001,32.619873046875],[35.55146484375001,32.3955078125],[35.484375,32.401660156249996],[35.40263671875002,32.450634765625],[35.38671875,32.493017578125],[35.303808593750006,32.512939453125],[35.19326171875002,32.534423828125],[35.065039062500006,32.46044921875],[35.01054687500002,32.338183593749996],[34.95595703125002,32.1609375],[34.98974609375,31.91328125],[34.97832031250002,31.86640625],[34.95380859375001,31.841259765624997],[34.96113281250001,31.82333984375],[34.983007812500006,31.81679687499999],[35.05322265625,31.837939453124996],[35.12714843750001,31.816748046875],[35.203710937500006,31.75],[34.95097656250002,31.602294921875],[34.88046875,31.3681640625],[35.45058593750002,31.479296875],[34.97343750000002,29.555029296875],[34.904296875,29.47734375],[34.24531250000001,31.208300781249996],[34.34833984375001,31.292919921874997],[34.350195312500006,31.362744140624997],[34.52558593750001,31.525634765625],[34.47734375000002,31.584863281249994],[34.483984375,31.59228515625],[34.67841796875001,31.895703125],[35.10859375000001,33.08369140625],[35.411230468750006,33.07568359375],[35.869140625,33.43173828125],[35.91347656250002,32.94960937499999],[35.78730468750001,32.734912109374996]]]},"properties":{"name":"Israel","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[15.576562500000051,38.220312500000034],[15.099511718750023,37.45859375],[15.295703125000017,37.05517578124997],[15.112597656250017,36.687841796875006],[14.501855468750023,36.798681640625034],[14.142968750000023,37.103662109374994],[13.90546875000004,37.10063476562502],[13.169921875000028,37.47929687499996],[12.640234375000034,37.594335937500034],[12.435546874999972,37.819775390624955],[12.734375,38.18305664062498],[12.902734375000023,38.03486328124998],[13.291113281250034,38.19145507812502],[13.788867187499989,37.981201171875],[15.11875,38.15273437500002],[15.498730468750011,38.290869140625006],[15.576562500000051,38.220312500000034]]],[[[8.478906250000023,39.067529296874966],[8.421484375000034,38.968652343749994],[8.366796875,39.115917968749955],[8.478906250000023,39.067529296874966]]],[[[8.28603515625008,41.03984375],[8.205664062500034,40.99746093750005],[8.320214843750023,41.121875],[8.28603515625008,41.03984375]]],[[[9.632031250000011,40.88203124999998],[9.805273437500063,40.499560546875045],[9.642968750000023,40.268408203125006],[9.5625,39.16601562500006],[9.056347656250068,39.23916015625002],[8.966601562500074,38.963720703125034],[8.648535156250034,38.92656250000002],[8.418164062500068,39.205712890624966],[8.547753906250023,39.83920898437506],[8.4078125,39.91723632812497],[8.471289062500063,40.29267578124998],[8.189941406250028,40.651611328125],[8.22421875,40.91333007812503],[8.571875,40.85019531250006],[9.228417968750023,41.257080078125],[9.615332031249977,41.01728515624998],[9.632031250000011,40.88203124999998]]],[[[10.395117187500034,42.85815429687503],[10.419335937499994,42.71318359374999],[10.13125,42.742041015625006],[10.395117187500034,42.85815429687503]]],[[[13.420996093750006,46.212304687499994],[13.63251953125004,46.17705078125002],[13.634960937499983,46.15776367187499],[13.61660156250008,46.133105468750045],[13.54804687500004,46.08911132812503],[13.486425781250034,46.03955078124997],[13.480273437500017,46.00922851562501],[13.487695312500023,45.987109375000045],[13.509179687500051,45.973779296874994],[13.6005859375,45.97978515624996],[13.663476562500023,45.7919921875],[13.831152343750006,45.680419921875],[13.719824218750063,45.58759765625001],[13.628320312500051,45.77094726562498],[13.206347656250074,45.771386718749966],[12.27431640625008,45.44604492187503],[12.225683593750034,45.24150390625002],[12.523437500000028,44.96796874999998],[12.248339843750045,44.72250976562498],[12.396289062500074,44.223876953125],[13.56416015625004,43.57128906250003],[14.010449218750011,42.68955078125006],[14.54072265625004,42.24428710937502],[15.16875,41.93403320312498],[16.164648437500034,41.89619140624998],[15.900488281250034,41.51206054687498],[17.954980468749994,40.65517578125002],[18.460644531249983,40.221044921875034],[18.34375,39.82138671874998],[18.077929687500017,39.93696289062498],[17.865039062500074,40.28017578125002],[17.395800781250045,40.34023437499999],[17.179980468750045,40.50278320312498],[16.92822265625,40.45805664062502],[16.521875,39.74755859375003],[17.114550781250017,39.38061523437497],[17.174609375000017,38.998095703125045],[16.61669921875003,38.800146484375034],[16.54560546875001,38.40908203125002],[16.05683593750001,37.941845703124955],[15.72451171875008,37.93911132812502],[15.645800781250017,38.034228515625045],[15.87890625,38.61391601562502],[16.19677734375,38.759228515624955],[16.20996093750003,38.94111328124998],[15.692773437499994,39.99018554687501],[14.95087890625004,40.23901367187497],[14.94765625000008,40.469335937500006],[14.765722656250063,40.66840820312498],[14.339941406250006,40.59882812500001],[14.460546875000063,40.72871093750001],[14.04433593750008,40.81225585937506],[13.733398437500057,41.23564453124999],[13.088671875000074,41.243847656249955],[12.630859374999972,41.469677734374955],[11.637304687500063,42.287548828124955],[11.141210937499977,42.38989257812503],[11.167773437500074,42.53515625000006],[10.708398437500023,42.93632812499999],[10.514843750000011,42.96752929687503],[10.188085937500063,43.947509765625],[8.76582031250004,44.42231445312501],[8.004980468750006,43.87675781249999],[7.4931640625,43.767138671875045],[7.637207031250057,44.16484375],[7.318554687500068,44.13798828125002],[6.900195312499989,44.33574218749996],[6.99267578125,44.82729492187502],[6.634765625000028,45.06816406249996],[7.07832031250004,45.23994140624998],[7.146386718750051,45.381738281249994],[6.790917968750023,45.740869140624966],[7.021093750000034,45.92578124999997],[7.055761718749977,45.90380859375003],[7.129003906249977,45.88041992187499],[7.327929687500017,45.912353515625],[7.9931640625,46.01591796874996],[8.081542968750057,46.25600585937502],[8.231933593750057,46.341210937499966],[8.29853515625004,46.403417968750034],[8.370703125,46.44511718750002],[8.458398437500023,46.24589843750002],[8.818554687500011,46.0771484375],[8.826757812500006,46.06103515625],[8.77802734375004,45.996191406250034],[8.953710937500034,45.83002929687501],[9.023730468750074,45.845703125],[9.203417968750017,46.21923828125],[9.304394531250068,46.49555664062498],[9.399316406250023,46.480664062499955],[9.427636718750023,46.48232421875002],[9.528710937500023,46.306201171875045],[9.57958984375,46.29609375000001],[9.639453125000017,46.29589843749997],[9.78779296875004,46.34604492187498],[9.884472656250011,46.36777343750006],[9.939257812500074,46.36181640625],[10.041015625000028,46.23808593750002],[10.08056640625,46.22797851562501],[10.128320312500051,46.238232421874955],[10.109667968750074,46.36284179687502],[10.081933593750023,46.420751953125006],[10.045605468750068,46.44790039062505],[10.038281250000011,46.483203125000045],[10.061230468750068,46.54677734375002],[10.087011718750063,46.59990234375002],[10.1375,46.614355468750034],[10.195507812500068,46.62109374999997],[10.4306640625,46.55004882812497],[10.438281250000045,46.618847656249955],[10.39794921875,46.66503906250006],[10.406054687500045,46.73486328124997],[10.452832031249983,46.86494140625001],[10.47939453125008,46.85512695312505],[10.579785156250011,46.85371093750001],[10.689257812500017,46.846386718749955],[10.759765625,46.79331054687498],[10.828906250000045,46.775244140625034],[10.927343750000034,46.76948242187501],[10.993261718750034,46.77700195312502],[11.02509765625004,46.796972656250006],[11.063476562500057,46.85913085937497],[11.133886718750006,46.93618164062505],[11.244433593750045,46.975683593750006],[11.433203125000063,46.983056640624994],[11.527539062500011,46.99741210937498],[11.775683593750017,46.986083984375],[12.169433593750028,47.082128906250006],[12.19716796875008,47.075],[12.201269531250034,47.060888671875034],[12.165527343750028,47.028173828125034],[12.130761718750051,46.98476562499999],[12.154101562500017,46.93525390625004],[12.267968750000023,46.83588867187504],[12.330078125,46.75981445312499],[12.388281250000034,46.70263671874997],[12.479199218749983,46.672509765624966],[13.16875,46.572656249999966],[13.3515625,46.55791015624999],[13.490039062500045,46.55556640625002],[13.7,46.52026367187503],[13.679687500000057,46.46289062499997],[13.63710937500008,46.44853515624999],[13.563281250000045,46.41508789062502],[13.399511718749977,46.31752929687502],[13.420996093750006,46.212304687499994]]]]},"properties":{"name":"Italy","childNum":6}},{"geometry":{"type":"Polygon","coordinates":[[[-77.261474609375,18.45742187499999],[-76.349853515625,18.15185546875],[-76.21079101562499,17.913525390624997],[-76.524609375,17.8662109375],[-76.85322265625,17.97373046874999],[-76.94414062499999,17.848779296874994],[-77.11948242187499,17.880078125],[-77.20498046875,17.71494140624999],[-77.36142578124999,17.833691406249997],[-77.76816406249999,17.877392578124997],[-78.04448242187499,18.173828125],[-78.339501953125,18.28720703124999],[-78.21669921875,18.44809570312499],[-77.8734375,18.522216796875],[-77.261474609375,18.45742187499999]]]},"properties":{"name":"Jamaica","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-2.018652343749977,49.23125],[-2.23583984375,49.1763671875],[-2.220507812499989,49.266357421875],[-2.018652343749977,49.23125]]]},"properties":{"name":"Jersey","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[39.14541015625002,32.12451171875],[38.9970703125,32.007470703124994],[38.96230468750002,31.994921875],[38.37548828125,31.847460937499996],[38.111425781250006,31.781152343749994],[37.49335937500001,31.625878906249994],[37.215625,31.556103515624997],[36.95859375,31.491503906249996],[37.980078125,30.5],[37.862890625,30.442626953125],[37.66972656250002,30.34814453125],[37.64990234375,30.330957031249994],[37.63359375000002,30.31328125],[37.55361328125002,30.144580078124996],[37.49072265625,30.01171875],[37.46923828125,29.995068359374997],[36.75527343750002,29.866015625],[36.70390625000002,29.831640625],[36.591796875,29.66611328125],[36.47607421875,29.4951171875],[36.2828125,29.355371093749994],[36.068457031250006,29.200537109375],[34.95078125,29.353515625],[34.97343750000002,29.555029296875],[35.45058593750002,31.479296875],[35.57207031250002,32.237890625],[35.55146484375001,32.3955078125],[35.56904296875001,32.619873046875],[35.572851562500006,32.640869140625],[35.78730468750001,32.734912109374996],[36.3720703125,32.3869140625],[36.818359375,32.317285156249994],[38.773535156250006,33.372216796874994],[39.04140625000002,32.3056640625],[39.24746093750002,32.350976562499994],[39.29277343750002,32.24384765625],[39.14541015625002,32.12451171875]]]},"properties":{"name":"Jordan","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[123.88867187499997,24.280126953124977],[123.67978515625012,24.317773437500023],[123.77148437499997,24.41445312499999],[123.93486328125002,24.362011718749983],[123.88867187499997,24.280126953124977]]],[[[124.29316406250004,24.515917968750074],[124.13574218750003,24.347607421874983],[124.08476562500002,24.435839843750017],[124.30195312500004,24.58710937500001],[124.29316406250004,24.515917968750074]]],[[[125.44414062500002,24.7431640625],[125.26894531250005,24.732519531250063],[125.28359375,24.871923828125034],[125.44414062500002,24.7431640625]]],[[[128.25878906249997,26.65278320312501],[127.86708984375,26.442480468749977],[127.80361328125005,26.152539062499983],[127.653125,26.0947265625],[127.90722656250003,26.69360351562497],[128.09765624999997,26.66777343749996],[128.25488281249997,26.88188476562496],[128.25878906249997,26.65278320312501]]],[[[128.99814453125012,27.720800781250006],[128.90000000000012,27.727783203125],[128.9076171875,27.897998046875045],[128.99814453125012,27.720800781250006]]],[[[129.45253906250005,28.20898437499997],[129.3664062500001,28.127734375000045],[129.16464843750012,28.24975585937503],[129.68955078125012,28.517480468750023],[129.45253906250005,28.20898437499997]]],[[[130.6227539062501,30.262988281250017],[130.44560546875002,30.264697265625017],[130.38808593750005,30.38818359375003],[130.49716796875006,30.465527343749983],[130.64355468749997,30.388964843750017],[130.6227539062501,30.262988281250017]]],[[[130.95976562500007,30.39692382812504],[130.87031250000004,30.444238281249994],[131.06035156250007,30.828466796875006],[130.95976562500007,30.39692382812504]]],[[[130.38105468750004,32.42373046875002],[130.24169921874997,32.462792968749994],[130.46142578124997,32.515722656250034],[130.38105468750004,32.42373046875002]]],[[[130.08251953124997,32.22968750000001],[129.9601562500001,32.24375],[130.00976562499997,32.521630859374994],[130.16777343750002,32.54121093749998],[130.19951171875002,32.34057617187506],[130.08251953124997,32.22968750000001]]],[[[128.66533203125002,32.783886718749955],[128.89453124999997,32.65214843750002],[128.69296875000012,32.60473632812506],[128.66533203125002,32.783886718749955]]],[[[129.07695312500002,32.84028320312498],[128.99726562500004,32.95185546874998],[129.10976562500005,33.13256835937503],[129.18193359375002,32.99311523437504],[129.07695312500002,32.84028320312498]]],[[[129.49179687500006,33.22304687499999],[129.37041015625002,33.176025390625],[129.56992187500006,33.36103515625004],[129.49179687500006,33.22304687499999]]],[[[129.79570312500007,33.74882812499999],[129.67480468749997,33.73969726562498],[129.71728515624997,33.8583984375],[129.79570312500007,33.74882812499999]]],[[[131.17460937500007,33.602587890625045],[131.69628906250003,33.60283203124999],[131.53740234375007,33.274072265624994],[131.89658203125006,33.25458984375001],[131.8478515625001,33.118066406249994],[132.0021484375001,32.882373046875045],[131.6603515625001,32.465625],[131.33720703125007,31.4046875],[131.07080078124997,31.436865234374977],[131.09843750000002,31.256152343750017],[130.68574218750004,31.01513671875003],[130.77626953125,31.70629882812497],[130.65507812500002,31.71840820312505],[130.5560546875,31.563085937500034],[130.58876953125,31.178515625000017],[130.20068359374997,31.291894531250023],[130.14726562500002,31.40849609374996],[130.2941406250001,31.45068359375003],[130.3219726562501,31.601464843750023],[130.18789062500005,31.768847656250017],[130.19443359375012,32.090771484374955],[130.64052734375005,32.61923828124998],[130.49785156250002,32.65693359375001],[130.547265625,32.83159179687499],[130.2375,33.177636718749966],[130.12685546875005,33.10483398437506],[130.175,32.851318359375],[130.32646484375002,32.852636718750006],[130.34042968750012,32.70185546875004],[130.05410156250005,32.770800781250045],[129.76855468749997,32.57099609375001],[129.82675781250006,32.72534179687503],[129.67910156250005,33.059960937499966],[129.99169921875003,32.85156249999997],[129.58007812500003,33.23627929687501],[129.61015625000002,33.34365234375005],[129.844140625,33.32177734375003],[129.82568359374997,33.43701171875006],[130.36503906250007,33.634472656249955],[130.4837890625,33.834619140624966],[130.715625,33.92778320312502],[130.953125,33.87202148437504],[131.17460937500007,33.602587890625045]]],[[[132.266015625,33.945166015625006],[132.44492187500006,33.91318359374998],[132.20878906250007,33.87285156250002],[132.266015625,33.945166015625006]]],[[[129.27949218750004,34.123388671875006],[129.18642578125,34.14501953125006],[129.21484374999997,34.320654296875034],[129.3371093750001,34.284765625],[129.27949218750004,34.123388671875006]]],[[[134.35742187500003,34.25634765625],[134.6375,34.22661132812499],[134.73886718750012,33.82050781250001],[134.37705078125012,33.60839843749997],[134.18164062500003,33.24721679687502],[133.95869140625004,33.44833984375006],[133.63203125000004,33.51098632812503],[133.28593750000007,33.35996093749998],[132.97724609375004,32.84199218749998],[132.80429687500006,32.75200195312502],[132.6417968750001,32.76245117187503],[132.70898437500003,32.90249023437505],[132.49511718749997,32.91660156249998],[132.41279296875004,33.43046875],[132.0326171875,33.339990234374994],[132.64306640624997,33.68994140624997],[132.93515625000006,34.09531250000006],[133.19306640625004,33.93320312499998],[133.58203124999997,34.01713867187502],[133.60263671875006,34.24384765625001],[133.94833984375006,34.34804687500002],[134.35742187500003,34.25634765625]]],[[[134.35185546875002,34.48364257812503],[134.25185546875,34.42304687500004],[134.18212890625003,34.51923828124998],[134.35185546875002,34.48364257812503]]],[[[134.9328125000001,34.28813476562499],[134.82441406250004,34.202929687500045],[134.66787109375005,34.294140624999955],[135.00468750000002,34.54404296874998],[134.9328125000001,34.28813476562499]]],[[[129.38564453125,34.35366210937502],[129.26669921875012,34.37045898437506],[129.45107421875005,34.68657226562499],[129.38564453125,34.35366210937502]]],[[[133.37050781250005,36.203857421875],[133.23925781249997,36.178759765625045],[133.20615234375006,36.293408203124955],[133.29570312500002,36.34013671874996],[133.37050781250005,36.203857421875]]],[[[138.34404296875007,37.822119140625006],[138.22519531250006,37.82939453124996],[138.25,38.078466796875006],[138.50361328125004,38.31591796875006],[138.45361328124997,38.07568359375006],[138.57519531249997,38.065527343750034],[138.34404296875007,37.822119140625006]]],[[[141.22929687500007,41.37265625],[141.45546875000005,41.404736328124955],[141.43046875000002,40.72333984374998],[141.7970703125001,40.29116210937502],[141.97695312500005,39.428808593750034],[141.90078125,39.111328125],[141.5462890625,38.762841796874966],[141.4674804687501,38.404150390625006],[141.10839843750003,38.33793945312502],[140.9621093750001,38.148876953124955],[141.00166015625004,37.11464843750002],[140.57353515625007,36.23134765625002],[140.87402343749997,35.72495117187506],[140.457421875,35.51025390625],[140.35468750000004,35.18144531249999],[139.8439453125001,34.914892578125034],[139.82646484375002,35.29667968750002],[140.096875,35.58515624999998],[139.83476562500002,35.658056640625006],[139.65000000000012,35.40913085937501],[139.675,35.149267578125006],[139.47441406250002,35.298535156249955],[139.24941406250005,35.27802734375004],[139.08603515625006,34.83916015624999],[138.8375,34.619238281250034],[138.80273437499997,34.97480468749998],[138.90361328125002,35.02524414062506],[138.71962890625,35.12407226562502],[138.18906250000012,34.596337890624994],[137.543359375,34.66420898437505],[137.06171875000004,34.58281249999999],[137.27519531250002,34.77250976562499],[136.96328125000005,34.83491210937501],[136.87128906250004,34.733105468749955],[136.89707031250006,35.03554687500002],[136.80419921874997,35.05029296875],[136.53300781250007,34.678369140624994],[136.8802734375,34.43359375000006],[136.8537109375001,34.324072265625034],[136.32988281250007,34.17685546875006],[135.91621093750004,33.561718749999955],[135.69531250000003,33.48696289062502],[135.4528320312501,33.55336914062505],[135.12792968749997,34.006982421874994],[135.10009765624997,34.288378906250045],[135.41591796875,34.61748046875002],[134.74003906250007,34.765234375],[134.246875,34.71386718750003],[133.96826171874997,34.52729492187504],[133.14238281250002,34.30244140624998],[132.65654296875007,34.24609375000003],[132.31259765625006,34.32495117187503],[132.14648437499997,33.83876953125002],[131.74052734375007,34.05205078125002],[130.91884765625,33.97573242187502],[130.88925781250012,34.261816406250034],[131.00419921875007,34.39257812500003],[131.35439453125,34.41318359375006],[132.92294921875006,35.511279296875045],[133.98125,35.50722656250002],[135.17431640625003,35.74707031250003],[135.32695312500002,35.52553710937502],[135.68027343750006,35.503125],[135.903125,35.60688476562498],[136.09531250000006,35.767626953125045],[136.06748046875006,36.11684570312505],[136.69814453125005,36.742041015625034],[136.84345703125004,37.38212890624999],[137.32265625,37.52207031249998],[136.89990234375003,37.11767578125],[137.01669921875006,36.83720703124999],[137.24628906250004,36.753173828125],[137.5140625,36.95156250000002],[138.31992187500012,37.21840820312502],[138.88505859375007,37.84394531250001],[139.36386718750006,38.09902343750002],[139.80195312500004,38.881591796875],[140.06474609375002,39.624414062499994],[139.99472656250006,39.855078125],[139.74150390625002,39.92084960937498],[140.01113281250005,40.26035156250006],[139.92285156250003,40.59843750000002],[140.28125,40.84609375000002],[140.3444335937501,41.203320312499955],[140.62763671875004,41.195410156250034],[140.74863281250012,40.830322265625],[140.93603515625003,40.940771484375034],[141.1185546875,40.88227539062501],[141.24423828125006,41.20561523437499],[140.80058593750002,41.138818359374966],[140.80185546875012,41.253662109375],[140.9369140625,41.50556640624998],[141.22929687500007,41.37265625]]],[[[139.48125,42.08100585937498],[139.43134765625004,42.19956054687498],[139.55839843750002,42.235205078125034],[139.48125,42.08100585937498]]],[[[141.29541015625003,45.11933593750001],[141.14531250000002,45.153906250000034],[141.19375,45.24785156249999],[141.29541015625003,45.11933593750001]]],[[[141.07275390624997,45.33286132812498],[141.03398437500007,45.26933593750002],[140.97167968749997,45.465478515624994],[141.07275390624997,45.33286132812498]]],[[[143.82431640625012,44.11699218749999],[144.71523437500005,43.92797851562503],[145.36953125000005,44.32739257812506],[145.13964843750003,43.6625],[145.34082031249997,43.30253906249999],[145.83300781249997,43.38593750000001],[144.92138671874997,43.00092773437498],[143.96933593750006,42.88139648437499],[143.42949218750002,42.41889648437498],[143.2365234375001,42.000195312499955],[141.85136718750007,42.57905273437501],[141.40664062500005,42.54692382812496],[140.98613281250002,42.34213867187498],[140.70976562500002,42.555615234374955],[140.48046875000003,42.559375],[140.32666015625003,42.29335937499999],[141.15097656250012,41.80507812499999],[140.99951171874997,41.73740234375006],[140.65986328125004,41.815576171874994],[140.3849609375001,41.51928710937503],[140.08515625000004,41.43408203125],[139.99531250000004,41.57641601562503],[140.10839843749997,41.912939453125034],[139.83544921874997,42.278076171875],[139.86015625000002,42.58173828125004],[140.43222656250012,42.95410156250006],[140.39238281250002,43.303125],[141.13818359374997,43.17993164062506],[141.37412109375006,43.279638671875006],[141.7609375000001,44.482519531250034],[141.58300781250003,45.15595703125001],[141.66796874999997,45.401269531249966],[141.93769531250004,45.509521484375],[142.88476562499997,44.670117187499955],[143.82431640625012,44.11699218749999]]]]},"properties":{"name":"Japan","childNum":28}},{"geometry":{"type":"Polygon","coordinates":[[[77.04863281249999,35.109912109374996],[76.927734375,35.346630859375],[76.88222656250002,35.4357421875],[76.81279296874999,35.571826171874996],[76.76689453124999,35.66171875],[76.87890625,35.61328125],[77.09003906250001,35.552050781249996],[77.29482421875002,35.508154296875],[77.44648437500001,35.4755859375],[77.57255859374999,35.471826171874994],[77.72402343750002,35.48056640625],[77.79941406250003,35.495898437499996],[77.42343750000003,35.302587890625],[77.16855468750003,35.171533203124994],[77.04863281249999,35.109912109374996]]]},"properties":{"name":"Siachen Glacier","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[50.184472656249994,44.854638671874994],[49.99511718750003,44.93696289062498],[50.10986328124997,45.08193359375002],[50.038867187500074,44.949121093749966],[50.184472656249994,44.854638671874994]]],[[[87.32285156250012,49.085791015625006],[86.8083007812501,49.04970703125002],[86.54941406250012,48.52861328125002],[85.7494140625,48.38505859374999],[85.52597656250006,47.915625],[85.65664062500005,47.254638671875],[85.484765625,47.06352539062496],[84.78613281249997,46.83071289062505],[84.66660156250006,46.97236328125004],[84.016015625,46.97050781250002],[83.02949218750004,47.18593750000002],[82.31523437500002,45.59492187499998],[82.61162109375007,45.424267578124955],[82.52148437500003,45.12548828125],[82.26660156249997,45.21909179687498],[81.94492187500006,45.16083984375001],[81.69199218750012,45.34936523437497],[80.05917968750012,45.006445312500006],[79.871875,44.88378906249997],[80.48154296875006,44.71464843749999],[80.35527343750002,44.09726562500006],[80.78574218750006,43.16157226562504],[80.39023437500006,43.043115234374966],[80.53896484375005,42.873486328124955],[80.20224609375012,42.73447265624998],[80.209375,42.190039062500006],[80.07128906249997,42.302978515625],[79.92109375000004,42.41313476562496],[79.49013671875,42.45756835937496],[79.42822265624997,42.483496093750006],[79.20302734375005,42.66601562499997],[79.16484375000007,42.759033203125],[79.1266601562501,42.775732421875034],[76.98808593750007,42.97358398437501],[76.64648437500003,42.928808593750034],[76.50917968750005,42.91889648437498],[75.9322265625,42.92851562499999],[75.84033203125003,42.9375],[75.78955078124997,42.93291015624999],[75.68173828125,42.83046875],[75.04765625000007,42.904394531250034],[74.20908203125006,43.24038085937502],[73.88603515625002,43.132568359375],[73.55625,43.002783203125006],[73.45019531249997,42.703027343749966],[73.421875,42.59350585937503],[73.49296875000007,42.409033203125034],[73.41162109375003,42.41977539062498],[73.316015625,42.46699218750001],[73.2829101562501,42.50410156250004],[72.85507812500006,42.561132812500006],[72.75292968750003,42.63789062500001],[72.54316406250004,42.67773437500006],[72.27578125,42.757666015625006],[71.76054687500002,42.82148437500004],[71.5142578125,42.766943359375006],[71.42207031250004,42.78315429687504],[71.25664062500002,42.733544921874966],[70.89287109375007,42.339990234374994],[70.94677734374997,42.24868164062505],[69.15361328125002,41.42524414062498],[68.58408203125,40.876269531250045],[68.57265625,40.62265624999998],[68.29189453125,40.656103515625034],[68.04765625000007,40.80927734374998],[68.11308593750007,41.02861328124999],[67.9357421875001,41.19658203125002],[66.70966796875004,41.17915039062501],[66.49863281250006,41.99487304687503],[66.00957031250007,42.00488281250003],[66.1002929687501,42.99082031249998],[65.80302734375002,42.87695312500006],[65.49619140625,43.310546875],[64.9054687500001,43.714697265625006],[64.44316406250007,43.55117187499999],[63.20703125000003,43.62797851562502],[61.99023437500003,43.492138671874955],[61.007910156250006,44.39379882812497],[58.555273437500006,45.55537109375001],[55.97568359375006,44.99492187499996],[55.97744140625005,41.32221679687504],[55.434375,41.296289062499994],[54.85380859375002,41.965185546875006],[54.120996093749994,42.335205078125],[53.0558593750001,42.14775390624999],[52.4938476562501,41.780371093750034],[52.59658203125005,42.760156249999966],[51.898242187500074,42.86962890624997],[51.61601562500002,43.15844726562503],[51.29541015624997,43.17412109375002],[51.30175781249997,43.48237304687501],[50.8307617187501,44.192773437499966],[50.331152343750006,44.32548828125002],[50.25292968749997,44.461523437500006],[50.409472656250074,44.6240234375],[51.543554687500006,44.53100585937506],[51.009375,44.92182617187501],[51.4157226562501,45.35786132812501],[53.20039062500004,45.33198242187498],[52.77382812499999,45.57275390625],[53.13525390625003,46.19165039062497],[53.069433593750006,46.85605468750006],[52.48320312500002,46.99067382812504],[52.13828125,46.82861328124997],[51.178027343750074,47.110156250000045],[49.886328125,46.59565429687504],[49.347460937500074,46.51914062499998],[49.232226562500074,46.33715820312503],[48.54121093750004,46.60561523437502],[48.558398437500074,46.75712890624999],[48.959375,46.77460937499998],[48.16699218750003,47.70878906249996],[47.48193359374997,47.80390624999998],[47.292382812499994,47.74091796875004],[47.06464843750004,48.23247070312499],[46.660937500000074,48.41225585937502],[46.70263671875003,48.80556640625002],[47.031347656250006,49.150292968749994],[46.80205078125002,49.36708984375002],[46.889550781249994,49.69697265625001],[47.42919921874997,50.35795898437502],[47.7057617187501,50.37797851562502],[48.33496093750003,49.858251953125006],[48.7589843750001,49.92832031250006],[48.625097656250006,50.61269531250005],[49.32343750000004,50.851708984374966],[49.49804687500003,51.08359375000006],[50.246875,51.28950195312498],[50.79394531249997,51.729199218749955],[51.16347656250005,51.6474609375],[51.344531250000074,51.47534179687503],[52.21914062499999,51.709375],[52.57119140625005,51.481640624999955],[53.33808593750004,51.48237304687504],[54.139746093750006,51.04077148437503],[54.555273437500006,50.535791015624994],[54.64160156250003,51.011572265625034],[55.68623046875004,50.582861328125006],[56.49140625000004,51.01953124999997],[57.01171874999997,51.06518554687503],[57.44218750000002,50.88886718749998],[57.83886718750003,51.091650390625006],[58.359179687500074,51.063818359375034],[58.88369140625005,50.694433593750006],[59.4523437500001,50.62041015625002],[59.523046875,50.492871093749955],[59.812402343749994,50.58203125],[60.05859374999997,50.850292968749955],[60.42480468749997,50.67915039062498],[60.94228515625005,50.69550781250004],[61.38945312500002,50.86103515625001],[61.55468750000003,51.32460937500005],[60.464746093749994,51.651171875000045],[60.03027343749997,51.93325195312505],[60.99453125000005,52.33686523437504],[60.77441406249997,52.67578124999997],[61.047460937500006,52.97246093750002],[62.08271484375004,53.00541992187499],[61.65986328125004,53.22846679687504],[61.19921874999997,53.28715820312502],[61.22890625,53.445898437500006],[61.53496093750002,53.52329101562506],[60.97949218749997,53.62172851562505],[61.231054687500006,54.01948242187498],[61.92871093750003,53.94648437500004],[64.46123046875002,54.38417968750002],[65.08837890624997,54.340185546875034],[65.476953125,54.62329101562497],[68.15585937500006,54.97670898437505],[68.20625,55.16093750000002],[68.9772460937501,55.389599609374955],[70.18242187500002,55.162451171875034],[70.73808593750007,55.30517578125],[71.18554687500003,54.59931640624998],[71.09316406250005,54.21220703124999],[72.00449218750006,54.20566406249998],[72.18603515625003,54.32563476562501],[72.44677734375003,53.94184570312498],[72.62226562500004,54.13432617187502],[73.22988281250005,53.957812500000045],[73.71240234375003,54.04238281250002],[73.30566406250003,53.707226562499955],[73.40693359375004,53.44755859374999],[73.85898437500006,53.61972656249998],[74.35156250000003,53.487646484375006],[74.45195312500007,53.64726562500002],[75.22021484374997,53.89379882812506],[75.43720703125004,54.08964843749999],[76.8373046875,54.4423828125],[76.65458984375007,54.14526367187503],[76.42167968750007,54.151513671874966],[76.48476562500005,54.02255859374998],[77.85996093750006,53.269189453124994],[79.98623046875,50.774560546874966],[80.42363281250002,50.94628906249997],[80.44804687500002,51.18334960937503],[80.73525390625,51.29340820312498],[81.12724609375002,51.19106445312502],[81.0714843750001,50.96875],[81.38828125000006,50.95649414062501],[81.46591796875006,50.73984375],[82.49394531250007,50.72758789062499],[82.76083984375012,50.89335937500002],[83.35732421875005,50.99458007812504],[83.94511718750007,50.774658203125],[84.32324218749997,50.239160156249966],[84.9894531250001,50.061425781249994],[85.2326171875001,49.61582031249998],[86.1808593750001,49.49931640624996],[86.67548828125004,49.77729492187501],[86.62646484374997,49.56269531250001],[87.32285156250012,49.085791015625006]]]]},"properties":{"name":"Kazakhstan","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[35.325292968750006,5.364892578124994],[35.745019531249994,5.343994140625],[35.80029296874997,5.156933593749983],[35.77929687499997,5.105566406250006],[35.756152343750074,4.950488281250031],[35.76308593750005,4.808007812500051],[36.02197265625003,4.468115234374991],[36.90556640625002,4.411474609374991],[37.15458984375002,4.254541015624994],[37.944921875,3.746728515625023],[38.0861328125001,3.648828124999966],[38.22529296875004,3.61899414062502],[38.45156250000005,3.604833984374977],[38.608007812500006,3.600097656249986],[39.49443359375002,3.45610351562496],[39.65751953125002,3.577832031249983],[39.79033203125002,3.754248046875034],[39.8421875,3.851464843750037],[40.765234375,4.273046875000034],[41.02080078125002,4.057470703124991],[41.22089843750004,3.943554687499969],[41.372460937499994,3.94619140624998],[41.48193359375003,3.96328125],[41.737695312499994,3.979052734375003],[41.88398437500004,3.977734375000011],[41.6134765625001,3.59047851562498],[41.34179687499997,3.20166015625],[40.964453125,2.814648437500026],[40.9787109375001,-0.870312500000011],[41.249804687500074,-1.220507812499946],[41.4269531250001,-1.449511718749974],[41.521875,-1.572265625000028],[41.53271484374997,-1.695312499999957],[41.26748046875005,-1.945019531250026],[40.889746093750006,-2.023535156250034],[40.89824218750002,-2.269921874999966],[40.64414062500006,-2.53945312499998],[40.22246093750002,-2.688378906250037],[40.1154296875001,-3.250585937499991],[39.8609375,-3.576757812500006],[39.49091796875004,-4.478417968750023],[39.221777343750006,-4.692382812500014],[37.608203125000074,-3.497070312500028],[37.643847656250074,-3.045410156250028],[33.90322265625005,-1.002050781250034],[33.94316406250002,0.173779296874969],[34.160937500000074,0.605175781250026],[34.4108398437501,0.867285156250034],[34.48173828125002,1.042138671875051],[34.79863281250002,1.24453125],[34.976464843749994,1.719628906250051],[34.97753906249997,1.861914062499991],[34.9640625000001,2.06240234374998],[34.8830078125001,2.417919921875026],[34.90576171875003,2.4796875],[34.44785156250006,3.163476562500037],[34.40722656249997,3.357519531250034],[34.39941406249997,3.412695312500006],[34.44179687499999,3.60625],[34.43769531250004,3.650585937499969],[34.392871093750074,3.691503906250048],[34.26708984375003,3.733154296875],[34.16503906250003,3.812988281250014],[34.18574218750004,3.869775390625037],[34.13203125000004,3.889160156249986],[33.97607421874997,4.220214843750028],[34.176855468750006,4.419091796875037],[34.38017578125002,4.620654296874974],[34.6398437500001,4.875488281250028],[34.878320312499994,5.109570312500026],[35.08447265624997,5.31186523437502],[35.268359375000074,5.492285156250006],[35.325292968750006,5.364892578124994]]]},"properties":{"name":"Kenya","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[72.63994140625002,39.385986328125],[72.22998046875,39.20751953125],[72.14736328125002,39.2607421875],[72.08417968750001,39.31064453125],[72.04277343750002,39.3521484375],[71.77861328125002,39.277978515624994],[71.73222656250002,39.422998046874994],[71.50332031250002,39.478808593749996],[71.51738281250002,39.553857421874994],[71.50302734375,39.582177734374994],[71.4703125,39.603662109374994],[70.79931640625,39.3947265625],[70.50117187500001,39.587353515625],[69.29765625000002,39.524804687499994],[69.2447265625,39.827099609375],[69.27880859375,39.917773437499996],[69.3072265625,39.968554687499996],[69.36542968750001,39.947070312499996],[69.43193359375002,39.909765625],[69.47626953125001,39.919726562499996],[69.47099609375002,39.990625],[69.46875,40.020751953125],[69.966796875,40.20224609375],[70.59921875,39.974511718749994],[70.990625,40.2548828125],[71.3046875,40.286914062499996],[71.69248046875,40.15234375],[72.13125,40.438623046874994],[72.3892578125,40.427392578124994],[72.40205078125001,40.578076171875],[72.6041015625,40.525439453124996],[73.13212890625002,40.82851562499999],[72.65830078125,40.869921875],[72.36406250000002,41.04345703125],[72.294921875,41.039941406249994],[72.21308593750001,41.0142578125],[72.18730468750002,41.025927734374996],[72.18095703125002,41.118457031249996],[72.16425781250001,41.173730468749994],[72.11542968750001,41.186572265624996],[72.05244140625001,41.16474609375],[71.95849609375,41.187060546874996],[71.87861328125001,41.19501953125],[71.8580078125,41.311376953125],[71.79248046875,41.413134765624996],[71.75771484375002,41.428027343749996],[71.70068359375,41.454003906249994],[71.66494140625002,41.5412109375],[71.6375,41.5341796875],[71.60224609375001,41.503271484375],[71.60625,41.367431640625],[71.54560546875001,41.308056640625],[71.5,41.307470703125],[71.4208984375,41.34189453125],[71.40839843750001,41.136035156249996],[71.39306640625,41.123388671875],[71.11074218750002,41.152636718749996],[70.86044921875,41.224902343749996],[70.734375,41.400537109374994],[70.18095703125002,41.571435546874994],[70.85664062500001,42.030810546874996],[71.0322265625,42.077783203124994],[71.228515625,42.162890625],[71.23232421875002,42.186279296875],[71.21269531250002,42.206445312499994],[71.12998046875,42.25],[71.03603515625002,42.28466796875],[70.97900390625,42.266552734375],[70.94677734375,42.248681640624994],[70.89287109375002,42.339990234374994],[71.25664062500002,42.733544921874994],[71.42207031250001,42.783154296875],[71.5142578125,42.766943359375],[71.76054687500002,42.821484375],[72.16181640625001,42.760693359375],[72.27578125000002,42.757666015625],[72.54316406250001,42.677734375],[72.7529296875,42.637890625],[72.855078125,42.5611328125],[73.28291015625001,42.5041015625],[73.316015625,42.4669921875],[73.41162109375,42.419775390625],[73.49296875000002,42.409033203125],[73.421875,42.593505859375],[73.4501953125,42.703027343749994],[73.55625,43.002783203125],[73.88603515625002,43.132568359375],[74.20908203125,43.240380859374994],[75.04765625000002,42.90439453125],[75.68173828125,42.83046875],[75.78955078125,42.932910156249996],[75.84033203125,42.9375],[75.9322265625,42.928515625],[76.50917968750002,42.918896484375],[76.646484375,42.92880859375],[76.98808593749999,42.973583984375],[79.12666015625001,42.775732421875],[79.20302734375002,42.666015625],[79.29550781250003,42.604833984375],[79.36777343750003,42.547216796875],[79.42822265625,42.48349609375],[79.92109375000001,42.413134765624996],[80.0712890625,42.302978515625],[80.209375,42.1900390625],[80.24619140625003,42.059814453125],[80.23515624999999,42.04345703125],[80.21621093750002,42.032421875],[79.90966796875,42.014990234375],[79.84042968750003,41.995751953124994],[79.76611328125,41.898876953125],[78.74257812500002,41.56005859375],[78.54316406250001,41.4595703125],[78.44287109375,41.417529296874996],[78.36240234375003,41.371630859374996],[78.34628906250003,41.2814453125],[78.12343750000002,41.075634765625],[77.95644531250002,41.050683593749994],[77.81523437499999,41.055615234375],[77.71933593750003,41.024316406249994],[77.58173828125001,40.9927734375],[76.98662109374999,41.03916015625],[76.90771484375,41.024169921875],[76.82402343749999,40.982324218749994],[76.70839843750002,40.818115234375],[76.6611328125,40.779638671875],[76.63984375000001,40.742236328124996],[76.62216796875003,40.662353515625],[76.57792968749999,40.577880859375],[76.48017578125001,40.449511718749996],[76.39638671875002,40.389794921874994],[76.31855468750001,40.35224609375],[76.25830078125,40.43076171875],[75.87197265625002,40.30322265625],[75.67714843750002,40.305810546874994],[75.55556640625002,40.6251953125],[75.52080078125002,40.6275390625],[75.24101562500002,40.480273437499996],[75.111328125,40.4541015625],[75.0044921875,40.449511718749996],[74.865625,40.493505859375],[74.80126953125,40.428515625],[74.83046875000002,40.32851562499999],[74.41191406250002,40.13720703125],[74.24267578125,40.092041015625],[74.08515625000001,40.07431640625],[73.99160156250002,40.043115234374994],[73.93876953125002,39.978808593749996],[73.88457031250002,39.8779296875],[73.85625,39.828662109374996],[73.83535156250002,39.800146484375],[73.83974609375002,39.762841796874994],[73.88251953125001,39.71455078125],[73.9146484375,39.606494140624996],[73.90712890625002,39.57851562499999],[73.87275390625001,39.53330078125],[73.82294921875001,39.48896484375],[73.71572265625002,39.462255859375],[73.63164062500002,39.448876953124994],[73.47041015625001,39.460595703124994],[73.38740234375001,39.442724609375],[73.33613281250001,39.412353515625],[73.2349609375,39.374560546874996],[73.10927734375002,39.3619140625],[72.63994140625002,39.385986328125]],[[70.66416015625,39.85546875],[70.56708984375001,39.866601562499994],[70.49775390625001,39.882421875],[70.48281250000002,39.882714843749994],[70.4892578125,39.863037109375],[70.5595703125,39.790917968749994],[70.61210937500002,39.786767578124994],[70.70166015625,39.82529296875],[70.66416015625,39.85546875]],[[71.20615234375,39.892578125],[71.22871093750001,40.048144531249996],[71.08037109375002,40.079882812499996],[71.02412109375001,40.149169921875],[71.00546875,40.152294921875],[70.96064453125001,40.08798828125],[71.04482421875002,39.992529296875],[71.04365234375001,39.976318359375],[71.01171875,39.8951171875],[71.06425781250002,39.884912109374994],[71.15625,39.883447265624994],[71.20615234375,39.892578125]]]},"properties":{"name":"Kyrgyzstan","childNum":3}},{"geometry":{"type":"Polygon","coordinates":[[[104.42636718750006,10.411230468749991],[103.87050781250005,10.655126953125034],[103.58710937500004,10.552197265625026],[103.54042968750005,10.668701171875043],[103.721875,10.890136718750043],[103.5324218750001,11.146679687499997],[103.35361328125006,10.921582031250054],[103.15283203124997,10.913720703125051],[103.12548828124997,11.460644531250011],[102.9486328125,11.773486328124974],[102.93388671875002,11.706689453125037],[102.73662109375007,12.089794921875011],[102.75566406250002,12.42626953125],[102.49960937500012,12.669970703125003],[102.33632812500005,13.560302734375014],[102.546875,13.585693359375043],[102.90927734375006,14.136718750000028],[103.19941406250004,14.332617187499977],[104.77900390625004,14.427832031250006],[105.07412109375005,14.227441406250037],[105.12597656250003,14.280957031250011],[105.16914062500004,14.336083984374966],[105.1833007812501,14.346240234374989],[105.18554687500003,14.319091796874972],[105.20703125000003,14.259375],[105.24570312500006,14.200537109374977],[105.35019531250006,14.109570312500011],[105.53154296875007,14.156152343749994],[105.73974609375003,14.084960937500057],[105.83144531250005,13.976611328125003],[105.9044921875001,13.924511718750054],[106.06679687500005,13.921191406250003],[106.12470703125004,14.049121093750031],[106.09667968749997,14.127099609375023],[106.00410156250004,14.262890624999983],[105.97890625,14.343017578125043],[106.00839843750012,14.357177734375],[106.1652343750001,14.372363281249989],[106.19072265625007,14.388134765624997],[106.22539062500002,14.476220703125009],[106.26796875,14.466210937500009],[106.35498046875003,14.454785156249997],[106.44697265625004,14.515039062500009],[106.50146484375003,14.578222656250006],[106.53115234375005,14.549414062499991],[106.5636718750001,14.505078125000026],[106.59921875000006,14.479394531250037],[106.66542968750005,14.441308593749994],[106.73818359375005,14.387744140625017],[106.78349609375002,14.335107421875037],[106.81992187500006,14.314697265625057],[106.91318359375006,14.329394531250031],[106.93808593750006,14.327343750000054],[106.99218750000003,14.391015624999966],[107.03017578125,14.425683593750009],[107.06240234375,14.415771484375043],[107.109375,14.416699218750054],[107.29267578125004,14.592382812500048],[107.37988281250003,14.555322265625051],[107.41474609375004,14.56289062499999],[107.51943359375005,14.705078125],[107.3314453125,14.126611328125009],[107.60546874999997,13.437792968750017],[107.47539062500002,13.030371093749963],[107.50644531250006,12.364550781250031],[107.39335937500002,12.260498046874972],[107.21210937500004,12.30400390624996],[106.70009765625,11.979296874999974],[106.41386718750002,11.9484375],[106.39921875000007,11.687011718750028],[106.0060546875001,11.758007812500011],[105.85146484375005,11.635009765625],[105.85605468750006,11.294287109375048],[106.16093750000002,11.037109375000057],[106.16396484375005,10.794921875],[105.85332031250007,10.86357421874996],[105.75507812500004,10.989990234375043],[105.40576171875003,10.95161132812504],[105.3146484375001,10.845166015625026],[105.04570312500002,10.911376953125014],[105.04638671874997,10.701660156250014],[104.85058593749997,10.534472656249974],[104.42636718750006,10.411230468749991]]]},"properties":{"name":"Cambodia","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-157.34213867187503,1.855566406250034],[-157.17578125,1.73984375],[-157.57895507812498,1.902050781249997],[-157.43583984374993,1.84726562500002],[-157.365185546875,1.94609375],[-157.44189453125003,2.025048828125009],[-157.321875,1.968554687500045],[-157.34213867187503,1.855566406250034]]],[[[-159.3390625,3.923535156249983],[-159.27475585937503,3.796582031250054],[-159.40903320312503,3.87324218750004],[-159.3390625,3.923535156249983]]]]},"properties":{"name":"Kiribati","childNum":2}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[126.32695312500002,33.2236328125],[126.16562500000012,33.31201171875],[126.33769531250002,33.46040039062501],[126.90117187500002,33.51513671874997],[126.87285156250002,33.34116210937498],[126.32695312500002,33.2236328125]]],[[[126.23369140625002,34.370507812499994],[126.12285156250002,34.443945312500034],[126.34384765625012,34.544921875],[126.23369140625002,34.370507812499994]]],[[[126.17197265625006,34.73115234375001],[126.00751953125004,34.86748046874999],[126.07841796875002,34.914843750000045],[126.17197265625006,34.73115234375001]]],[[[128.0658203125,34.80585937500004],[128.05468750000003,34.70805664062502],[127.87343750000005,34.73496093749998],[127.8322265625001,34.87451171875],[128.0658203125,34.80585937500004]]],[[[128.74101562500007,34.798535156249955],[128.64667968750004,34.73686523437502],[128.48925781250003,34.86528320312496],[128.66796875000003,35.0087890625],[128.74101562500007,34.798535156249955]]],[[[126.52070312500004,37.73681640625003],[126.516015625,37.60468750000001],[126.42333984375003,37.62363281250006],[126.41162109374997,37.82265625000002],[126.52070312500004,37.73681640625003]]],[[[128.37460937500012,38.6234375],[129.41826171875002,37.059033203124955],[129.40351562500004,36.052148437499994],[129.57285156250006,36.05053710937503],[129.4191406250001,35.49785156249996],[129.07675781250006,35.12270507812502],[128.5109375000001,35.10097656250002],[128.44394531250012,34.87036132812503],[128.03623046875006,35.02197265625],[127.71484374999997,34.95468749999998],[127.71542968750012,34.72104492187498],[127.40429687499997,34.823095703125006],[127.47910156250012,34.625244140625],[127.324609375,34.463281249999966],[127.17343750000006,34.54614257812497],[127.24707031249997,34.755126953125],[126.89746093749997,34.438867187499966],[126.75478515625005,34.511865234374994],[126.53144531250004,34.31425781249999],[126.26445312500002,34.67324218750002],[126.52451171875006,34.697900390624966],[126.59335937500012,34.824365234374994],[126.42070312500002,34.823388671874966],[126.29111328125012,35.154150390625034],[126.61406250000007,35.57099609375004],[126.4884765625001,35.647070312500006],[126.75302734375006,35.871972656249994],[126.5404296875,36.166162109374966],[126.4876953125,36.69379882812498],[126.18085937500004,36.69160156249998],[126.16054687500005,36.77192382812501],[126.48701171875004,37.00747070312502],[126.78447265625007,36.94843749999998],[126.87207031249997,36.82446289062506],[126.97685546875002,36.93940429687501],[126.74638671875002,37.19355468750001],[126.63388671875012,37.78183593750006],[127.09033203125003,38.28388671875001],[128.03896484375,38.30854492187498],[128.37460937500012,38.6234375]]]]},"properties":{"name":"Korea","childNum":7}},{"geometry":{"type":"Polygon","coordinates":[[[21.5625,42.247509765625],[21.560839843750017,42.24765625],[21.389550781250023,42.21982421875],[21.28662109375,42.100390625],[21.05976562500001,42.171289062499994],[20.778125,42.071044921875],[20.725,41.87353515625],[20.566210937500017,41.873681640624994],[20.485449218750006,42.223388671875],[20.06396484375,42.54726562499999],[20.054296875,42.760058593749996],[20.344335937500006,42.827929687499996],[20.468847656250006,42.85791015625],[20.47509765625,42.953027343749994],[20.6240234375,43.0341796875],[20.648535156250006,43.070947265624994],[20.657617187500023,43.099853515625],[20.623144531250006,43.198632812499994],[20.800585937500017,43.261083984375],[21.390625,42.751416015625],[21.6625,42.681494140625],[21.7529296875,42.669824218749994],[21.52998046875001,42.35],[21.5625,42.247509765625]]]},"properties":{"name":"Kosovo","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[48.27539062499997,29.624316406250017],[48.17968750000003,29.611425781250063],[48.081445312499994,29.798925781250063],[48.1847656250001,29.978857421875034],[48.348242187500006,29.78266601562504],[48.27539062499997,29.624316406250017]]],[[[48.442480468750006,28.542919921874983],[47.671289062499994,28.53315429687504],[47.433203125,28.989550781250017],[46.53144531250004,29.09624023437499],[46.69375,29.259667968749966],[46.76933593750002,29.347460937500017],[46.90585937500006,29.5375],[47.14824218750002,30.0009765625],[47.64375,30.097314453125023],[47.75390624999997,30.076611328124955],[47.97871093750004,29.98281250000005],[48.00566406250002,29.835791015625034],[48.143457031249994,29.57246093750001],[47.96962890625005,29.61669921874997],[47.72265624999997,29.393017578124955],[48.0514648437501,29.355371093750023],[48.442480468750006,28.542919921874983]]]]},"properties":{"name":"Kuwait","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[102.12744140625011,22.37919921874999],[102.58251953125006,21.904296875000057],[102.66201171875008,21.676025390625057],[102.73857421875005,21.677929687500125],[102.77109375000015,21.70966796875001],[102.79824218750014,21.797949218750034],[102.81591796875,21.807373046875],[102.94960937500008,21.681347656250068],[102.85117187500009,21.26591796874999],[102.8837890625,21.202587890625068],[103.1044921875,20.89165039062499],[103.21074218749999,20.840625],[103.46357421874995,20.779833984375102],[103.6350585937501,20.697070312500102],[104.10136718750005,20.945507812500125],[104.1953125,20.91396484375008],[104.349609375,20.82109374999999],[104.58320312500001,20.646679687499955],[104.53271484375,20.554882812500125],[104.47861328124998,20.529589843750102],[104.40781250000015,20.485742187500023],[104.36777343750015,20.441406250000057],[104.39218750000015,20.424755859375068],[104.49619140625003,20.41367187499992],[104.61884765624995,20.374511718750114],[104.65644531250001,20.328515624999966],[104.66191406250005,20.289013671875125],[104.67695312500007,20.224707031249977],[104.69873046875006,20.205322265625114],[104.84785156250007,20.202441406250045],[104.88867187500006,20.169091796875023],[104.92919921874994,20.082812500000045],[104.92792968750007,20.01811523437499],[104.81513671875001,19.90400390625001],[104.80175781250011,19.836132812500068],[104.74316406250006,19.754736328124977],[104.58789062500006,19.61875],[104.54628906250014,19.610546875000068],[104.25986328125003,19.685498046875068],[104.06279296875005,19.678417968750068],[104.03203124999999,19.67514648437492],[104.0134765625001,19.646484374999943],[104.05156250000005,19.564160156250068],[104.06289062500002,19.482568359375136],[104.02753906250013,19.420458984375102],[103.93203125000002,19.366064453125034],[103.89638671875002,19.339990234375023],[103.89160156249994,19.30498046874999],[105.146484375,18.650976562499977],[105.14541015625014,18.616796874999977],[105.08701171875015,18.49624023437508],[105.11455078125005,18.405273437500057],[105.45820312500007,18.154296875000057],[105.51855468750011,18.077441406250045],[105.58847656250015,17.983691406249932],[105.69140625,17.737841796874932],[106.00625,17.415283203124943],[106.26953125,17.216796875000057],[106.33339843750002,17.14370117187508],[106.42597656250007,17.00253906250009],[106.50224609374999,16.9541015625],[106.52597656250003,16.876611328125023],[106.53369140625,16.821044921875057],[106.54619140625005,16.650732421874977],[106.65644531250013,16.492626953125125],[106.73955078124999,16.452539062500136],[106.79160156250015,16.490332031249977],[106.83242187500008,16.526269531250023],[106.85107421875,16.515625],[106.89277343750013,16.396533203125102],[106.93066406250006,16.353125],[107.39638671875008,16.04301757812499],[107.39199218750008,15.951660156250057],[107.36064453125005,15.921728515624977],[107.18886718750008,15.838623046875114],[107.16591796875002,15.802490234375],[107.27939453125003,15.618701171875045],[107.33876953125002,15.560498046875125],[107.56425781249999,15.3916015625],[107.62167968750015,15.309863281250045],[107.653125,15.255224609375091],[107.63369140625008,15.18984375000008],[107.58964843749999,15.118457031250102],[107.55527343750009,15.057031250000023],[107.48037109375014,14.979882812500136],[107.5046875000001,14.91591796875008],[107.52451171875003,14.871826171874943],[107.51376953124998,14.817382812500057],[107.51943359375008,14.705078125000114],[107.46513671875005,14.664990234375125],[107.41474609375007,14.56289062500008],[107.37988281250006,14.555322265625136],[107.29267578125007,14.592382812500034],[107.109375,14.416699218749955],[107.06240234375008,14.415771484374943],[107.03017578125008,14.425683593750023],[106.99218749999994,14.39101562500008],[106.93808593750015,14.327343750000068],[106.91318359375003,14.329394531249932],[106.81992187500003,14.314697265624943],[106.7834960937501,14.335107421875023],[106.73818359375008,14.387744140625102],[106.66542968750002,14.441308593750023],[106.59921875000003,14.479394531250136],[106.56367187500007,14.505078125000011],[106.53115234375002,14.549414062499977],[106.50146484375,14.578222656250034],[106.22539062500005,14.476220703125023],[106.1907226562501,14.388134765625011],[106.16523437500007,14.372363281249989],[106.00839843750009,14.357177734375114],[105.97890625000014,14.343017578125057],[106.00410156250013,14.262890625000068],[106.09667968750011,14.127099609375136],[106.12470703124995,14.049121093750045],[106.06679687500008,13.921191406250102],[105.90449218750007,13.924511718750068],[105.83144531250008,13.976611328124989],[105.73974609375006,14.084960937500057],[105.5315429687501,14.156152343750023],[105.35019531250009,14.109570312500125],[105.24570312500015,14.200537109374977],[105.20703125000006,14.259375],[105.18554687499994,14.319091796875],[105.18330078125001,14.346240234374989],[105.24365234375006,14.367871093749955],[105.34218750000008,14.416699218749955],[105.42265624999993,14.471630859374955],[105.47558593750006,14.530126953124977],[105.49736328125005,14.590673828125034],[105.52304687500015,14.843310546874989],[105.54667968749999,14.932470703125034],[105.53339843750013,15.041601562500091],[105.49042968750007,15.127587890625023],[105.49042968750007,15.256591796875],[105.615625,15.488281249999943],[105.63886718750013,15.585937499999943],[105.64101562500002,15.656542968749932],[105.62207031250006,15.699951171875114],[105.39892578125011,15.829882812500102],[105.40625,15.987451171875023],[105.33066406250003,16.037890625000045],[105.1487304687501,16.09355468749999],[105.04716796874999,16.16025390625009],[104.81933593749994,16.466064453125057],[104.75058593750015,16.647558593750034],[104.74355468750014,16.884375],[104.75898437500013,17.0771484375],[104.81601562499998,17.30029296875],[104.73964843750008,17.461669921875],[104.428125,17.698974609375057],[104.32265625000002,17.815820312500023],[104.19619140625002,17.988378906250034],[104.04873046875002,18.216699218749966],[103.94960937500008,18.318994140625023],[103.89882812500002,18.295312500000023],[103.79228515624999,18.31650390625009],[103.62968750000005,18.382568359375057],[103.48798828124995,18.41816406250001],[103.36699218750005,18.42333984375],[103.28828124999995,18.408398437499955],[103.25175781249999,18.373486328125125],[103.24892578125014,18.338964843750034],[103.27958984374999,18.304980468750045],[103.26318359375,18.278466796875136],[103.19970703125006,18.25947265625001],[103.14853515625009,18.221728515624932],[103.09121093750014,18.13823242187499],[103.05136718750003,18.02851562500001],[102.80742187500005,17.945556640625],[102.71757812500005,17.892236328125136],[102.67519531250014,17.851757812500068],[102.68007812500008,17.824121093750136],[102.66064453125,17.8179687499999],[102.61679687500015,17.833349609375034],[102.59824218750009,17.926757812500057],[102.55253906249999,17.965087890625057],[102.4587890625001,17.984619140624943],[102.35185546874999,18.045947265625045],[102.14824218750005,18.203857421875057],[102.10146484375014,18.21064453125001],[102.03457031250002,18.169824218750023],[101.94746093750001,18.081494140624955],[101.87548828125011,18.046435546874932],[101.81865234375005,18.064648437500125],[101.77480468750002,18.033398437500125],[101.6875,17.889404296875114],[101.56367187500001,17.820507812500125],[101.55507812500002,17.812353515625034],[101.41367187500015,17.71875],[101.16748046875011,17.4990234375],[101.10517578125001,17.479541015625102],[100.9084960937501,17.583886718750023],[101.14394531250008,18.14262695312499],[101.1375,18.286865234375057],[101.0505859375001,18.407031250000045],[101.04697265625003,18.441992187500034],[101.28632812499995,18.977148437500034],[101.19755859374999,19.327929687500045],[101.22080078125015,19.486621093750045],[101.21191406250011,19.548339843750057],[100.51357421875008,19.553466796875],[100.39765625000013,19.756103515625057],[100.51953125000006,20.177929687500068],[100.31796875000003,20.385888671875136],[100.2180664062501,20.339599609375114],[100.13974609375015,20.245410156250102],[100.11494140625007,20.25766601562492],[100.12246093750002,20.316650390625057],[100.12968750000005,20.372216796875023],[100.1838867187501,20.589111328124943],[100.2493164062501,20.730273437499932],[100.32607421875008,20.795703124999932],[100.40742187499995,20.823242187500057],[100.56513671875013,20.82509765625008],[100.62294921875002,20.85957031250001],[100.61767578125,20.87924804687509],[100.54931640625011,20.884228515625068],[100.5222656250001,20.921923828125102],[100.53613281250006,20.992382812500068],[100.703125,21.25136718750008],[101.0803710937501,21.46865234375008],[101.13886718750013,21.567480468749977],[101.19667968750002,21.522070312499977],[101.17539062500009,21.407519531250102],[101.21992187500013,21.342431640625136],[101.21181640625008,21.278222656250023],[101.22441406249999,21.22373046874992],[101.24785156249993,21.197314453125045],[101.28144531250007,21.184130859375045],[101.44355468750001,21.230810546874977],[101.54238281250008,21.234277343750136],[101.70478515625013,21.150146484375057],[101.728125,21.15639648437508],[101.78349609374999,21.204150390625045],[101.8005859375001,21.212597656249955],[101.7229492187501,21.314941406250057],[101.74726562500007,21.60576171874999],[101.7439453125001,21.77797851562508],[101.73652343750001,21.826513671874977],[101.52451171874998,22.253662109375],[101.56787109375011,22.2763671875],[101.6199218750001,22.327441406250102],[101.67148437500009,22.462304687500023],[101.70751953125,22.486572265625],[101.73876953125011,22.495263671874966],[101.75996093750001,22.490332031250034],[101.841796875,22.388476562500102],[102.02441406250006,22.439208984375114],[102.09150390625007,22.412255859375136],[102.12744140625011,22.37919921874999]]]},"properties":{"name":"Lao PDR","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[35.869140625,33.43173828125],[35.411230468750006,33.07568359375],[35.10859375000001,33.08369140625],[35.64785156250002,34.2482421875],[35.97626953125001,34.629199218749996],[36.383886718750006,34.65791015625],[36.32988281250002,34.499609375],[36.50439453125,34.432373046875],[36.5849609375,34.221240234374996],[36.27783203125,33.92529296875],[36.36503906250002,33.83935546875],[35.98613281250002,33.75263671875],[36.03447265625002,33.58505859375],[35.869140625,33.43173828125]]]},"properties":{"name":"Lebanon","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-8.486425781249977,7.558496093749994],[-8.408740234374989,7.411816406249997],[-8.324511718749989,6.920019531249991],[-8.587890625,6.490527343749989],[-8.287109375,6.319042968749997],[-7.981591796874994,6.2861328125],[-7.888623046874983,6.23486328125],[-7.800927734374994,6.038916015624991],[-7.730371093749994,5.919042968749991],[-7.636132812499994,5.90771484375],[-7.454394531249989,5.84130859375],[-7.39990234375,5.550585937499989],[-7.585058593749977,4.916748046875],[-7.574658203124983,4.572314453124989],[-7.544970703124989,4.351318359375],[-8.259033203125,4.589990234374994],[-9.132177734374977,5.054638671874997],[-10.2763671875,6.07763671875],[-11.291601562499977,6.688232421875],[-11.507519531249983,6.906542968749989],[-11.267675781249977,7.232617187499997],[-10.878076171874994,7.538232421874994],[-10.6474609375,7.759375],[-10.570849609374989,8.071142578124991],[-10.516748046874994,8.125292968749989],[-10.359814453124983,8.187939453124997],[-10.283203125,8.485156249999989],[-10.233056640624994,8.488818359374989],[-10.147412109374983,8.519726562499997],[-10.064355468749994,8.429882812499997],[-9.781982421875,8.537695312499991],[-9.518261718749983,8.34609375],[-9.369140625,7.703808593749997],[-9.463818359374983,7.415869140624991],[-9.11757812499999,7.215917968749991],[-8.8896484375,7.2626953125],[-8.659765624999977,7.688378906249994],[-8.486425781249977,7.558496093749994]]]},"properties":{"name":"Liberia","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[25.150488281250006,31.654980468749997],[24.85273437500001,31.334814453125],[24.96142578125,30.678515625],[24.703222656250006,30.201074218749994],[24.980273437500017,29.181884765625],[24.980273437500017,25.5888671875],[24.980273437500017,21.995849609375],[24.9794921875,20.002587890624994],[23.980273437500017,19.99594726562499],[23.980273437500017,19.496630859375003],[20.14765625000001,21.38925781249999],[15.984082031250011,23.445214843749994],[14.97900390625,22.99619140624999],[14.215527343750011,22.619677734375003],[13.48125,23.18017578125],[11.967871093750006,23.517871093750003],[11.507617187500017,24.314355468749994],[10.686132812500006,24.55136718749999],[10.395898437500023,24.485595703125],[10.255859375,24.591015625],[10.000683593750011,25.332080078125003],[9.4482421875,26.067138671875],[9.491406250000011,26.333740234375],[9.883203125000023,26.630810546874997],[9.74755859375,27.330859375],[9.916015625,27.785693359374996],[9.805273437500006,29.176953125],[9.310253906250011,30.115234375],[9.51875,30.229394531249994],[9.89501953125,30.3873046875],[9.932519531250023,30.425341796874996],[10.059765625000011,30.580078125],[10.21640625,30.783203125],[10.114941406250011,31.463769531249994],[10.274609375000011,31.684960937499994],[10.475781250000011,31.736035156249997],[10.60888671875,31.929541015625],[10.826367187500011,32.0806640625],[11.005175781250017,32.172705078125],[11.168261718750017,32.256738281249994],[11.358007812500006,32.34521484375],[11.504980468750006,32.413671875],[11.535937500000017,32.47333984375],[11.533789062500006,32.524951171874996],[11.453906250000017,32.642578125],[11.453906250000017,32.781689453125],[11.459179687500011,32.897363281249994],[11.467187500000023,32.965722656249994],[11.504589843750011,33.181933593749996],[11.657128906250023,33.118896484375],[11.8134765625,33.093701171875],[12.279882812500006,32.858544921874994],[12.753515625,32.801074218749996],[13.283496093750017,32.9146484375],[15.176562500000017,32.391162109374996],[15.705957031250023,31.426416015624994],[17.830468750000023,30.927587890625],[18.669824218750023,30.415673828124994],[19.12373046875001,30.26611328125],[19.713281250000023,30.48837890625],[20.11152343750001,30.963720703125],[19.926367187500006,31.817529296874994],[20.121484375000023,32.21875],[20.62109375,32.58017578125],[21.63593750000001,32.937304687499996],[22.187402343750023,32.918261718749996],[23.090625,32.61875],[23.10625,32.331445312499994],[23.28632812500001,32.213818359375],[24.129687500000017,32.009228515625],[24.878515625,31.984277343749994],[25.150488281250006,31.654980468749997]]]},"properties":{"name":"Libya","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-60.89521484375,13.821972656249997],[-60.951416015625,13.717578125],[-61.073144531249994,13.865576171874991],[-60.908105468749994,14.09335937499999],[-60.89521484375,13.821972656249997]]]},"properties":{"name":"Saint Lucia","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[79.87480468750002,9.050732421875026],[79.90371093750005,8.975],[79.74765625000006,9.104589843749991],[79.87480468750002,9.050732421875026]]],[[[79.98232421875,9.812695312500011],[80.25283203125005,9.796337890625054],[80.71113281250004,9.366357421875023],[81.226953125,8.50551757812498],[81.37285156250002,8.431445312499989],[81.42216796875007,8.147851562500023],[81.87412109375012,7.288330078124986],[81.86142578125012,6.901269531249994],[81.63740234375004,6.425146484374991],[80.72412109375003,5.97905273437496],[80.26738281250007,6.009765625],[80.09531250000012,6.153173828125006],[79.859375,6.829296874999983],[79.71298828125012,8.18232421875004],[79.74980468750007,8.294238281250003],[79.78349609375007,8.018457031250051],[79.92890625000004,8.899218749999974],[80.09960937499997,9.209960937500043],[80.08632812500005,9.577832031250026],[80.42832031250006,9.480957031250014],[80.04580078125005,9.649902343749972],[79.98232421875,9.812695312500011]]]]},"properties":{"name":"Sri Lanka","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[28.646875,-30.1265625],[28.39208984375,-30.147558593750006],[28.128710937500017,-30.52509765625001],[28.05683593750001,-30.63105468750001],[27.753125,-30.6],[27.364062500000017,-30.27919921875001],[27.19355468750001,-29.94130859375001],[27.056933593750017,-29.625585937500006],[27.29453125,-29.519335937500003],[27.73554687500001,-28.940039062500006],[27.959863281250023,-28.873339843750003],[28.084375,-28.77998046875001],[28.23261718750001,-28.701269531250006],[28.471875,-28.615820312500006],[28.583398437500023,-28.594140625],[28.625781250000017,-28.58173828125001],[29.301367187500006,-29.08984375],[29.38671875,-29.31972656250001],[29.34882812500001,-29.441992187500006],[29.293554687500006,-29.56689453125],[29.1421875,-29.700976562500003],[29.098046875000023,-29.919042968750006],[28.646875,-30.1265625]]]},"properties":{"name":"Lesotho","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[20.957812500000074,55.27890625000006],[20.89980468750008,55.286669921875045],[21.11484375,55.61650390624999],[20.957812500000074,55.27890625000006]]],[[[25.573046875000017,54.139892578125],[25.497363281250045,54.17524414062501],[25.52734375000003,54.21513671874996],[25.505664062500045,54.26494140624999],[25.46113281250004,54.29277343749996],[25.179492187500017,54.214257812499966],[25.111425781250006,54.15493164062505],[25.04609375000004,54.13305664062503],[24.869531250000023,54.14516601562502],[24.82568359374997,54.118994140625006],[24.78925781250001,53.99824218750001],[24.768164062499977,53.97465820312499],[24.31796875,53.892968749999966],[24.236621093750045,53.91997070312496],[24.19130859375005,53.95043945312503],[23.559082031250057,53.91982421875002],[23.484667968750074,53.939794921875006],[23.453613281250057,54.14345703125002],[23.3701171875,54.20048828124999],[23.282324218750063,54.240332031250034],[23.17031250000008,54.28144531249998],[23.0875,54.299462890624994],[23.042187500000068,54.30419921875],[23.01552734375005,54.34833984375001],[22.976757812500068,54.36635742187505],[22.89394531250008,54.390527343749994],[22.82373046874997,54.39580078124999],[22.766210937499977,54.356787109375034],[22.679882812500068,54.493017578125006],[22.684472656250023,54.56293945312504],[22.82470703125,54.87128906249998],[22.56728515625005,55.05913085937496],[22.072363281250034,55.06367187499998],[21.235742187500023,55.26411132812498],[21.237890625000034,55.455029296874955],[21.06191406250005,55.81342773437498],[21.053808593750006,56.02294921875003],[21.04609375000004,56.07006835937503],[21.31464843750004,56.18813476562502],[21.65351562500004,56.314550781250006],[22.084570312500034,56.40673828125006],[22.875585937500063,56.39643554687501],[22.96826171875003,56.38041992187502],[23.042968750000057,56.324072265625006],[23.119824218749983,56.330664062500006],[23.195898437500034,56.36713867187498],[24.120703125000063,56.26425781249998],[24.90302734375001,56.398193359375],[25.069921875,56.20039062500004],[25.663183593750063,56.104833984375006],[26.593554687500074,55.66752929687502],[26.590820312500057,55.62265625],[26.56660156250001,55.546484375000034],[26.51923828125004,55.448144531249994],[26.469531250000045,55.371923828125006],[26.457617187500006,55.342480468749955],[26.49531250000004,55.31801757812502],[26.68125,55.30644531249999],[26.76015625000008,55.29335937499999],[26.775683593750045,55.27309570312502],[26.601171875000034,55.130175781250045],[26.291796875000074,55.13959960937501],[26.250781250000045,55.12451171875006],[26.175195312500023,55.003271484375034],[26.092968750000068,54.96230468750005],[25.964453124999977,54.947167968749966],[25.85927734375005,54.91928710937498],[25.722460937500074,54.71787109374998],[25.731640625000068,54.59038085937502],[25.72480468750001,54.564257812500045],[25.68515625,54.53579101562502],[25.62031250000004,54.46040039062501],[25.56757812500004,54.377050781250006],[25.54736328125,54.33183593750002],[25.55751953125005,54.310693359374994],[25.702539062499994,54.29296875],[25.765234374999977,54.179785156250034],[25.573046875000017,54.139892578125]]]]},"properties":{"name":"Lithuania","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[6.4873046875,49.798486328124994],[6.344335937500006,49.452734375],[6.181054687500023,49.498925781249994],[6.119921875000017,49.485205078125],[6.074121093750023,49.454638671874996],[6.011425781250011,49.445458984374994],[5.95947265625,49.454638671874996],[5.928906250000011,49.4775390625],[5.9013671875,49.48974609375],[5.823437500000011,49.505078125],[5.789746093750011,49.53828125],[5.88037109375,49.644775390625],[5.744042968750023,49.91962890625],[5.7880859375,49.961230468749996],[5.8173828125,50.0126953125],[5.866894531250011,50.0828125],[5.976269531250011,50.1671875],[6.089062500000011,50.154589843749996],[6.110058593750011,50.123779296875],[6.116503906250017,50.120996093749994],[6.109765625000023,50.034375],[6.13818359375,49.97431640625],[6.204882812500017,49.91513671875],[6.256054687500011,49.87216796875],[6.4873046875,49.798486328124994]]]},"properties":{"name":"Luxembourg","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[28.14794921875,56.142919921875],[27.576757812500006,55.798779296875],[27.052539062500017,55.83056640625],[26.593554687500017,55.667529296874996],[25.663183593750006,56.104833984375],[25.069921875,56.200390625],[24.90302734375001,56.398193359375],[24.120703125,56.2642578125],[23.81269531250001,56.329248046875],[23.195898437500006,56.367138671875],[23.11982421875001,56.3306640625],[23.04296875,56.324072265625],[22.875585937500006,56.396435546875],[22.084570312500006,56.40673828125],[21.730566406250006,56.325976562499996],[21.65351562500001,56.31455078125],[21.31464843750001,56.188134765625],[21.04609375000001,56.070068359375],[21.0712890625,56.82373046875],[21.72871093750001,57.57099609375],[22.554589843750023,57.724267578125],[23.28730468750001,57.08974609375],[23.647753906250017,56.971044921875],[24.382617187500017,57.250048828124996],[24.322558593750017,57.87060546875],[24.3625,57.866162109375],[24.458886718750023,57.907861328125],[25.11103515625001,58.063427734375],[25.27265625000001,58.009375],[25.66015625,57.920166015625],[26.29804687500001,57.60107421875],[26.532617187500023,57.531005859375],[26.96601562500001,57.609130859375],[27.187109375,57.538330078125],[27.326562500000023,57.52548828125],[27.4697265625,57.5240234375],[27.538671875,57.42978515625],[27.796875,57.316943359374996],[27.82861328125,57.293310546875],[27.838281250000023,57.247705078125],[27.83027343750001,57.194482421875],[27.639453125000017,56.845654296875],[27.806054687500023,56.86708984375],[27.8486328125,56.85341796875],[27.89208984375,56.741064453125],[28.00751953125001,56.599853515625],[28.103125,56.545703125],[28.11083984375,56.510693359375],[28.169238281250017,56.386865234375],[28.191699218750017,56.315576171875],[28.202050781250023,56.260400390625],[28.14794921875,56.142919921875]]]},"properties":{"name":"Latvia","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-1.16259765625,32.399169921875],[-1.275341796874983,32.089013671874966],[-2.863427734374937,32.07470703124997],[-2.930859374999926,32.04252929687499],[-2.988232421874983,31.874218749999983],[-3.01738281249996,31.834277343750017],[-3.439794921874949,31.704541015624983],[-3.604589843749949,31.686767578125],[-3.700244140624989,31.70009765625005],[-3.768164062499977,31.689550781250034],[-3.837109374999983,31.512353515624994],[-3.833398437499937,31.197802734375045],[-3.626904296874955,31.000927734374983],[-4.148779296874977,30.8095703125],[-4.322851562500006,30.698876953124994],[-4.52915039062492,30.62553710937499],[-4.778515624999926,30.552392578124994],[-4.968261718749943,30.465380859375045],[-5.061914062499937,30.326416015625057],[-5.180126953124955,30.166162109374994],[-5.293652343749983,30.058642578125045],[-5.44877929687496,29.956933593750023],[-6.00429687499999,29.83125],[-6.479736328124943,29.82036132812499],[-6.520556640624989,29.659863281249983],[-6.59775390624992,29.578955078125006],[-6.635351562499949,29.568798828124983],[-6.755126953125,29.583837890625034],[-6.855566406249949,29.601611328125017],[-7.142431640624949,29.61958007812504],[-7.427685546874983,29.425],[-7.485742187499994,29.392236328124994],[-8.659912109375,28.718603515625063],[-8.683349609375,27.900390625],[-8.683349609375,27.65644531250004],[-8.817822265624955,27.65644531250004],[-8.817773437499937,27.655908203125023],[-8.813916015624955,27.613867187500063],[-8.784570312499994,27.530859375000034],[-8.774365234374983,27.460546875],[-8.794873046874983,27.120703125000034],[-9.4873046875,27.050390625],[-9.817871093750028,26.850195312500006],[-10.251464843749972,26.860937500000063],[-10.551269531249943,26.990820312500063],[-10.654248046874983,27.000585937500006],[-10.757763671874926,27.020117187499977],[-10.830078125,27.010351562500034],[-10.922802734374983,27.010351562500034],[-11.392578125000028,26.883398437500006],[-11.361279296874955,26.793554687500006],[-11.316845703124955,26.744726562500006],[-11.337890624999972,26.633398437499977],[-11.718212890624926,26.104101562500063],[-11.754882812499943,26.086523437500034],[-11.880859375000028,26.070898437500034],[-12.03076171875,26.030859375000063],[-12.056787109374966,25.99633789062503],[-12.060986328124955,25.990820312499977],[-12.40087890625,24.88046875],[-12.991162109375011,24.4703125],[-13.061035156249943,24.400976562500006],[-13.310986328124955,23.981054687499977],[-13.770947265624955,23.790625],[-13.840771484374983,23.750585937500034],[-13.891113281250028,23.691015625000063],[-14.10107421875,23.100195312500034],[-14.121093749999972,22.960546875],[-14.1708984375,22.760351562499977],[-14.221191406249943,22.310156250000034],[-14.52099609375,21.990869140624994],[-14.581005859374983,21.910742187500006],[-14.630859375,21.860937499999977],[-14.610791015625011,21.750585937499977],[-14.750976562499972,21.500585937500034],[-14.840820312499972,21.45078125],[-14.971142578124955,21.441015625000063],[-15.4609375,21.45078125],[-16.04101562499997,21.500585937500034],[-16.190869140624955,21.481054687500034],[-16.581005859374926,21.481054687500034],[-16.73095703125003,21.470312499999977],[-16.951123046874926,21.430273437500006],[-17.002978515625017,21.420751953125006],[-17.003076171874937,21.420703125000017],[-16.930859374999983,21.9],[-16.35874023437495,22.594531250000045],[-16.21025390624999,23.097900390625],[-15.789257812499926,23.792871093750023],[-15.980712890624943,23.670312500000023],[-15.899316406249966,23.844433593749955],[-14.904296875000028,24.719775390625017],[-14.794921874999943,25.404150390625006],[-14.413867187499932,26.25371093749999],[-13.57578125,26.735107421875],[-13.175976562499983,27.655712890624983],[-12.948925781249926,27.914160156250034],[-11.552685546874955,28.31010742187496],[-10.486474609374994,29.06494140625],[-10.200585937499994,29.380371093750057],[-9.667089843749949,30.10927734375005],[-9.652929687499977,30.447558593750045],[-9.875488281249943,30.717919921874966],[-9.80869140624992,31.42460937499996],[-9.347460937499932,32.086376953124955],[-9.245849609375,32.572460937499955],[-8.512841796874994,33.25244140625003],[-6.900976562499949,33.96904296874999],[-6.353125,34.77607421875001],[-5.924804687499943,35.78579101562502],[-5.277832031249943,35.90273437500002],[-5.252685546874972,35.61474609374997],[-4.628320312499966,35.206396484375006],[-4.329980468749937,35.161474609375006],[-3.693261718749994,35.27998046874998],[-3.394726562499926,35.21181640625005],[-2.972216796874989,35.40727539062499],[-2.839941406249949,35.127832031249994],[-2.731396484374955,35.13520507812498],[-2.636816406249977,35.11269531250002],[-2.423730468749994,35.12348632812498],[-2.219628906249966,35.10419921874998],[-1.795605468749926,34.751904296874955],[-1.67919921875,33.31865234375002],[-1.550732421874955,33.073583984375006],[-1.510009765625,32.877636718749955],[-1.45,32.784814453124966],[-1.352148437499977,32.70336914062497],[-1.29638671875,32.67568359375002],[-1.188232421875,32.608496093750006],[-1.111035156249983,32.55229492187502],[-1.065527343749949,32.46831054687496],[-1.16259765625,32.399169921875]]]},"properties":{"name":"Morocco","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[28.2125,45.450439453125],[28.07470703125,45.598974609375],[28.23945312500001,46.6408203125],[28.07177734375,46.978417968749994],[27.614062500000017,47.34052734375],[26.980761718750017,48.155029296875],[26.618945312500017,48.25986328125],[26.640429687500017,48.294140625],[26.847070312500023,48.387158203125],[26.90058593750001,48.371923828125],[27.228515625,48.371435546875],[27.549218750000023,48.477734375],[28.34052734375001,48.144433593749994],[28.42304687500001,48.146875],[29.125390625000023,47.96455078125],[29.134863281250006,47.489697265625],[29.455664062500006,47.292626953124994],[29.57197265625001,46.964013671874994],[29.7197265625,46.88291015625],[29.877832031250023,46.82890625],[29.942480468750006,46.723779296874994],[29.93476562500001,46.625],[29.92431640625,46.538867187499996],[30.13105468750001,46.423095703125],[30.07568359375,46.377832031249994],[29.878027343750006,46.360205078125],[29.837890625,46.350537109375],[29.458789062500017,46.453759765624994],[29.30488281250001,46.466601562499996],[29.22382812500001,46.376953125],[29.20458984375,46.379345703125],[29.20078125,46.50498046875],[29.18623046875001,46.523974609374996],[29.146289062500017,46.526904296874996],[28.958398437500023,46.45849609375],[28.92744140625001,46.424121093749996],[28.930566406250023,46.362255859375],[28.94375,46.288427734375],[29.00625,46.17646484375],[28.971875,46.12763671875],[28.94775390625,46.049951171874994],[28.849511718750023,45.978662109374994],[28.73876953125,45.937158203124994],[28.729296875000017,45.852001953125],[28.667578125,45.793847656249994],[28.562304687500017,45.735791015625],[28.491601562500023,45.665771484375],[28.4990234375,45.517724609374994],[28.310351562500017,45.498583984374996],[28.26484375000001,45.48388671875],[28.2125,45.450439453125]]]},"properties":{"name":"Moldova","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[49.936425781249994,-16.90292968750002],[49.82402343750002,-17.08652343750002],[50.02304687500006,-16.6953125],[49.936425781249994,-16.90292968750002]]],[[[48.3421875,-13.363867187500034],[48.21191406250003,-13.385253906249957],[48.191210937500074,-13.259960937500011],[48.308886718750074,-13.198242187499957],[48.3421875,-13.363867187500034]]],[[[49.53828125000004,-12.432128906250014],[49.9375,-13.072265624999957],[50.23535156249997,-14.732031249999963],[50.482714843750074,-15.385644531249994],[50.20898437499997,-15.960449218750028],[50.02041015625005,-15.801757812500028],[49.89257812500003,-15.457714843750011],[49.664355468750074,-15.521582031249977],[49.83906250000004,-16.486523437499997],[49.76718750000006,-16.815136718749983],[49.44931640625006,-17.240625],[49.477832031250074,-17.89853515624999],[49.362890625,-18.336328125],[47.934472656249994,-22.393945312500023],[47.55800781250005,-23.874609374999963],[47.17734375,-24.787207031249977],[46.72851562499997,-25.14990234374997],[46.15869140624997,-25.230371093750023],[45.5080078125001,-25.56318359374997],[45.2057617187501,-25.57050781250004],[44.0353515625001,-24.995703125],[43.670019531250006,-24.30029296875],[43.722265625,-23.529687500000037],[43.2648437500001,-22.38359375],[43.29052734374997,-21.93251953124998],[43.50185546875005,-21.356445312499957],[43.800195312499994,-21.179199218749986],[44.40468750000005,-19.922070312500026],[44.44882812500006,-19.42871093749997],[44.23876953124997,-19.075195312499986],[44.23310546875004,-18.740625],[44.04003906249997,-18.288476562500023],[43.979394531249994,-17.3916015625],[44.42138671874997,-16.70263671874997],[44.476171875,-16.217285156249957],[44.90917968749997,-16.174511718750026],[45.2228515625001,-15.95048828124996],[45.3421875,-16.03671875000002],[45.598242187500006,-15.992578125],[45.70019531249997,-15.813769531249989],[46.157519531250074,-15.738281249999972],[46.3996093750001,-15.924609375000017],[46.331445312499994,-15.713671875000031],[46.47509765625003,-15.513476562500003],[46.942285156249994,-15.219042968749974],[47.09921875,-15.43417968750002],[47.092578125000074,-15.150097656249969],[47.35195312500005,-14.766113281249986],[47.46474609375005,-14.713281249999966],[47.47832031250002,-15.009375],[47.77402343750006,-14.63671875],[47.964160156250074,-14.672558593750026],[47.773339843749994,-14.369921875],[47.995507812499994,-13.960449218749986],[47.88359375000002,-13.807519531250009],[47.94101562500006,-13.662402343750017],[48.03984375000002,-13.596289062499963],[48.25527343750005,-13.719335937499977],[48.796484375,-13.267480468750023],[48.91943359375003,-12.839062499999969],[48.78632812500004,-12.470898437500011],[48.931738281250006,-12.4390625],[49.20703124999997,-12.079589843749957],[49.53828125000004,-12.432128906250014]]]]},"properties":{"name":"Madagascar","childNum":3}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-91.68369140624998,18.677343750000034],[-91.81611328124995,18.675878906250006],[-91.53671874999998,18.760009765625],[-91.68369140624998,18.677343750000034]]],[[[-86.93964843750001,20.303320312500006],[-86.97797851562498,20.489794921875074],[-86.76328124999995,20.579052734374955],[-86.93964843750001,20.303320312500006]]],[[[-106.50224609374999,21.61083984375003],[-106.60703124999993,21.561474609374983],[-106.63935546874995,21.697851562499977],[-106.50224609374999,21.61083984375003]]],[[[-110.56738281249994,25.003466796875017],[-110.5388671875,24.89155273437504],[-110.69926757812499,25.081445312499994],[-110.56738281249994,25.003466796875017]]],[[[-112.05727539062498,24.545703125000017],[-112.29677734375002,24.789648437500063],[-112.15942382812501,25.28564453125003],[-112.19501953124998,24.841064453125057],[-112.05727539062498,24.545703125000017]]],[[[-111.10029296874998,26.020605468750006],[-111.224658203125,25.83588867187504],[-111.18291015625002,26.040625],[-111.10029296874998,26.020605468750006]]],[[[-115.17060546875001,28.06938476562496],[-115.35292968750002,28.103955078124983],[-115.23354492187495,28.36835937500004],[-115.17060546875001,28.06938476562496]]],[[[-112.20307617187503,29.00532226562504],[-112.27841796875,28.769335937500017],[-112.51406249999997,28.847607421874955],[-112.42353515625,29.203662109375017],[-112.28505859374994,29.240429687499955],[-112.20307617187503,29.00532226562504]]],[[[-113.15561523437502,29.05224609375],[-113.49633789062497,29.30761718749997],[-113.58720703125002,29.57304687499996],[-113.20214843749999,29.301855468750034],[-113.15561523437502,29.05224609375]]],[[[-97.14624023437494,25.961474609375045],[-97.66767578124995,24.389990234374977],[-97.84248046874995,22.510302734375017],[-97.76328124999998,22.105859374999966],[-97.31450195312496,21.56420898437503],[-97.40917968749997,21.272558593750034],[-97.38344726562497,21.56669921874999],[-97.75380859375002,22.02666015624999],[-97.18632812499996,20.717041015625],[-96.45605468749994,19.869775390624966],[-96.28955078124994,19.34375],[-95.778125,18.805517578125034],[-95.92036132812495,18.81958007812497],[-95.62680664062503,18.690576171874994],[-95.71982421874998,18.768359375000017],[-95.18183593749995,18.700732421875017],[-94.79814453124996,18.51459960937501],[-94.45976562499993,18.166650390624994],[-93.55234375,18.430468750000017],[-92.88476562499997,18.468652343749966],[-92.44101562499998,18.67529296874997],[-91.97377929687502,18.715869140625074],[-91.91357421875,18.52851562500001],[-91.53398437499993,18.45654296875],[-91.27524414062498,18.62446289062501],[-91.34306640624996,18.900585937499955],[-91.43666992187502,18.889794921874966],[-90.73925781249994,19.352246093749955],[-90.69316406249996,19.729882812499966],[-90.49169921874997,19.94677734375003],[-90.353125,21.009423828124966],[-89.81977539062495,21.274609374999983],[-88.46669921874997,21.569384765625017],[-88.0068359375,21.604052734375045],[-87.25087890625,21.44697265625004],[-87.18828124999993,21.546435546875045],[-87.36850585937498,21.57373046875],[-87.034765625,21.592236328124955],[-86.824072265625,21.421679687500017],[-86.77177734374999,21.150537109375023],[-86.92622070312493,20.786474609375034],[-87.42138671875,20.23139648437501],[-87.44174804687498,19.861523437499983],[-87.68769531249998,19.63710937499999],[-87.6453125,19.55390625000001],[-87.42475585937498,19.583349609375063],[-87.65869140625003,19.352343750000074],[-87.65576171874997,19.25786132812499],[-87.50107421874998,19.287792968749983],[-87.76181640624998,18.446142578125006],[-87.88198242187497,18.27387695312501],[-88.05644531249996,18.524462890625074],[-88.03173828125,18.838916015625017],[-88.29565429687494,18.47241210937503],[-88.52299804687499,18.445898437500063],[-88.80634765624998,17.965527343749983],[-89.13354492187503,17.970800781249977],[-89.16147460937503,17.81484375],[-90.98916015624997,17.81640624999997],[-90.99296874999993,17.25244140625],[-91.19550781249998,17.254101562499983],[-91.40961914062501,17.255859375],[-90.975830078125,16.867822265624994],[-90.710693359375,16.708105468750034],[-90.65996093749996,16.630908203125045],[-90.634375,16.565136718749955],[-90.63408203125002,16.51074218749997],[-90.57578124999995,16.467822265625017],[-90.47109374999994,16.439550781250034],[-90.41699218750003,16.391015625000023],[-90.41699218750003,16.351318359375],[-90.45014648437493,16.261376953124994],[-90.45986328124997,16.16235351562497],[-90.44716796874994,16.07270507812501],[-90.52197265625,16.07119140625005],[-90.70322265624998,16.07104492187503],[-90.97958984374998,16.07080078124997],[-91.433984375,16.070458984374994],[-91.736572265625,16.070166015625006],[-91.95722656250001,15.703222656250034],[-92.08212890624998,15.495556640625011],[-92.18715820312497,15.320898437499963],[-92.07480468749998,15.074218749999972],[-92.09873046874998,15.026757812499994],[-92.14423828125001,15.001953125],[-92.158544921875,14.963574218749997],[-92.23515625,14.545410156249986],[-93.91606445312493,16.053564453125006],[-94.374169921875,16.284765625000034],[-94.426416015625,16.22626953125001],[-94.00126953124996,16.018945312499966],[-94.66152343750002,16.20190429687503],[-94.58710937499995,16.315820312499966],[-94.79082031249999,16.28715820312499],[-94.85869140624996,16.41972656249999],[-95.02084960937503,16.277636718750017],[-94.79941406249995,16.20966796875001],[-95.134375,16.17695312500001],[-96.21357421874993,15.693066406250011],[-96.80795898437495,15.726416015624977],[-97.18466796874998,15.909277343750006],[-97.75478515624994,15.966845703125017],[-98.52031249999993,16.30483398437505],[-98.76220703125,16.534765624999977],[-99.69067382812499,16.719628906249994],[-100.847802734375,17.20048828124999],[-101.91870117187494,17.959765625000045],[-102.69956054687495,18.062841796875006],[-103.44160156249995,18.32539062500001],[-103.91245117187496,18.828466796875006],[-104.9384765625,19.309375],[-105.482080078125,19.97607421875003],[-105.66943359374997,20.385595703124977],[-105.26015625,20.579052734374955],[-105.32705078124994,20.752978515625045],[-105.51083984374999,20.808740234375023],[-105.23706054687499,21.119189453125045],[-105.20869140624998,21.490820312499977],[-105.43144531249997,21.618261718750006],[-105.64912109375001,21.988085937500045],[-105.64550781249999,22.32690429687497],[-105.79179687500003,22.627490234375017],[-106.93549804687497,23.88125],[-107.76494140625002,24.47192382812497],[-107.52724609375001,24.36005859375001],[-107.51191406249998,24.489160156250023],[-107.95117187499994,24.614892578124966],[-108.28076171874994,25.08154296875],[-108.05146484374995,25.067041015624994],[-108.69638671874998,25.382910156250034],[-108.78725585937502,25.53803710937501],[-109.02880859375003,25.48046875000003],[-108.886572265625,25.733447265625045],[-109.19648437499998,25.59252929687503],[-109.38496093750001,25.727148437500006],[-109.42563476562495,26.032568359375063],[-109.19970703125003,26.30522460937499],[-109.11669921874999,26.25273437499996],[-109.27626953125,26.533886718749955],[-109.48286132812498,26.710351562500023],[-109.75478515624995,26.702929687500017],[-109.94399414062495,27.079345703125057],[-110.37729492187495,27.233300781249966],[-110.59267578124995,27.544335937500023],[-110.52988281249995,27.864208984374983],[-111.12138671875002,27.966992187499983],[-112.16176757812495,29.018896484375034],[-113.05766601562496,30.651025390625023],[-113.04672851562495,31.17924804687499],[-113.62348632812494,31.34589843750001],[-113.75942382812501,31.557763671874994],[-113.94775390625001,31.62934570312501],[-114.14931640624995,31.507373046875045],[-114.93359374999994,31.900732421874977],[-114.78989257812498,31.647119140624994],[-114.88188476562499,31.156396484375023],[-114.55048828124997,30.02226562499999],[-113.75546875,29.367480468750017],[-113.49970703124995,28.92670898437501],[-113.20556640624997,28.798779296874955],[-113.09365234375001,28.511767578125017],[-112.870849609375,28.42421875000005],[-112.73403320312501,27.825976562500017],[-112.32919921874996,27.52343750000003],[-111.86264648437495,26.678515625000017],[-111.6994140625,26.58095703125005],[-111.79526367187499,26.8796875],[-111.56967773437495,26.707617187500006],[-111.29160156249996,25.78979492187497],[-110.68676757812501,24.867675781250057],[-110.65932617187502,24.34145507812505],[-110.36743164062497,24.100488281249994],[-110.30375976562497,24.339453125],[-110.02280273437502,24.17460937499999],[-109.6765625,23.66157226562501],[-109.42084960937495,23.480126953124994],[-109.49570312500002,23.159814453125023],[-110.00625,22.894042968750057],[-110.3626953125,23.60493164062501],[-111.68291015625002,24.555810546875023],[-111.80249023437494,24.542529296875074],[-112.07255859374999,24.84003906250001],[-112.06987304687497,25.572851562500006],[-112.37724609374997,26.21391601562496],[-113.02075195312499,26.58325195312497],[-113.15581054687496,26.94624023437504],[-113.27226562499997,26.79096679687501],[-113.59853515625001,26.721289062500034],[-113.84096679687502,26.966503906249983],[-114.44526367187503,27.218164062499994],[-114.53989257812495,27.431103515624955],[-114.99350585937499,27.736035156249983],[-115.03647460937495,27.84184570312496],[-114.57001953124995,27.78393554687497],[-114.30058593749995,27.87299804687501],[-114.30224609375003,27.775732421875006],[-114.0693359375,27.67568359375005],[-114.15839843750003,27.919677734375],[-114.26586914062499,27.934472656249994],[-114.04848632812502,28.42617187499999],[-114.93730468749999,29.35161132812496],[-115.67382812500003,29.756396484375017],[-116.06215820312501,30.80415039062504],[-116.29628906250001,30.97050781249999],[-116.33344726562494,31.202783203124994],[-116.66215820312495,31.56489257812504],[-116.72207031249998,31.734570312499955],[-116.62080078124995,31.85107421874997],[-116.84799804687496,31.997363281250045],[-117.12827148437495,32.533349609374994],[-114.72475585937495,32.71533203125003],[-114.83593749999994,32.50830078125003],[-111.0419921875,31.32421875000003],[-108.21445312499993,31.329443359375034],[-108.21181640625002,31.779345703125017],[-106.44541015624996,31.768408203125006],[-106.14804687499995,31.450927734375],[-104.97880859374996,30.645947265624955],[-104.50400390624995,29.677685546874955],[-104.110595703125,29.386132812499994],[-103.16831054687498,28.998193359374994],[-102.8919921875,29.216406250000034],[-102.61494140624994,29.75234375],[-102.26894531249998,29.871191406250034],[-101.44038085937503,29.77685546875],[-100.75458984375001,29.182519531249994],[-100.29604492187495,28.32768554687499],[-99.50532226562497,27.54833984375003],[-99.45654296874999,27.05668945312496],[-99.10776367187498,26.446923828124994],[-97.37563476562497,25.871826171875],[-97.14624023437494,25.961474609375045]]]]},"properties":{"name":"Mexico","childNum":10}},{"geometry":{"type":"Polygon","coordinates":[[[22.344042968750017,42.31396484375],[22.836816406250023,41.993603515625],[23.00361328125001,41.73984375],[22.916015625,41.336279296875],[22.78388671875001,41.331982421875],[22.72480468750001,41.178515625],[22.603613281250006,41.140185546874996],[22.493554687500023,41.118505859375],[22.184472656250023,41.158642578125],[21.99335937500001,41.13095703125],[21.77949218750001,40.950439453125],[21.627539062500006,40.896337890625],[21.57578125,40.868945312499996],[20.964257812500023,40.849902343749996],[20.709277343750017,40.928369140624994],[20.48896484375001,41.272607421874994],[20.566210937500017,41.873681640624994],[20.725,41.87353515625],[20.778125,42.071044921875],[21.05976562500001,42.171289062499994],[21.28662109375,42.100390625],[21.389550781250023,42.21982421875],[21.560839843750017,42.24765625],[21.5625,42.247509765625],[21.81464843750001,42.303125],[22.344042968750017,42.31396484375]]]},"properties":{"name":"Macedonia","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[4.227636718750006,19.142773437499997],[4.234667968750017,16.996386718750003],[4.121289062500011,16.357714843750003],[3.842968750000011,15.701708984375003],[3.5205078125,15.483105468749997],[3.504296875000023,15.356347656249994],[3.06015625,15.427197265624997],[3.001074218750006,15.340966796874994],[1.300195312500023,15.272265625],[0.947460937500011,14.982128906249997],[0.217480468750011,14.911474609374991],[-0.235888671874989,15.059423828124991],[-0.760449218749983,15.047753906249994],[-1.049560546875,14.81953125],[-1.97304687499999,14.45654296875],[-2.113232421874983,14.16845703125],[-2.586718749999989,14.227587890625003],[-2.873925781249994,13.950732421875003],[-2.950830078124994,13.6484375],[-3.248632812499977,13.658349609374994],[-3.3017578125,13.28076171875],[-3.527636718749989,13.182714843749991],[-3.947314453124989,13.402197265624991],[-4.151025390624994,13.306201171875003],[-4.328710937499977,13.119042968749994],[-4.227099609374989,12.793701171875],[-4.480615234374994,12.672216796874991],[-4.4287109375,12.337597656249997],[-4.699316406249977,12.076171875],[-5.288134765624989,11.827929687499989],[-5.250244140625,11.375781249999989],[-5.490478515625,11.042382812499994],[-5.523535156249977,10.426025390625],[-5.556591796874983,10.43994140625],[-5.694287109374983,10.43320312499999],[-5.843847656249977,10.389550781249994],[-5.896191406249983,10.354736328125],[-5.907568359374977,10.307226562499991],[-6.034570312499994,10.19482421875],[-6.1171875,10.201904296875],[-6.238378906249977,10.261621093749994],[-6.241308593749977,10.279199218749994],[-6.192626953125,10.369433593749989],[-6.190673828125,10.400292968749994],[-6.250244140625,10.717919921874994],[-6.482617187499983,10.561230468749997],[-6.564599609374994,10.58642578125],[-6.654150390624977,10.656445312499997],[-6.676367187499977,10.6337890625],[-6.686132812499977,10.578027343749994],[-6.691992187499977,10.512011718749989],[-6.669335937499994,10.3921875],[-6.693261718749994,10.349462890624991],[-6.950341796874994,10.342333984374989],[-7.01708984375,10.143261718749997],[-7.385058593749989,10.340136718749989],[-7.6611328125,10.427441406249997],[-7.990625,10.1625],[-8.007275390624983,10.321875],[-8.266650390624989,10.485986328124994],[-8.33740234375,10.990625],[-8.666699218749983,11.009472656249997],[-8.398535156249977,11.366552734374991],[-8.822021484375,11.673242187499994],[-8.818310546874983,11.922509765624994],[-9.043066406249977,12.40234375],[-9.395361328124977,12.464648437499989],[-9.358105468749983,12.255419921874989],[-9.754003906249977,12.029931640624994],[-10.274853515624983,12.212646484375],[-10.709228515625,11.898730468749989],[-10.933203124999977,12.205175781249991],[-11.30517578125,12.015429687499989],[-11.502197265625,12.198632812499994],[-11.389404296875,12.404394531249991],[-11.390380859375,12.941992187499991],[-11.634960937499983,13.369873046875],[-11.831689453124994,13.315820312499994],[-12.05419921875,13.633056640625],[-11.960888671874983,13.875292968750003],[-12.019189453124994,14.206494140624997],[-12.228417968749994,14.45859375],[-12.280615234374977,14.809033203124997],[-12.104687499999983,14.745361328125],[-12.08154296875,14.766357421875],[-12.021582031249977,14.804931640625],[-11.76015625,15.425537109375],[-11.675878906249977,15.512060546874991],[-11.502685546875,15.636816406249991],[-11.455224609374994,15.62539062499999],[-10.9482421875,15.151123046875],[-10.696582031249989,15.42265625],[-9.94140625,15.373779296875],[-9.446923828124994,15.458203125],[-9.447705078124983,15.574853515624994],[-9.426562499999989,15.623046875],[-9.3505859375,15.677392578124994],[-9.33544921875,15.525683593750003],[-9.293701171875,15.502832031249994],[-5.5125,15.496289062499997],[-5.359912109374989,16.282861328124994],[-5.509619140624977,16.442041015624994],[-5.628662109375,16.568652343750003],[-5.65625,16.8095703125],[-5.684765624999983,17.058251953124994],[-5.713183593749989,17.306884765625],[-5.74169921875,17.555566406249994],[-5.827099609374983,18.3015625],[-6.026416015624989,20.0421875],[-6.396582031249977,23.274804687499994],[-6.482031249999977,24.020800781250003],[-6.538964843749994,24.51816406249999],[-6.5673828125,24.766796875],[-6.594091796874977,24.99462890625],[-6.287207031249977,24.994824218749997],[-5.959814453124977,24.99497070312499],[-5.640771484374994,24.995166015625003],[-4.822607421874977,24.99560546875],[-1.947900390624994,23.124804687500003],[1.1455078125,21.102246093749997],[1.165722656250011,20.817431640625003],[1.610644531250017,20.555566406249994],[1.685449218750023,20.378369140624997],[3.130273437500023,19.85019531249999],[3.255859375,19.4109375],[3.119726562500006,19.103173828124994],[3.3564453125,18.986621093750003],[4.227636718750006,19.142773437499997]]]},"properties":{"name":"Mali","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[14.566210937499989,35.85273437499998],[14.436425781250023,35.82167968750005],[14.351269531250011,35.978417968749994],[14.566210937499989,35.85273437499998]]]},"properties":{"name":"Malta","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[98.18261718749997,9.933447265625006],[98.11806640625,9.877880859375054],[98.2916992187501,10.051318359375031],[98.18261718749997,9.933447265625006]]],[[[98.20976562500002,10.952734375],[98.27148437499997,10.73989257812498],[98.08046875000005,10.886621093750037],[98.20976562500002,10.952734375]]],[[[98.55380859375012,11.744873046875],[98.52841796875012,11.538671875],[98.43476562500004,11.567089843750026],[98.37646484374997,11.79150390625],[98.55380859375012,11.744873046875]]],[[[98.516015625,11.905029296875028],[98.46621093750005,12.08427734374996],[98.60957031250004,11.956640624999977],[98.516015625,11.905029296875028]]],[[[98.06611328125004,12.389794921875023],[98.00234375000005,12.279003906250011],[97.93867187500004,12.34609375],[98.06611328125004,12.389794921875023]]],[[[98.41396484375005,12.597949218749974],[98.45947265625003,12.473730468749991],[98.3138671875,12.335986328124989],[98.31210937500006,12.678173828124983],[98.41396484375005,12.597949218749974]]],[[[98.31542968749997,13.099072265625026],[98.30917968750012,12.934716796875023],[98.26533203125004,13.202246093749991],[98.31542968749997,13.099072265625026]]],[[[94.80488281250004,15.8193359375],[94.73349609375006,15.823046875000045],[94.82802734375005,15.933007812499966],[94.80488281250004,15.8193359375]]],[[[94.47675781250004,15.945947265625023],[94.41191406250007,15.848388671875057],[94.3878906250001,15.994140624999972],[94.60126953125004,16.205517578124983],[94.47675781250004,15.945947265625023]]],[[[97.575,16.253222656250017],[97.48037109375,16.305712890625045],[97.54199218749997,16.505078124999983],[97.575,16.253222656250017]]],[[[93.6908203125,18.68427734375004],[93.4875,18.867529296875063],[93.74472656250006,18.865527343750017],[93.6908203125,18.68427734375004]]],[[[93.71484374999997,19.558251953124994],[93.94570312500005,19.428613281249966],[93.90195312500012,19.33203125],[93.75585937500003,19.325683593750057],[93.64404296874997,19.49506835937501],[93.71484374999997,19.558251953124994]]],[[[93.49179687500012,19.892578125],[93.51328125000006,19.754785156249994],[93.41289062500002,19.950341796875023],[93.49179687500012,19.892578125]]],[[[93.01015625000005,19.923925781249977],[93.02324218750007,19.82885742187497],[92.91464843750006,20.086474609375045],[93.01015625000005,19.923925781249977]]],[[[101.1388671875001,21.567480468749977],[101.08037109375007,21.468652343749994],[100.703125,21.251367187499966],[100.613671875,21.059326171875],[100.56660156250004,21.038183593750063],[100.53613281250003,20.992382812499955],[100.52226562500007,20.92192382812499],[100.54931640624997,20.884228515624955],[100.61767578125003,20.879248046875006],[100.62294921875005,20.859570312499983],[100.5651367187501,20.825097656249994],[100.4074218750001,20.823242187500057],[100.32607421875005,20.795703125000045],[100.24931640625002,20.730273437500045],[100.18388671875002,20.589111328125057],[100.12968750000002,20.372216796874994],[100.12246093750005,20.316650390625057],[100.0036132812501,20.37958984375001],[99.9542968750001,20.415429687500023],[99.8903320312501,20.424414062499977],[99.72011718750005,20.32543945312497],[99.45888671875005,20.363037109375],[99.48593750000006,20.14985351562501],[99.07421875000003,20.09936523437503],[98.9166992187501,19.77290039062504],[98.37128906250004,19.68916015625004],[98.01503906250005,19.74951171874997],[97.816796875,19.459960937500057],[97.74589843750002,18.58818359374999],[97.37392578125,18.51796875],[97.63222656250005,18.290332031250074],[97.7064453125,17.79711914062503],[98.4388671875,16.975683593750034],[98.66074218750006,16.330419921875006],[98.83544921875003,16.417578125],[98.88828125000006,16.351904296875034],[98.81796875000012,16.180810546874994],[98.59238281250006,16.05068359375005],[98.55693359375007,15.367675781249986],[98.19101562500012,15.204101562499972],[98.20214843749997,14.97592773437502],[98.57001953125004,14.359912109375031],[99.13681640625006,13.716699218749994],[99.12392578125,13.030761718750043],[99.40507812500002,12.547900390625003],[99.61474609374997,11.781201171875026],[99.1901367187501,11.105273437499989],[98.7572265625,10.660937499999974],[98.70253906250005,10.19038085937504],[98.56259765625006,10.034960937499989],[98.46494140625006,10.675830078124989],[98.67558593750007,10.986914062500034],[98.74140625000004,11.591699218749966],[98.87597656250003,11.719726562500028],[98.63632812500006,11.738378906250006],[98.69628906250003,12.225244140624994],[98.6002929687501,12.2453125],[98.67871093749997,12.348486328124963],[98.57597656250002,13.161914062500031],[98.20039062500004,13.980175781250026],[98.14951171875012,13.647607421875037],[98.11064453125007,13.712890625000014],[98.10019531250006,14.161523437500023],[97.90976562500012,14.652685546874991],[98.01875,14.652587890625057],[97.81230468750007,14.858935546874989],[97.7103515625,15.875537109375074],[97.58427734375007,16.019580078125017],[97.72597656250005,16.56855468750004],[97.37587890625005,16.52294921874997],[97.20019531249997,17.095410156249983],[96.85146484375005,17.401025390624994],[96.90859375000005,17.03095703125001],[96.76542968750002,16.710351562499966],[96.43115234374997,16.504931640625045],[96.18906250000012,16.768310546875057],[96.32431640625006,16.444433593750063],[95.76328125000006,16.169042968750006],[95.38955078125005,15.722753906250034],[95.30146484375004,15.756152343749989],[95.34677734375012,16.09760742187501],[95.17695312500004,15.825683593750028],[94.9425781250001,15.818261718750023],[94.89316406250006,16.182812499999955],[94.66152343750005,15.904394531250006],[94.70332031250004,16.511914062499955],[94.4416015625001,16.094384765624966],[94.22382812500004,16.016455078125006],[94.58896484375006,17.5693359375],[94.17070312500007,18.73242187499997],[94.24570312500006,18.741162109374983],[94.07001953125004,18.893408203125006],[94.04492187500003,19.287402343750074],[93.92919921874997,18.89965820312503],[93.70546875000005,19.026904296875017],[93.49306640625005,19.369482421875006],[93.82490234375004,19.238476562499955],[93.99814453125006,19.440869140624983],[93.61171875000005,19.776074218749983],[93.70703125000003,19.912158203125074],[93.25,20.070117187500017],[93.12949218750012,19.858007812500063],[93.00195312499997,20.074853515624994],[93.06679687500005,20.377636718749955],[92.82832031250004,20.177587890625063],[92.89111328124997,20.34033203125],[92.73564453125007,20.56269531250001],[92.72285156250004,20.29560546875004],[92.32412109375,20.791845703125063],[92.17958984375005,21.293115234375023],[92.33056640624997,21.439794921874977],[92.63164062500002,21.306201171875045],[92.5934570312501,21.46733398437499],[92.58281250000002,21.940332031249994],[92.57490234375004,21.978076171875045],[92.68896484374997,22.130957031250006],[92.72099609375002,22.132421875000063],[92.77138671875,22.104785156250017],[92.9645507812501,22.003759765625034],[93.07060546875002,22.20942382812501],[93.16201171875,22.360205078125006],[93.07871093750006,22.71821289062501],[93.20390625000002,23.03701171875005],[93.34941406250007,23.08496093750003],[93.36601562500007,23.132519531249955],[93.32626953125006,24.064208984375057],[93.45214843750003,23.987402343750034],[93.68339843750007,24.00654296875004],[94.07480468750006,23.8720703125],[94.29306640625012,24.321875],[94.37724609375002,24.473730468750006],[94.49316406250003,24.637646484374983],[94.70371093750012,25.097851562499955],[94.55302734375007,25.215722656249994],[94.66777343750007,25.458886718749966],[94.99199218750002,25.77045898437504],[95.01523437500006,25.912939453125006],[95.0929687500001,25.98730468749997],[95.13242187500006,26.041259765625057],[95.12929687500005,26.070410156250034],[95.10839843749997,26.091406250000034],[95.06894531250006,26.19111328125001],[95.0597656250001,26.473974609375006],[95.20146484375007,26.641406250000017],[96.19082031250005,27.26127929687499],[96.79785156249997,27.29619140624999],[96.95341796875002,27.13330078125003],[97.10205078125003,27.11542968750004],[97.10371093750004,27.16333007812503],[96.90195312500012,27.439599609374994],[96.88359375000002,27.514843749999955],[96.96279296875,27.698291015625017],[97.04970703125005,27.760009765625],[97.34355468750002,27.982324218749994],[97.30273437499997,28.08598632812496],[97.3224609375001,28.21796875000004],[97.35644531249997,28.254492187500006],[97.43144531250002,28.353906250000023],[97.53789062500002,28.510205078124983],[97.59921875000006,28.51704101562504],[98.06162109375012,28.185888671874977],[98.29882812499997,27.550097656250045],[98.4525390625,27.6572265625],[98.65117187500007,27.572460937499983],[98.7384765625001,26.785742187500006],[98.68554687499997,26.189355468750023],[98.56406250000006,26.072412109374994],[98.65625,25.86357421874999],[98.33378906250007,25.586767578125006],[98.14287109375007,25.571093750000017],[98.01074218749997,25.292529296875017],[97.8195312500001,25.251855468749994],[97.73789062500006,24.869873046875057],[97.58330078125002,24.77480468750005],[97.53144531250004,24.49169921875003],[97.7082031250001,24.228759765625],[97.56455078125012,23.911035156250023],[98.2125,24.110644531250017],[98.83505859375006,24.121191406250034],[98.67675781250003,23.905078125000045],[98.8322265625001,23.624365234374977],[98.86376953125003,23.191259765625034],[99.41806640625006,23.069238281250023],[99.50712890625002,22.959130859374994],[99.19296875000006,22.12597656249997],[99.9176757812501,22.02802734375001],[99.94072265625007,21.75874023437504],[100.14765625000004,21.480517578125017],[100.60458984375012,21.471777343750006],[101.07978515625004,21.75585937499997],[101.1388671875001,21.567480468749977]]]]},"properties":{"name":"Myanmar","childNum":15}},{"geometry":{"type":"Polygon","coordinates":[[[19.21875,43.449951171875],[19.670996093750006,43.163964843749994],[20.344335937500006,42.827929687499996],[20.054296875,42.760058593749996],[20.06396484375,42.54726562499999],[19.78828125000001,42.476171875],[19.65449218750001,42.628564453124994],[19.280664062500023,42.17255859375],[19.342382812500006,41.869091796875],[18.436328125000017,42.559716796874994],[18.5458984375,42.6416015625],[18.46601562500001,42.777246093749994],[18.44384765625,42.96845703125],[18.46015625000001,42.997900390625],[18.48847656250001,43.012158203125],[18.623632812500006,43.027685546875],[18.621875,43.124609375],[18.674218750000023,43.230810546875],[18.74921875000001,43.283544921875],[18.85107421875,43.346337890624994],[18.934667968750006,43.339453125],[18.97871093750001,43.285400390625],[19.026660156250017,43.292431640625],[19.03671875,43.357324218749994],[18.940234375000017,43.496728515624994],[18.95068359375,43.526660156249996],[18.97421875,43.542333984375],[19.0283203125,43.532519531249996],[19.080078125,43.517724609374994],[19.11279296875,43.52773437499999],[19.164355468750017,43.535449218749996],[19.1943359375,43.53330078125],[19.21875,43.449951171875]]]},"properties":{"name":"Montenegro","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[111.878125,43.68017578125],[111.00722656250002,43.34140625],[110.400390625,42.773681640625],[109.44316406249999,42.455957031249994],[109.33984375,42.438378906249994],[108.68730468749999,42.41611328125],[108.17119140624999,42.447314453124996],[106.77001953125,42.288720703124994],[105.86757812500002,41.993994140625],[105.31435546875002,41.770898437499994],[105.19707031249999,41.738037109375],[105.11542968750001,41.66328125],[105.05058593749999,41.61591796875],[104.98203125000003,41.595507812499996],[104.49824218750001,41.65869140625],[104.49824218750001,41.877001953124996],[104.30517578125,41.846142578125],[103.99726562500001,41.79697265625],[103.71113281250001,41.751318359375],[103.07285156250003,42.00595703125],[102.5751953125,42.092089843749996],[102.15664062500002,42.158105468749994],[101.97294921874999,42.215869140624996],[101.65996093749999,42.500048828124996],[101.5791015625,42.52353515625],[101.49531250000001,42.53876953125],[101.09199218750001,42.551318359374996],[100.51904296875,42.616796875],[100.08632812500002,42.670751953125],[99.98378906250002,42.67734375],[99.46787109375003,42.568212890625],[97.20566406250003,42.789794921875],[96.38544921875001,42.720361328124994],[95.85957031250001,43.2759765625],[95.52558593750001,43.953955078125],[95.32558593750002,44.039355468749996],[95.35029296875001,44.278076171875],[94.71201171875003,44.350830078125],[93.51621093750003,44.944482421874994],[92.78789062499999,45.0357421875],[92.57890624999999,45.010986328125],[92.423828125,45.008935546874994],[92.17265624999999,45.03525390625],[92.02978515625,45.068505859374994],[91.584375,45.076513671875],[91.05,45.217431640624994],[90.87724609374999,45.19609375],[90.66181640625001,45.525244140625],[91.00175781249999,46.035791015624994],[90.99677734375001,46.10498046875],[90.94755859374999,46.177294921874996],[90.91152343750002,46.270654296874994],[90.98574218750002,46.7490234375],[90.91054687500002,46.883251953125],[90.86992187499999,46.954492187499994],[90.79902343750001,46.98515625],[90.71552734375001,47.003857421875],[90.49619140625003,47.28515625],[90.42519531250002,47.5041015625],[90.34746093749999,47.596972656249996],[90.33066406250003,47.655175781249994],[90.31328124999999,47.67617187499999],[90.19101562500003,47.702099609375],[90.10322265625001,47.745410156249996],[90.02792968750003,47.877685546875],[89.95869140625001,47.886328125],[89.91044921874999,47.8443359375],[89.83134765624999,47.823291015624996],[89.778125,47.827001953125],[89.56093750000002,48.003955078124996],[89.47919921875001,48.029052734375],[89.04765624999999,48.0025390625],[88.97109375000002,48.049951171874994],[88.91777343749999,48.089013671874994],[88.83828125000002,48.101708984374994],[88.68183593750001,48.170556640624994],[88.57597656249999,48.220166015625],[88.56679687500002,48.317431640624996],[88.51708984375,48.38447265625],[88.41396484375002,48.40341796875],[88.30996093750002,48.472070312499994],[87.97968750000001,48.555126953125],[88.06005859375,48.707177734374994],[87.83183593749999,48.791650390624994],[87.7431640625,48.881640625],[87.87216796875003,49.000146484374994],[87.81630859375002,49.0802734375],[87.8251953125,49.11630859375],[87.81425781249999,49.1623046875],[87.93476562500001,49.16455078125],[87.98808593749999,49.186914062499994],[88.02851562500001,49.219775390624996],[88.11572265625,49.256298828125],[88.19257812500001,49.451708984374996],[88.63320312500002,49.486132812499996],[88.83164062500003,49.4484375],[88.86386718750003,49.527636718749996],[88.90019531249999,49.539697265624994],[88.94541015625003,49.507666015625],[88.97060546875002,49.483740234375],[89.00839843750003,49.472802734374994],[89.10947265625003,49.501367187499994],[89.17998046874999,49.5322265625],[89.20292968749999,49.595703125],[89.24394531249999,49.62705078125],[89.39560546875003,49.6115234375],[89.475,49.66054687499999],[89.57919921875003,49.69970703125],[89.65410156249999,49.71748046875],[89.64384765624999,49.90302734375],[90.0537109375,50.09375],[90.65507812499999,50.22236328125],[90.71435546875,50.259423828124994],[90.7607421875,50.305957031249996],[91.02158203125003,50.415478515625],[91.23378906250002,50.452392578125],[91.30058593749999,50.46337890625],[91.3408203125,50.470068359375],[91.4150390625,50.468017578125],[91.44648437500001,50.52216796875],[91.80429687500003,50.693603515625],[92.10400390625,50.6919921875],[92.1923828125,50.700585937499994],[92.35478515624999,50.864160156249994],[92.42636718750003,50.803076171875],[92.62666015625001,50.68828125],[92.68134765625001,50.683203125],[92.73867187500002,50.7109375],[92.779296875,50.778662109375],[92.8564453125,50.789111328124996],[92.94130859375002,50.778222656249994],[93.103125,50.60390625],[94.25107421875003,50.556396484375],[94.35468750000001,50.221826171874994],[94.61474609375,50.023730468749996],[94.67548828125001,50.028076171875],[94.71806640624999,50.043261718749996],[94.93027343750003,50.04375],[95.11142578125003,49.935449218749994],[95.52265625000001,49.91123046875],[96.06552734375003,49.99873046875],[96.31503906250003,49.901123046875],[96.98574218750002,49.8828125],[97.20859375000003,49.730810546875],[97.35976562500002,49.741455078125],[97.58935546875,49.911474609375],[98.00390625,50.0142578125],[98.25029296874999,50.30244140625],[98.27949218750001,50.533251953124996],[98.14501953125,50.5685546875],[98.07890624999999,50.603808593749996],[98.02978515625,50.64462890625],[97.82529296875003,50.985253906249994],[98.103125,51.483544921874994],[98.64052734375002,51.801171875],[98.89316406250003,52.11728515625],[99.92167968749999,51.755517578125],[100.03457031250002,51.737109375],[100.23037109375002,51.729833984375],[100.46894531250001,51.72607421875],[100.53623046875003,51.7134765625],[101.38125,51.45263671875],[101.57089843750003,51.4671875],[101.82119140625002,51.421044921874994],[102.11152343750001,51.353466796875],[102.15566406250002,51.313769531249996],[102.16005859375002,51.26083984375],[102.14238281249999,51.216064453125],[102.15195312500003,51.10751953125],[102.19453125000001,51.050683593749994],[102.21503906250001,50.829443359375],[102.31660156250001,50.71845703125],[102.28837890624999,50.585107421874994],[103.30439453125001,50.20029296875],[103.63291015625003,50.138574218749994],[103.72324218750003,50.153857421874996],[103.80263671875002,50.176074218749996],[104.07871093750003,50.154248046875],[105.38359374999999,50.47373046875],[106.21787109375003,50.304589843749994],[106.36845703124999,50.317578125],[106.57441406250001,50.32880859375],[106.71113281250001,50.31259765625],[106.94130859375002,50.196679687499994],[107.04023437500001,50.086474609374996],[107.14306640625,50.033007812499996],[107.23330078125002,49.989404296874994],[107.34707031250002,49.986669921875],[107.63095703125003,49.98310546875],[107.91660156250003,49.947802734374996],[107.96542968750003,49.653515625],[108.40693359375001,49.396386718749994],[108.5224609375,49.34150390625],[108.61367187500002,49.322802734374996],[109.23671875000002,49.334912109375],[109.45371093750003,49.296337890625],[109.52871093750002,49.269873046875],[110.19990234375001,49.17041015625],[110.42783203125003,49.219970703125],[110.70976562499999,49.14296875],[110.82792968749999,49.166162109374994],[111.20419921875003,49.304296875],[111.33662109375001,49.35585937499999],[111.42929687500003,49.342626953125],[112.07968750000003,49.42421875],[112.49492187499999,49.53232421875],[112.69736328125003,49.507275390625],[112.80644531249999,49.523583984374994],[112.91484374999999,49.569238281249994],[113.05556640625002,49.616259765624996],[113.09208984374999,49.692529296874994],[113.16416015625003,49.797167968749996],[113.31904296875001,49.874316406249996],[113.44550781250001,49.9416015625],[113.57421875,50.00703125],[114.29707031250001,50.2744140625],[114.7431640625,50.233691406249996],[115.00332031250002,50.138574218749994],[115.27451171875003,49.948876953124994],[115.36503906249999,49.911767578124994],[115.42919921875,49.896484375],[115.58798828125003,49.886035156249996],[115.7177734375,49.880615234375],[115.79521484374999,49.905908203124994],[115.92597656250001,49.9521484375],[116.13457031249999,50.010791015624996],[116.216796875,50.00927734375],[116.35117187500003,49.978076171874996],[116.55117187500002,49.9203125],[116.68330078125001,49.823779296874996],[115.82050781250001,48.57724609375],[115.79169921875001,48.455712890624994],[115.79658203125001,48.346337890624994],[115.78554687500002,48.2482421875],[115.63945312499999,48.18623046875],[115.52509765625001,48.130859375],[115.61640625000001,47.874804687499996],[115.89824218749999,47.686914062499994],[115.99384765625001,47.71132812499999],[116.07480468750003,47.78955078125],[116.23115234375001,47.858203125],[116.31718749999999,47.85986328125],[116.37822265624999,47.844042968749996],[116.51347656249999,47.83955078125],[116.65195312500003,47.864501953125],[116.76054687499999,47.869775390624994],[116.90117187499999,47.853076171874996],[116.95166015625,47.836572265624994],[117.06972656250002,47.806396484375],[117.28593749999999,47.666357421875],[117.35078125000001,47.652197265625],[117.76835937499999,47.987890625],[118.49843750000002,47.983984375],[118.56777343750002,47.943261718749994],[118.69052734375003,47.822265625],[118.75996093750001,47.757617187499996],[118.88027343750002,47.72509765625],[119.017578125,47.685351562499996],[119.08193359375002,47.654150390625],[119.71113281250001,47.15],[119.89785156250002,46.8578125],[119.8671875,46.672167968749996],[119.74746093750002,46.627197265625],[119.70664062500003,46.606005859374996],[119.62021484375003,46.603955078125],[119.47402343750002,46.62666015625],[119.33183593749999,46.613818359374996],[119.162109375,46.638671875],[118.95712890625003,46.73486328125],[118.84394531250001,46.760205078125],[118.79033203124999,46.7470703125],[118.72294921874999,46.69189453125],[118.64873046874999,46.70166015625],[118.58046875000002,46.69189453125],[118.40439453125003,46.703173828124996],[118.30869140625003,46.717041015625],[118.15683593750003,46.678564453125],[118.0712890625,46.6666015625],[117.7412109375,46.5181640625],[117.546875,46.58828125],[117.43808593750003,46.586230468749996],[117.40556640624999,46.5708984375],[117.39218750000003,46.53759765625],[117.35634765625002,46.436669921874994],[117.35693359375,46.39130859375],[117.33339843750002,46.36201171875],[116.85908203125001,46.387939453125],[116.56259765625003,46.289794921875],[116.21298828125003,45.8869140625],[116.22910156250003,45.845751953124996],[116.240625,45.79599609375],[116.19765625000002,45.73935546875],[115.68105468750002,45.458251953125],[115.16259765625,45.390234375],[114.91923828124999,45.378271484375],[114.73876953125,45.41962890625],[114.56015625000003,45.389990234375],[114.41914062500001,45.202587890625],[114.16738281250002,45.049853515624996],[114.08027343750001,44.971142578125],[113.87705078125003,44.89619140625],[113.65263671874999,44.763476562499996],[113.58701171875003,44.745703125],[113.04941406250003,44.810351562499996],[112.70673828125001,44.883447265624994],[112.59677734375003,44.91767578125],[112.49931640624999,45.0109375],[112.41132812500001,45.058203125],[112.11289062500003,45.062939453125],[112.03261718750002,45.081640625],[111.89804687500003,45.0640625],[111.40224609375002,44.36728515625],[111.93173828125003,43.81494140625],[111.878125,43.68017578125]]]},"properties":{"name":"Mongolia","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[145.75195312499997,15.133154296874991],[145.71318359375007,15.215283203125026],[145.821875,15.265380859375014],[145.75195312499997,15.133154296874991]]]},"properties":{"name":"N. Mariana Is.","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[32.112890625,-26.839453125],[32.10595703125,-26.52001953125],[32.04140625000002,-26.28125],[32.060546875,-26.018359375],[31.9482421875,-25.957617187500006],[31.98583984375,-24.46064453125001],[31.799609375000017,-23.8921875],[31.54560546875001,-23.48232421875001],[31.287890625000017,-22.40205078125001],[31.429492187500017,-22.298828125],[32.429785156250006,-21.29707031250001],[32.353613281250006,-21.136523437500003],[32.49238281250001,-20.659765625],[32.992773437500006,-19.98486328125],[32.77763671875002,-19.388769531250006],[32.84980468750001,-19.10439453125001],[32.69970703125,-18.94091796875],[32.99306640625002,-18.35957031250001],[32.87626953125002,-16.88359375],[32.94804687500002,-16.71230468750001],[31.939843750000023,-16.428808593750006],[31.236230468750023,-16.02363281250001],[30.437792968750017,-15.995312500000011],[30.39609375,-15.64306640625],[30.231835937500023,-14.990332031250006],[33.201757812500006,-14.013378906250011],[33.63642578125001,-14.568164062500003],[34.375,-14.4248046875],[34.50527343750002,-14.59814453125],[34.54082031250002,-15.297265625],[34.24609375,-15.829394531250003],[34.528125,-16.319140625],[34.93339843750002,-16.760351562500006],[35.11210937500002,-16.898535156250006],[35.06464843750001,-17.07861328125],[35.124609375,-17.127246093750003],[35.20136718750001,-17.13105468750001],[35.272558593750006,-17.118457031250003],[35.29042968750002,-17.096972656250003],[35.28115234375002,-16.80781250000001],[35.22978515625002,-16.639257812500006],[35.178320312500006,-16.573339843750006],[35.16718750000001,-16.56025390625001],[35.242773437500006,-16.375390625],[35.358496093750006,-16.160546875],[35.59931640625001,-16.12587890625001],[35.70888671875002,-16.095800781250006],[35.75527343750002,-16.05830078125001],[35.79121093750001,-15.958691406250011],[35.89277343750001,-14.891796875000011],[35.86669921875,-14.86376953125],[35.84716796875,-14.6708984375],[35.6904296875,-14.465527343750011],[35.48847656250001,-14.201074218750009],[35.37578125000002,-14.058691406250006],[35.24746093750002,-13.896875],[35.01386718750001,-13.643457031250009],[34.61152343750001,-13.437890625],[34.54570312500002,-13.21630859375],[34.542578125,-13.108691406250003],[34.35781250000002,-12.164746093750011],[34.60625,-11.690039062500006],[34.65957031250002,-11.588671875],[34.82656250000002,-11.57568359375],[34.95947265625,-11.578125],[35.1826171875,-11.574804687500006],[35.41826171875002,-11.583203125000011],[35.50439453125,-11.604785156250003],[35.56435546875002,-11.60234375],[35.630957031250006,-11.58203125],[35.78544921875002,-11.452929687500003],[35.91132812500001,-11.4546875],[36.08222656250001,-11.537304687500011],[36.17548828125001,-11.609277343750009],[36.19130859375002,-11.670703125],[36.3056640625,-11.706347656250003],[36.97890625000002,-11.566992187500006],[37.37285156250002,-11.71044921875],[37.54169921875001,-11.675097656250003],[37.72480468750001,-11.580664062500006],[37.92021484375002,-11.294726562500003],[38.491796875,-11.413281250000011],[38.9875,-11.167285156250003],[39.81708984375001,-10.912402343750003],[39.98867187500002,-10.82080078125],[40.46357421875001,-10.46435546875],[40.61171875000002,-10.661523437500009],[40.48662109375002,-10.76513671875],[40.59716796875,-10.830664062500006],[40.40283203125,-11.33203125],[40.53154296875002,-12.004589843750011],[40.48710937500002,-12.4921875],[40.58085937500002,-12.635546875],[40.43681640625002,-12.983105468750011],[40.56875,-12.984667968750003],[40.595703125,-14.122851562500003],[40.715625,-14.214453125],[40.64609375,-14.538671875],[40.775,-14.421289062500009],[40.84453125000002,-14.718652343750009],[40.617773437500006,-15.115527343750003],[40.650976562500006,-15.260937500000011],[39.98359375000001,-16.22548828125001],[39.79091796875002,-16.29453125],[39.84462890625002,-16.435644531250006],[39.084375,-16.97285156250001],[38.14492187500002,-17.242773437500006],[37.24453125000002,-17.73994140625001],[36.93935546875002,-17.993457031250003],[36.40371093750002,-18.76972656250001],[36.26289062500001,-18.71962890625001],[36.23564453125002,-18.861328125],[35.85371093750001,-18.99335937500001],[34.947851562500006,-19.81269531250001],[34.6494140625,-19.70136718750001],[34.75576171875002,-19.82197265625001],[34.705078125,-20.473046875],[34.98232421875002,-20.80625],[35.267675781250006,-21.650976562500006],[35.31572265625002,-22.396875],[35.38300781250001,-22.45458984375],[35.45634765625002,-22.11591796875001],[35.53007812500002,-22.248144531250006],[35.57539062500001,-22.96308593750001],[35.37041015625002,-23.79824218750001],[35.5419921875,-23.82441406250001],[35.48964843750002,-24.065527343750006],[34.99208984375002,-24.65058593750001],[32.96113281250001,-25.49042968750001],[32.590429687500006,-26.00410156250001],[32.84882812500001,-26.26806640625],[32.95488281250002,-26.08359375],[32.93359375,-26.25234375],[32.88916015625,-26.83046875],[32.88613281250002,-26.84931640625001],[32.353515625,-26.861621093750003],[32.19960937500002,-26.83349609375],[32.112890625,-26.839453125]]]},"properties":{"name":"Mozambique","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-16.37333984374999,19.706445312499994],[-16.437548828124932,19.609277343749994],[-16.477001953124983,19.710351562499994],[-16.343652343749994,19.86621093750003],[-16.37333984374999,19.706445312499994]]],[[[-5.359912109374989,16.282861328124994],[-5.5125,15.496289062499983],[-9.293701171875,15.502832031249994],[-9.350585937499943,15.677392578125023],[-9.38535156249992,15.667626953124994],[-9.4265625,15.623046875000057],[-9.447705078124926,15.574853515624994],[-9.446923828124937,15.458203124999955],[-9.941406249999972,15.373779296874986],[-10.696582031249989,15.42265625],[-10.9482421875,15.151123046875014],[-11.455224609374994,15.62539062499999],[-11.760156249999937,15.425537109375057],[-11.828759765624966,15.244873046875014],[-11.872851562499989,14.995166015625031],[-12.02158203124992,14.804931640625],[-12.081542968749972,14.766357421875057],[-12.104687499999955,14.745361328125043],[-12.40869140625,14.889013671874991],[-12.735253906249994,15.13125],[-13.105273437499989,15.57177734375],[-13.40966796875,16.059179687500006],[-13.756640624999989,16.172509765624994],[-13.868457031249932,16.14814453125001],[-14.300097656249932,16.58027343750001],[-14.990625,16.676904296874994],[-15.768212890624994,16.485107421875],[-16.23901367187497,16.53129882812499],[-16.44101562499992,16.20454101562504],[-16.480078124999977,16.097216796875017],[-16.50205078124992,15.917333984375063],[-16.53525390624995,15.838378906250057],[-16.53574218749995,16.28681640625001],[-16.463623046875,16.60151367187501],[-16.030322265625017,17.88793945312497],[-16.213085937499926,19.003320312500023],[-16.51445312499996,19.361962890624994],[-16.305273437499977,19.51264648437504],[-16.44487304687499,19.47314453124997],[-16.21044921875003,20.227929687500023],[-16.42978515624995,20.652343750000057],[-16.622509765624955,20.634179687499994],[-16.87607421874992,21.086132812499955],[-16.998242187499926,21.039697265625023],[-17.048046874999955,20.80615234375003],[-17.06396484375,20.89882812499999],[-16.96455078125001,21.329248046875023],[-15.231201171875,21.331298828125],[-14.084667968749926,21.33271484375001],[-13.626025390624932,21.33325195312503],[-13.396728515624943,21.333544921875017],[-13.167431640624926,21.333789062500074],[-13.016210937499949,21.33393554687501],[-13.025097656249983,21.46679687499997],[-13.032226562500028,21.572070312500017],[-13.041748046875,21.71381835937504],[-13.051220703124983,21.854785156250074],[-13.094335937499977,22.49599609375005],[-13.153271484374983,22.820507812499983],[-13.031494140624943,23.000244140625],[-12.895996093749972,23.08955078125001],[-12.739599609375006,23.192724609375063],[-12.62041015624996,23.271337890625006],[-12.559375,23.290820312500045],[-12.372900390624977,23.318017578124994],[-12.023437499999943,23.467578125000017],[-12.016308593749983,23.97021484375],[-12.016308593749983,24.378662109375],[-12.016308593749983,24.923242187499994],[-12.016308593749983,25.059375],[-12.016308593749983,25.331689453124994],[-12.016308593749983,25.740136718749994],[-12.016308593749983,25.995410156250017],[-10.376123046874966,25.995458984375034],[-9.444531249999983,25.99550781250005],[-9.071923828124937,25.99550781250005],[-8.885644531249994,25.99550781250005],[-8.682226562499949,25.99550781250005],[-8.68212890625,26.109472656250006],[-8.68212890625,26.273193359375057],[-8.682324218749955,26.49770507812505],[-8.682617187500028,26.723144531250057],[-8.682861328124972,26.92133789062501],[-8.683349609375,27.285937500000045],[-4.822607421874949,24.99560546875],[-5.640771484374994,24.99516601562499],[-5.959814453124977,24.994970703125063],[-6.287207031249977,24.99482421875001],[-6.594091796874977,24.99462890624997],[-6.396582031249977,23.274804687499994],[-6.02641601562496,20.04218750000001],[-5.827099609374955,18.301562500000045],[-5.741699218749943,17.555566406250023],[-5.713183593750017,17.306884765625],[-5.684765624999983,17.058251953124966],[-5.628662109375028,16.568652343750045],[-5.50961914062492,16.442041015625023],[-5.359912109374989,16.282861328124994]]]]},"properties":{"name":"Mauritania","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[-62.1484375,16.74033203124999],[-62.221630859375,16.699511718750003],[-62.191357421875,16.804394531249997],[-62.1484375,16.74033203124999]]]},"properties":{"name":"Montserrat","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[57.65126953125002,-20.48486328125],[57.31767578125002,-20.42763671875001],[57.416015625,-20.18378906250001],[57.65654296875002,-19.98994140625001],[57.7919921875,-20.21259765625001],[57.65126953125002,-20.48486328125]]]},"properties":{"name":"Mauritius","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[34.95947265625003,-11.578125],[34.82656250000005,-11.575683593749972],[34.65957031250005,-11.58867187499996],[34.61855468750005,-11.620214843749991],[34.60625,-11.690039062500006],[34.3578125,-12.164746093749997],[34.542578125,-13.108691406250003],[34.54570312500002,-13.21630859375],[34.6115234375001,-13.437890625000023],[35.0138671875001,-13.64345703124998],[35.247460937499994,-13.896875],[35.37578125000002,-14.05869140625002],[35.48847656250004,-14.20107421874998],[35.69042968749997,-14.465527343750026],[35.84716796875003,-14.670898437500043],[35.8927734375001,-14.891796875000011],[35.7912109375001,-15.958691406250026],[35.75527343750005,-16.058300781249983],[35.708886718749994,-16.095800781249977],[35.5993164062501,-16.12587890624998],[35.35849609375006,-16.160546875000023],[35.242773437500006,-16.375390625],[35.16718750000004,-16.56025390625001],[35.178320312500006,-16.57333984375002],[35.22978515625002,-16.639257812500034],[35.281152343749994,-16.8078125],[35.29042968750005,-17.096972656250017],[35.27255859375006,-17.11845703124996],[35.2013671875001,-17.13105468750004],[35.124609375,-17.127246093749974],[35.06464843750004,-17.078613281250014],[35.11210937500002,-16.898535156250006],[34.93339843750002,-16.760351562500006],[34.528125,-16.319140625],[34.24609374999997,-15.829394531249974],[34.54082031250002,-15.297265625],[34.50527343750005,-14.598144531249957],[34.375,-14.4248046875],[33.63642578125004,-14.568164062499974],[33.148046875,-13.94091796875],[32.98125,-14.009375],[32.797460937500006,-13.6884765625],[32.67041015624997,-13.590429687500006],[32.96757812500002,-13.225],[32.97519531250006,-12.701367187499983],[33.51230468750006,-12.347753906249977],[33.340136718750074,-12.308300781250011],[33.25234375000005,-12.112597656250031],[33.3039062500001,-11.69082031249998],[33.23271484375002,-11.417675781250026],[33.26835937500002,-11.403906249999977],[33.379785156249994,-11.15791015625004],[33.29277343750002,-10.85234375],[33.661523437499994,-10.553125],[33.55371093749997,-10.391308593750011],[33.53759765624997,-10.351562499999986],[33.52890625,-10.234667968749974],[33.31152343750003,-10.037988281249966],[33.3371093750001,-9.954003906249994],[33.350976562499994,-9.862207031250037],[33.25,-9.759570312500003],[33.148046875,-9.603515625],[32.99599609375005,-9.622851562499946],[32.91992187500003,-9.407421875000026],[33.88886718750004,-9.670117187499983],[33.99560546875003,-9.495410156250003],[34.32089843750006,-9.731542968749977],[34.56992187500006,-10.241113281249966],[34.66708984375006,-10.792480468750028],[34.60791015624997,-11.08046875],[34.77382812500005,-11.341699218750009],[34.890625,-11.3935546875],[34.93701171874997,-11.463476562500034],[34.95947265625003,-11.578125]]]},"properties":{"name":"Malawi","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[111.38925781250006,2.415332031250031],[111.31152343749997,2.437597656250034],[111.33349609374997,2.768310546875],[111.38925781250006,2.415332031250031]]],[[[104.22158203125,2.731738281250003],[104.1291015625001,2.767236328125037],[104.18476562500004,2.871728515625009],[104.22158203125,2.731738281250003]]],[[[117.88476562499997,4.186132812500006],[117.64902343750012,4.168994140624974],[117.70800781249997,4.262402343749997],[117.88476562499997,4.186132812500006]]],[[[100.28896484375005,5.294726562499989],[100.19101562500006,5.28286132812498],[100.2455078125,5.467773437499986],[100.33886718749997,5.410058593750037],[100.28896484375005,5.294726562499989]]],[[[99.848046875,6.465722656249994],[99.9186523437501,6.358593750000011],[99.74375,6.263281249999963],[99.64628906250002,6.418359375000023],[99.848046875,6.465722656249994]]],[[[102.10107421874997,6.242236328125031],[102.34013671875002,6.172021484375023],[102.534375,5.862548828125028],[103.09707031250005,5.408447265624986],[103.41582031250007,4.85029296875004],[103.43945312499997,2.93310546875],[103.8122070312501,2.58046875],[104.21855468750002,1.722851562499997],[104.25009765625012,1.388574218750009],[104.11494140625004,1.412255859375037],[103.98144531250003,1.623632812500034],[103.99150390625002,1.454785156249997],[103.6945312500001,1.449658203125026],[103.48027343750007,1.329492187499966],[103.35683593750005,1.546142578125057],[102.72714843750012,1.855566406250034],[101.29550781250012,2.885205078125011],[101.29990234375012,3.253271484375034],[100.71542968750006,3.966210937499966],[100.79550781250012,4.023388671874983],[100.61455078125002,4.3734375],[100.34326171874997,5.984179687500031],[100.11914062499997,6.441992187500048],[100.26142578125004,6.682714843749963],[100.3454101562501,6.549902343750006],[100.75449218750012,6.460058593749991],[100.87392578125,6.24541015624996],[101.05351562500002,6.242578125],[100.98164062500004,5.771044921875045],[101.1139648437501,5.636767578125045],[101.5560546875,5.907763671875003],[101.67841796875004,5.778808593750028],[101.87363281250012,5.825292968749991],[102.10107421874997,6.242236328125031]]],[[[117.5744140625001,4.17060546875004],[117.10058593750003,4.337060546875023],[116.51474609375006,4.370800781249969],[115.86074218750005,4.348046875000037],[115.67880859375006,4.193017578124994],[115.45439453125002,3.034326171875009],[115.24697265625005,3.025927734374989],[115.117578125,2.89487304687502],[115.08076171875004,2.63422851562504],[115.1791015625,2.523193359374972],[114.78642578125002,2.250488281250014],[114.83056640625003,1.980029296874989],[114.5125,1.452001953124963],[113.90234375000003,1.434277343749997],[113.6222656250001,1.2359375],[113.00654296875004,1.433886718750003],[112.94296875000006,1.566992187500034],[112.47617187500006,1.559082031250028],[112.1857421875001,1.4390625],[112.078515625,1.143359374999974],[111.80898437500005,1.011669921874969],[111.10136718750002,1.050537109374986],[110.50576171875005,0.861962890625023],[109.65400390625004,1.614892578125023],[109.53896484375,1.89619140625004],[109.62890625000003,2.027539062499983],[109.86484375000012,1.764453125000031],[110.34921875000012,1.719726562499972],[111.22324218750012,1.395849609374991],[111.0287109375,1.557812500000026],[111.26816406250012,2.13974609375002],[111.20859375000012,2.379638671875043],[111.44384765625003,2.381542968749983],[111.5125,2.743017578124991],[112.98789062500006,3.161914062499974],[113.92392578125006,4.243212890625003],[114.0638671875,4.592675781249966],[114.65410156250007,4.037646484375045],[114.84023437500005,4.393212890625009],[114.74667968750006,4.718066406250017],[115.02675781250005,4.899707031249989],[115.10703125000006,4.390429687499974],[115.290625,4.352587890624989],[115.1400390625,4.899755859374991],[115.37490234375,4.932763671874966],[115.55449218750007,5.093554687500045],[115.41904296875012,5.413183593749963],[115.60390625,5.603417968749994],[115.74082031250012,5.533007812500045],[115.8771484375001,5.613525390625014],[116.74980468750007,6.977099609374989],[116.8498046875001,6.826708984374989],[116.78808593749997,6.606103515624994],[117.12851562500012,6.968896484375009],[117.2298828125,6.939990234374974],[117.29404296875006,6.676904296875023],[117.60966796875002,6.512646484375054],[117.69375,6.35],[117.64453124999997,6.001855468749994],[117.5011718750001,5.884667968750009],[118.00380859375,6.053320312499991],[118.11582031250006,5.8625],[117.93476562500004,5.7875],[117.97363281249997,5.70625],[118.35312500000012,5.80605468749998],[118.59482421875006,5.592089843750003],[119.22343750000007,5.412646484375031],[119.2663085937501,5.308105468750057],[119.21962890625,5.159814453125037],[118.9125,5.02290039062504],[118.26054687500007,4.988867187500034],[118.18535156250002,4.828515625000051],[118.5625,4.502148437499997],[118.54833984375003,4.379248046875006],[118.008203125,4.250244140625014],[117.6964843750001,4.342822265625045],[117.5744140625001,4.17060546875004]]],[[[117.14160156250003,7.168212890625028],[117.08066406250006,7.115283203124989],[117.06425781250007,7.26069335937504],[117.2640625,7.351660156250006],[117.26679687500004,7.220800781249991],[117.14160156250003,7.168212890625028]]]]},"properties":{"name":"Malaysia","childNum":8}},{"geometry":{"type":"Polygon","coordinates":[[[23.380664062500017,-17.640625],[24.27490234375,-17.481054687500006],[24.73291015625,-17.51777343750001],[25.001757812500017,-17.56855468750001],[25.2587890625,-17.793554687500006],[24.909082031250023,-17.821386718750006],[24.530566406250017,-18.052734375],[24.243945312500017,-18.0234375],[23.599707031250006,-18.4599609375],[23.219335937500006,-17.99970703125001],[20.97412109375,-18.31884765625],[20.9794921875,-21.9619140625],[19.977343750000017,-22.00019531250001],[19.98046875,-24.77675781250001],[19.98046875,-28.310351562500003],[19.98046875,-28.451269531250006],[19.539843750000017,-28.574609375],[19.31269531250001,-28.73330078125001],[19.24580078125001,-28.901660156250003],[19.16171875,-28.938769531250003],[18.310839843750017,-28.88623046875],[17.44794921875001,-28.69814453125001],[17.34785156250001,-28.50117187500001],[17.358691406250017,-28.26943359375001],[17.1884765625,-28.13251953125001],[17.05625,-28.031054687500003],[16.93330078125001,-28.069628906250003],[16.875292968750017,-28.1279296875],[16.841210937500023,-28.21894531250001],[16.81015625,-28.26455078125001],[16.7875,-28.39472656250001],[16.755761718750023,-28.4521484375],[16.62617187500001,-28.487890625],[16.487109375000017,-28.572851562500006],[16.447558593750017,-28.617578125],[15.719042968750017,-27.9658203125],[15.341503906250011,-27.386523437500003],[15.139062500000023,-26.50800781250001],[14.9677734375,-26.31806640625001],[14.837109375000011,-25.033203125],[14.5015625,-24.201953125],[14.462792968750023,-22.44912109375001],[13.450585937500023,-20.91669921875001],[13.168359375000023,-20.184667968750006],[12.458203125000011,-18.9267578125],[11.77587890625,-18.001757812500003],[11.733496093750006,-17.7509765625],[11.743066406250023,-17.24921875000001],[11.902539062500011,-17.2265625],[12.013964843750017,-17.168554687500006],[12.21337890625,-17.2099609375],[12.318457031250006,-17.21337890625],[12.359277343750023,-17.205859375],[12.548144531250017,-17.212695312500003],[13.179492187500017,-16.9716796875],[13.475976562500023,-17.0400390625],[14.017480468750023,-17.40888671875001],[16.1484375,-17.390234375],[18.396386718750023,-17.3994140625],[18.95527343750001,-17.803515625],[20.1943359375,-17.863671875],[20.745507812500023,-18.01972656250001],[22.32421875,-17.8375],[23.380664062500017,-17.640625]]]},"properties":{"name":"Namibia","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[167.54443359375003,-22.62324218750001],[167.44375,-22.63916015624997],[167.44345703125006,-22.541406250000037],[167.54443359375003,-22.62324218750001]]],[[[168.01093750000004,-21.429980468750017],[168.1390625,-21.44521484375001],[168.12070312500012,-21.615820312500034],[167.96679687500003,-21.641601562499957],[167.81542968749997,-21.392675781249963],[167.9884765625001,-21.337890624999986],[168.01093750000004,-21.429980468750017]]],[[[167.40087890625003,-21.16064453125003],[167.07265625,-20.99726562499997],[167.03271484374997,-20.922558593750026],[167.18945312500003,-20.803515625000017],[167.05576171875012,-20.720214843750014],[167.29794921875006,-20.732519531250034],[167.40087890625003,-21.16064453125003]]],[[[164.20234375000004,-20.246093749999957],[164.4359375,-20.282226562499957],[165.191796875,-20.768847656249974],[165.66279296875004,-21.267187499999977],[166.94238281250003,-22.09013671875003],[166.97031250000012,-22.32285156250002],[166.77412109375004,-22.37617187500004],[166.4679687500001,-22.256054687499997],[164.92744140625004,-21.289843749999974],[164.16972656250007,-20.48017578125004],[164.05966796875012,-20.141503906249966],[164.20234375000004,-20.246093749999957]]]]},"properties":{"name":"New Caledonia","childNum":4}},{"geometry":{"type":"Polygon","coordinates":[[[14.97900390625,22.99619140624999],[15.181835937500011,21.523388671874997],[15.607324218750023,20.954394531250003],[15.587109375000011,20.733300781249994],[15.963183593750017,20.34619140625],[15.735058593750011,19.904052734375],[15.474316406250011,16.908398437499997],[14.367968750000017,15.750146484374994],[13.4482421875,14.380664062500003],[13.505761718750023,14.134423828124994],[13.606347656250023,13.70458984375],[13.426953125000011,13.701757812499991],[13.323828125,13.670849609374997],[12.871679687500006,13.449023437500003],[12.65478515625,13.3265625],[12.463183593750017,13.09375],[10.958886718750023,13.371533203124997],[10.475878906250017,13.330224609374994],[10.229589843750006,13.281005859375],[10.184667968750006,13.270117187499991],[9.615917968750011,12.810644531249991],[9.201562500000023,12.821484375],[8.750585937500006,12.908154296874997],[8.4560546875,13.059667968749991],[8.095019531250017,13.291162109374994],[7.955761718750011,13.32275390625],[7.788671875,13.337890625],[7.056738281250006,13.000195312499997],[6.804296875,13.107666015625],[6.2998046875,13.658789062499991],[6.184277343750011,13.66367187499999],[5.838183593750017,13.765380859375],[5.491992187500017,13.872851562500003],[5.415820312500017,13.859179687500003],[5.361621093750017,13.836865234374997],[5.241894531250011,13.757226562499994],[4.664843750000017,13.733203125],[4.147558593750006,13.457714843749997],[3.947851562500006,12.775048828124994],[3.646679687500011,12.529980468749997],[3.595410156250011,11.6962890625],[2.805273437500006,12.383837890624989],[2.366015625000017,12.221923828125],[2.38916015625,11.897070312499991],[2.072949218750011,12.309375],[2.226269531250011,12.466064453125],[2.104589843750006,12.701269531249991],[1.56494140625,12.635400390624994],[0.9873046875,13.041894531249994],[0.988476562500011,13.36484375],[1.201171875,13.357519531249991],[0.6181640625,13.703417968750003],[0.42919921875,13.972119140624997],[0.382519531250011,14.245800781249997],[0.163867187500017,14.497216796874994],[0.217480468750011,14.911474609374991],[0.947460937500011,14.982128906249997],[1.300195312500023,15.272265625],[3.001074218750006,15.340966796874994],[3.06015625,15.427197265624997],[3.504296875000023,15.356347656249994],[3.5205078125,15.483105468749997],[3.842968750000011,15.701708984375003],[4.121289062500011,16.357714843750003],[4.234667968750017,16.996386718750003],[4.227636718750006,19.142773437499997],[5.836621093750011,19.479150390624994],[7.481738281250017,20.873095703125003],[11.967871093750006,23.517871093750003],[13.48125,23.18017578125],[14.215527343750011,22.619677734375003],[14.97900390625,22.99619140624999]]]},"properties":{"name":"Niger","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[7.30078125,4.418164062500026],[7.140429687500017,4.395117187500034],[7.227343750000045,4.527343749999972],[7.30078125,4.418164062500026]]],[[[6.804296875,13.107666015625],[7.056738281250006,13.00019531250004],[7.788671875,13.337890625],[7.955761718750011,13.322753906250028],[8.095019531250045,13.29116210937498],[8.750585937500034,12.908154296875026],[9.20156250000008,12.82148437500004],[9.615917968750011,12.810644531249963],[10.184667968750063,13.270117187499963],[10.229589843749977,13.281005859375043],[10.475878906250074,13.330224609375037],[10.958886718750051,13.371533203125011],[12.463183593750017,13.09375],[12.654785156250057,13.3265625],[13.426953125000068,13.701757812499963],[13.606347656250023,13.704589843750014],[13.932324218750011,13.258496093749997],[14.06396484375,13.078515625],[14.160058593750023,12.612792968749986],[14.184863281250017,12.447216796874997],[14.272851562500023,12.356494140624989],[14.518945312500051,12.298242187500023],[14.619726562500063,12.150976562500048],[14.559765625000011,11.492285156249963],[14.20234375000004,11.268164062499963],[14.143261718750068,11.248535156250043],[14.056738281250034,11.245019531250037],[13.981445312500057,11.21186523437504],[13.892089843750057,11.140087890624983],[13.699902343749983,10.873144531250048],[13.53535156250004,10.605078124999963],[13.414550781250028,10.171435546874989],[13.269921875000051,10.036181640624974],[13.198730468750028,9.563769531250003],[12.929492187500074,9.426269531249972],[12.87568359375004,9.303515625000017],[12.80654296875008,8.886621093749994],[12.7822265625,8.817871093750014],[12.651562500000011,8.667773437499989],[12.40351562500004,8.59555664062502],[12.311328125000074,8.419726562499989],[12.2333984375,8.282324218749977],[12.016015625000051,7.589746093750009],[11.809179687500006,7.345068359374991],[11.767382812500017,7.272265624999989],[11.861425781249977,7.11640625000004],[11.657519531250017,6.951562500000023],[11.580078125000057,6.88886718750004],[11.551660156250023,6.697265625],[11.153320312500057,6.437939453125011],[11.1064453125,6.457714843750054],[11.032519531250045,6.697900390625037],[10.954199218750006,6.7765625],[10.60625,7.063085937500006],[10.413183593750006,6.877734375],[10.293066406250034,6.876757812499974],[10.205468750000051,6.891601562499986],[10.185546874999972,6.91279296875004],[10.167773437500017,6.959179687499983],[10.143554687500057,6.99643554687502],[10.038867187500045,6.921386718750014],[9.874218750000068,6.803271484375017],[9.82070312500008,6.783935546874986],[9.779882812500034,6.760156250000023],[9.725585937499972,6.65],[9.659960937500017,6.531982421874986],[9.490234375,6.418652343749997],[8.997167968750006,5.917724609375],[8.715625,5.046875],[8.514843750000068,4.724707031250034],[8.23378906250008,4.907470703124972],[8.293066406250006,4.557617187500014],[7.644238281250068,4.525341796875011],[7.530761718750028,4.655175781249994],[7.284375,4.547656250000031],[7.076562500000051,4.716162109374991],[7.15468750000008,4.514404296875],[6.92324218750008,4.390673828125017],[6.767675781250006,4.724707031250034],[6.860351562500057,4.373339843750045],[6.633007812500011,4.340234375000051],[6.579980468750051,4.475976562499994],[6.554589843750023,4.34140625000002],[6.263671875,4.309423828124991],[6.270996093749972,4.432128906250028],[6.173339843749972,4.277392578125031],[5.970703125,4.338574218749983],[5.587792968750051,4.647216796874972],[5.448144531250023,4.945849609374974],[5.383300781250057,5.129003906249977],[5.475976562500023,5.153857421874989],[5.370019531250023,5.195019531250026],[5.367968750000045,5.337744140624963],[5.549707031250023,5.474218749999963],[5.385839843750034,5.401757812500037],[5.199218750000028,5.533544921874977],[5.456640624999977,5.61171875],[5.327343750000011,5.707519531249986],[5.112402343750034,5.64155273437504],[4.861035156250068,6.026318359374997],[4.431347656250011,6.348583984375026],[3.450781249999977,6.427050781250017],[3.71699218750004,6.597949218750017],[3.430175781250057,6.525],[3.335546875000063,6.396923828125011],[2.706445312500051,6.369238281249963],[2.735644531250045,6.595703125],[2.753710937499989,6.661767578124966],[2.774609374999983,6.711718750000017],[2.752929687500028,6.771630859374966],[2.731738281250045,6.852832031249989],[2.721386718750068,6.980273437500017],[2.75673828125008,7.067919921875017],[2.750488281250057,7.39506835937496],[2.765820312500068,7.422509765625051],[2.783984375000045,7.443408203125045],[2.78515625,7.476855468750017],[2.703125,8.371826171875],[2.774804687500023,9.048535156250026],[3.044921875,9.08383789062502],[3.325195312499972,9.778466796875051],[3.60205078125,10.004541015625009],[3.646582031250006,10.408984374999989],[3.771777343750017,10.417626953124966],[3.83447265625,10.607421875],[3.7568359375,10.76875],[3.71640625,11.07958984375],[3.695312499999972,11.12031250000004],[3.63886718750004,11.176855468750006],[3.487792968749972,11.395410156250037],[3.490527343750017,11.499218750000054],[3.55390625000004,11.631884765624989],[3.595410156250068,11.696289062500057],[3.664746093750068,11.762451171875028],[3.646679687500011,12.529980468749983],[3.947851562500006,12.775048828124994],[4.147558593750006,13.457714843749983],[4.664843750000045,13.733203124999974],[5.241894531250011,13.757226562499994],[5.361621093750074,13.836865234375054],[5.415820312500017,13.859179687499974],[5.491992187500074,13.872851562500003],[6.2998046875,13.658789062500006],[6.804296875,13.107666015625]]]]},"properties":{"name":"Nigeria","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[-83.6419921875,10.917236328125],[-83.71293945312499,10.785888671875],[-83.91928710937499,10.7353515625],[-84.6341796875,11.045605468749997],[-84.9091796875,10.9453125],[-85.5841796875,11.189453125],[-85.7443359375,11.06210937499999],[-87.670166015625,12.965673828124991],[-87.58505859374999,13.043310546874991],[-87.42436523437499,12.921142578125],[-87.33725585937499,12.979248046875],[-87.05917968749999,12.991455078125],[-87.00932617187499,13.0078125],[-86.918212890625,13.223583984374997],[-86.87353515625,13.266503906249994],[-86.792138671875,13.27978515625],[-86.72929687499999,13.284375],[-86.710693359375,13.313378906249994],[-86.76352539062499,13.63525390625],[-86.77060546874999,13.69873046875],[-86.758984375,13.746142578125003],[-86.733642578125,13.763476562500003],[-86.61025390625,13.774853515624997],[-86.376953125,13.755664062500003],[-86.33173828125,13.770068359375003],[-86.238232421875,13.899462890625003],[-86.15122070312499,13.994580078124997],[-86.0892578125,14.037207031249991],[-86.04038085937499,14.050146484374991],[-85.9837890625,13.965673828124991],[-85.78671875,13.844433593749997],[-85.75341796875,13.85205078125],[-85.73393554687499,13.858691406250003],[-85.727734375,13.876074218749991],[-85.731201171875,13.931835937499997],[-85.68193359374999,13.982568359374994],[-85.20834960937499,14.311816406250003],[-85.059375,14.582958984374997],[-84.86044921874999,14.809765625],[-84.645947265625,14.661083984374997],[-84.53764648437499,14.633398437499991],[-83.635498046875,14.876416015624997],[-83.5365234375,14.977001953124997],[-83.4150390625,15.008056640625],[-83.15751953124999,14.993066406249994],[-83.18535156249999,14.956396484374991],[-83.21591796874999,14.932373046875],[-83.27988281249999,14.812792968750003],[-83.344384765625,14.902099609375],[-83.413720703125,14.825341796874994],[-83.29921875,14.7490234375],[-83.187744140625,14.340087890625],[-83.4123046875,13.99648437499999],[-83.567333984375,13.3203125],[-83.5109375,12.411816406249997],[-83.627197265625,12.459326171874991],[-83.59335937499999,12.713085937499997],[-83.75424804687499,12.501953125],[-83.680419921875,12.024316406249994],[-83.7671875,12.059277343749997],[-83.82890624999999,11.861035156249997],[-83.70458984375,11.824560546874991],[-83.6517578125,11.642041015624997],[-83.86787109375,11.300048828125],[-83.6419921875,10.917236328125]]]},"properties":{"name":"Nicaragua","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-169.80341796875,-19.0830078125],[-169.94833984375,-19.072851562500006],[-169.834033203125,-18.96601562500001],[-169.80341796875,-19.0830078125]]]},"properties":{"name":"Niue","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-68.205810546875,12.144580078124989],[-68.25434570312495,12.032080078124977],[-68.36923828125,12.301953124999983],[-68.205810546875,12.144580078124989]]],[[[4.226171875000034,51.38647460937503],[3.902050781250011,51.20766601562502],[3.43251953125008,51.24575195312505],[3.35009765625,51.37768554687503],[4.226171875000034,51.38647460937503]]],[[[3.94912109375008,51.73945312500001],[4.07509765625008,51.648779296875006],[3.699023437500017,51.70991210937501],[3.94912109375008,51.73945312500001]]],[[[4.886132812500023,53.07070312500005],[4.70917968750004,53.036035156249994],[4.886425781249983,53.18330078124998],[4.886132812500023,53.07070312500005]]],[[[4.226171875000034,51.38647460937503],[3.448925781250068,51.54077148437503],[3.743945312500017,51.596044921875006],[4.27412109375004,51.47163085937498],[4.004785156250051,51.595849609374966],[4.182617187500057,51.61030273437498],[3.946875,51.810546875],[4.482812500000023,52.30917968749998],[4.76875,52.941308593749966],[5.061230468750068,52.96064453125001],[5.532031250000074,53.268701171874966],[6.062207031250068,53.407080078125006],[6.816210937500045,53.44116210937503],[7.197265625000028,53.28227539062499],[7.033007812500045,52.65136718749997],[6.710742187500045,52.61787109374998],[6.748828125000074,52.464013671874994],[7.035156250000057,52.38022460937498],[6.724511718749994,52.080224609374966],[6.800390625,51.96738281249998],[5.948730468750057,51.80268554687501],[6.198828125000034,51.45],[6.129980468750034,51.14741210937501],[5.857519531250034,51.030126953125006],[6.048437500000034,50.90488281250006],[5.993945312500017,50.75043945312504],[5.693554687500011,50.774755859375006],[5.796484375000034,51.153076171875],[5.214160156250045,51.278955078124966],[5.03095703125004,51.46909179687498],[4.226171875000034,51.38647460937503]]],[[[5.325781250000063,53.38574218750003],[5.190234375000074,53.39179687500001],[5.582617187500063,53.438085937500034],[5.325781250000063,53.38574218750003]]]]},"properties":{"name":"Netherlands","childNum":6,"cp":[5.0752777,52.358465]}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[5.085839843750023,60.30756835937501],[5.089062500000068,60.188769531250045],[4.95722656250004,60.44726562500006],[5.085839843750023,60.30756835937501]]],[[[4.958691406250068,61.084570312500034],[4.79902343750004,61.08271484375001],[4.861621093749989,61.19384765625],[4.958691406250068,61.084570312500034]]],[[[8.10273437500004,63.33759765625004],[7.804003906250017,63.413916015625034],[8.073535156250045,63.47080078124998],[8.10273437500004,63.33759765625004]]],[[[8.470800781250063,63.66713867187502],[8.287109375000028,63.68715820312502],[8.764648437500057,63.804638671874955],[8.78652343750008,63.703466796875034],[8.470800781250063,63.66713867187502]]],[[[11.2314453125,64.865869140625],[10.739843750000034,64.87031250000001],[11.02099609375,64.97871093749995],[11.2314453125,64.865869140625]]],[[[12.971777343750063,67.87412109375],[12.824023437500074,67.82124023437498],[13.068066406250068,68.07133789062505],[12.971777343750063,67.87412109375]]],[[[13.872851562500045,68.26533203125004],[14.096777343750034,68.218603515625],[13.229394531250051,67.995361328125],[13.300195312499994,68.16044921875007],[13.872851562500045,68.26533203125004]]],[[[15.207128906250006,68.943115234375],[15.222070312500023,68.61630859375003],[14.404687500000051,68.663232421875],[15.037792968750068,69.00053710937507],[15.207128906250006,68.943115234375]]],[[[15.760351562500006,68.56123046875001],[16.328906250000017,68.87631835937498],[16.519238281250068,68.63300781249998],[15.975292968750011,68.402490234375],[14.257519531249983,68.19077148437503],[15.412597656250028,68.61582031250003],[15.483007812500006,69.04345703125003],[16.04804687500001,69.30205078125002],[15.760351562500006,68.56123046875001]]],[[[17.503027343750034,69.59624023437502],[18.004101562500068,69.50498046874998],[17.95068359375003,69.19814453125],[17.487890625000063,69.19682617187499],[17.08251953124997,69.013671875],[16.81044921875008,69.07070312499997],[17.001757812500045,69.36191406250006],[17.36083984375003,69.38149414062497],[17.503027343750034,69.59624023437502]]],[[[29.956152343750006,69.79677734375002],[29.766210937500006,69.76752929687501],[29.835839843749994,69.90556640625005],[29.956152343750006,69.79677734375002]]],[[[20.779199218750023,70.08974609375002],[20.46425781250005,70.0765625],[20.492773437500006,70.20332031249995],[20.78603515625008,70.21953124999999],[20.779199218750023,70.08974609375002]]],[[[19.25507812500001,70.06640625000006],[19.607812500000023,70.019140625],[19.334765625000074,69.82026367187501],[18.784765625000034,69.57900390624997],[18.12988281250003,69.557861328125],[18.34931640625004,69.76787109374999],[18.67402343750004,69.78164062500002],[19.13271484375005,70.24414062500003],[19.25507812500001,70.06640625000006]]],[[[19.76748046875005,70.21669921875002],[20.005957031250034,70.07622070312502],[19.599023437499994,70.26616210937507],[19.76748046875005,70.21669921875002]]],[[[23.615332031250034,70.54931640625003],[23.15917968750003,70.28261718750005],[22.941015625000063,70.444580078125],[23.546679687500017,70.61708984374997],[23.615332031250034,70.54931640625003]]],[[[24.01757812500003,70.56738281249997],[23.716601562500074,70.561865234375],[23.778417968750063,70.74736328125005],[24.01757812500003,70.56738281249997]]],[[[23.440527343750063,70.81577148437503],[22.8291015625,70.54155273437505],[22.358691406250017,70.514794921875],[21.99453125000008,70.65712890624997],[23.440527343750063,70.81577148437503]]],[[[30.869726562500006,69.78344726562506],[30.860742187499994,69.53842773437503],[30.18017578124997,69.63583984375],[30.08730468750005,69.43286132812503],[29.38828125,69.29814453125005],[28.96582031250003,69.02197265625],[28.846289062500006,69.17690429687502],[29.33339843750005,69.47299804687503],[29.14160156250003,69.67143554687505],[27.747851562500045,70.06484375],[27.127539062500063,69.90649414062497],[26.525390625000057,69.91503906250003],[26.07246093750004,69.69155273437497],[25.748339843750017,68.99013671875],[24.94140625000003,68.59326171875006],[23.85400390625,68.80590820312503],[23.324023437500017,68.64897460937502],[22.410937500000074,68.719873046875],[21.59375,69.273583984375],[21.06611328125001,69.21411132812497],[21.065722656250017,69.04174804687503],[20.622167968750006,69.036865234375],[20.116699218750057,69.02089843750005],[20.348046875000023,68.84873046875003],[19.969824218750063,68.35639648437501],[18.303027343750045,68.55541992187497],[17.91669921875001,67.96489257812502],[17.324609375000023,68.10380859374999],[16.783593750000023,67.89501953125],[16.12744140625,67.42583007812507],[16.40351562500004,67.05498046875002],[15.422949218750006,66.48984374999998],[15.483789062500051,66.30595703124999],[14.543261718750045,66.12934570312498],[14.47968750000004,65.30146484374998],[13.650292968750023,64.58154296874997],[14.077636718750028,64.464013671875],[14.141210937500006,64.17353515624998],[13.960546875000063,64.01401367187498],[13.203515625000023,64.07509765625],[12.792773437500017,64],[12.175195312500051,63.595947265625],[11.999902343750051,63.29169921875001],[12.303515625000074,62.28559570312501],[12.155371093750006,61.720751953125045],[12.88076171875008,61.35229492187506],[12.706054687500028,61.059863281250074],[12.29414062500004,61.00268554687506],[12.588671874999989,60.450732421875045],[12.486132812500074,60.10678710937506],[11.680761718750034,59.59228515625003],[11.798144531250074,59.28989257812498],[11.64277343750004,58.92607421875002],[11.470703125000057,58.909521484375034],[11.388281250000063,59.036523437499966],[10.834472656250028,59.18393554687498],[10.595312500000063,59.764550781249966],[10.179394531250068,59.00927734375003],[9.842578125000017,58.95849609374997],[9.557226562500063,59.11269531250002],[9.65693359375004,58.97119140624997],[8.166113281250063,58.145312500000045],[7.0048828125,58.024218750000074],[6.877050781250006,58.15073242187498],[6.590527343750068,58.09731445312502],[6.659863281250068,58.26274414062499],[5.706835937500074,58.52363281250001],[5.55556640625008,58.975195312500006],[6.099023437500023,58.87026367187502],[6.363281250000028,59.00092773437501],[6.099414062500017,58.951953125000074],[5.88916015625,59.097949218750045],[5.951855468750068,59.299072265625],[6.415332031250074,59.547119140625],[5.17324218750008,59.16254882812498],[5.2421875,59.564306640625034],[5.472460937500017,59.713085937499955],[5.77216796875004,59.66093749999999],[6.216601562499989,59.818359375],[5.73046875,59.863085937500045],[6.348730468750006,60.35297851562504],[6.57363281250008,60.36059570312497],[6.526855468750057,60.152929687500034],[6.995703125,60.511962890625],[6.1533203125,60.34624023437499],[5.145800781250074,59.63881835937502],[5.205664062500006,60.087939453125045],[5.688574218749977,60.12319335937502],[5.285839843750011,60.20571289062505],[5.13710937500008,60.445605468750074],[5.648339843750051,60.68798828124997],[5.244042968750023,60.569580078125],[5.115820312500006,60.63598632812503],[5.008593750000017,61.038183593750006],[6.777832031250028,61.142431640625006],[7.038671875000063,60.952929687500045],[7.040136718750006,61.091162109375034],[7.604492187500057,61.210546875000034],[7.34658203125008,61.30058593749999],[7.442578125000011,61.43461914062502],[7.173535156250011,61.16596679687501],[6.599902343750017,61.28964843749998],[6.383496093750068,61.133886718750034],[5.451269531250034,61.10234375000002],[5.106738281250017,61.187548828125045],[5.002734375000074,61.43359375],[5.338671875000017,61.485498046874994],[4.927832031249977,61.71069335937506],[4.93007812499999,61.878320312499994],[6.01582031250004,61.7875],[6.730761718750045,61.86977539062505],[5.266894531250045,61.935595703125045],[5.143164062500063,62.159912109375],[5.908300781249977,62.41601562500003],[6.083496093750057,62.349609375],[6.580078125000057,62.407275390625045],[6.692382812500028,62.46806640624999],[6.136132812500051,62.40747070312497],[6.352929687500051,62.61113281249999],[7.653125,62.56401367187499],[7.538378906250074,62.67207031249998],[8.045507812500006,62.77124023437503],[6.734960937500006,62.72070312500003],[6.940429687500028,62.930468750000045],[7.571875,63.09951171875002],[8.100585937500028,63.090966796874966],[8.623144531250006,62.84624023437502],[8.158007812500017,63.16152343750005],[8.635546875000045,63.34233398437502],[8.360742187500023,63.498876953125034],[8.576171875000028,63.60117187499998],[9.135839843750006,63.593652343749966],[9.156054687500045,63.459326171875034],[9.696875,63.624560546875045],[10.020996093750028,63.39082031250004],[10.76015625000008,63.461279296875006],[10.725292968750068,63.625],[11.370703125000034,63.804833984374994],[11.175585937500074,63.89887695312498],[11.457617187500063,64.00297851562505],[11.306640625000028,64.04887695312499],[10.91425781250004,63.92109374999998],[10.934863281250045,63.770214843749955],[10.055078125000051,63.5126953125],[9.567285156250051,63.70615234374998],[10.565625,64.418310546875],[11.523828125000051,64.744384765625],[11.632910156250063,64.81391601562495],[11.296777343750051,64.75478515625],[11.489355468750034,64.975830078125],[12.15966796875,65.178955078125],[12.508398437499977,65.09941406250005],[12.915527343750057,65.33925781249997],[12.417578125000063,65.18408203124997],[12.133886718749977,65.27915039062498],[12.68886718750008,65.90219726562498],[13.033105468750051,65.95625],[12.783789062500063,66.10043945312506],[14.034179687500057,66.29755859374998],[13.118847656250011,66.23066406250004],[13.211425781250028,66.64082031250001],[13.959472656250028,66.79433593750002],[13.651562500000011,66.90708007812498],[14.10878906250008,67.11923828125003],[15.41572265625004,67.20244140625002],[14.441699218750045,67.27138671875005],[14.961914062500057,67.57426757812502],[15.59443359375004,67.34853515625005],[15.691503906250006,67.52138671875],[15.24873046875004,67.6021484375],[15.303906250000011,67.76528320312502],[14.854687500000068,67.66333007812506],[14.798925781250063,67.80932617187503],[15.13427734375,67.97270507812502],[15.621386718750017,67.94829101562502],[15.316015624999977,68.06875],[16.007910156250006,68.22871093750004],[16.312304687500017,67.88144531249998],[16.20380859375001,68.31674804687503],[17.552832031250063,68.42626953125006],[16.51435546875004,68.53256835937503],[18.101464843749994,69.15629882812499],[18.259765625,69.47060546875],[18.915917968750023,69.33559570312502],[18.614453125000068,69.49057617187498],[19.197265625000057,69.74785156249999],[19.722460937500017,69.78164062500002],[19.64150390625005,69.42402343750001],[20.324218750000057,69.94531249999997],[20.054492187500074,69.33266601562497],[20.486718750000023,69.54208984375],[20.739453124999983,69.52050781250003],[20.622070312500057,69.91391601562498],[21.163085937500057,69.88950195312498],[21.432910156250045,70.01318359375006],[21.974707031250034,69.83457031249998],[21.355761718750045,70.23339843749997],[22.321972656250068,70.264501953125],[22.684570312500057,70.374755859375],[23.35390625000008,69.98339843750003],[23.3291015625,70.20722656249995],[24.420019531250034,70.70200195312503],[24.263476562500017,70.82631835937497],[24.658007812500017,71.00102539062505],[25.264648437500057,70.843505859375],[25.768164062500063,70.85317382812502],[25.043847656250023,70.10903320312502],[26.66132812500004,70.93974609374999],[26.585058593750034,70.41000976562498],[26.989355468750063,70.51137695312502],[27.183691406250034,70.74404296875],[27.546484375000063,70.80400390625005],[27.23525390625008,70.94721679687498],[27.59707031250005,71.09130859375003],[28.392285156250068,70.97529296875004],[27.898046875,70.67792968750001],[28.271777343750017,70.66796875000003],[28.192968750000034,70.24858398437505],[28.83154296875003,70.86396484375001],[29.7375,70.646826171875],[30.065136718750097,70.70297851562498],[30.944140625000017,70.27441406249997],[30.262988281250074,70.12470703125004],[28.804296875000063,70.09252929687506],[29.601367187500017,69.97675781249998],[29.792089843750063,69.727880859375],[30.08828125,69.71757812500005],[30.237597656250017,69.86220703125002],[30.428320312500006,69.722265625],[30.869726562500006,69.78344726562506]]],[[[25.58632812500005,71.14208984375],[26.13378906250003,70.99580078125004],[25.582031250000057,70.960791015625],[25.31494140625,71.03413085937504],[25.58632812500005,71.14208984375]]],[[[-8.953564453124983,70.83916015625002],[-8.001367187499966,71.17768554687495],[-8.002099609374937,71.04125976562497],[-8.953564453124983,70.83916015625002]]],[[[19.219335937500006,74.39101562500002],[18.86123046875008,74.51416015624997],[19.182910156250045,74.51791992187503],[19.219335937500006,74.39101562500002]]],[[[21.60810546875004,78.59570312499997],[22.04316406250004,78.57695312500007],[22.29951171875004,78.22817382812497],[23.451953125000074,78.14946289062502],[23.11669921874997,77.99150390624999],[24.901855468750057,77.756591796875],[22.55371093750003,77.26665039062502],[22.685351562500045,77.55351562500002],[20.928125,77.45966796874998],[21.653125,77.92353515624998],[20.22792968750005,78.47783203125005],[21.60810546875004,78.59570312499997]]],[[[11.250292968750017,78.610693359375],[12.116406250000068,78.232568359375],[11.121289062500011,78.46328125],[10.558203125000063,78.90292968750003],[11.250292968750017,78.610693359375]]],[[[29.047070312500068,78.91206054687504],[29.69667968750005,78.90473632812495],[27.88906250000005,78.8521484375],[28.511132812500023,78.96733398437502],[29.047070312500068,78.91206054687504]]],[[[16.786718750000034,79.90673828125],[17.834570312499977,79.80004882812503],[17.66875,79.38593750000004],[18.39736328125008,79.60517578125001],[18.677832031250006,79.26171875000003],[19.893554687500057,79.05620117187499],[20.61103515625004,79.10664062499998],[21.388769531250034,78.74042968749998],[19.67675781250003,78.60957031249995],[16.700488281250045,76.57929687499995],[14.365820312500034,77.23447265625003],[13.995703125000034,77.50820312500002],[14.69501953125004,77.525048828125],[14.920800781250023,77.68881835937506],[17.033300781250006,77.79770507812503],[16.91406250000003,77.89799804687505],[14.089941406250063,77.77138671875],[13.680566406250051,78.028125],[14.307226562500006,78.00507812500001],[15.783886718750011,78.32705078125005],[17.00292968750003,78.36938476562497],[16.44863281250008,78.50356445312502],[16.78261718750008,78.66362304687505],[15.417382812500023,78.47324218749998],[15.384179687500023,78.77119140625001],[15.01630859375004,78.63012695312497],[14.689257812500017,78.720947265625],[14.638281250000034,78.41459960937502],[14.110449218750063,78.27089843749997],[13.150195312499989,78.2375],[11.365429687500011,78.95039062500004],[12.323437500000068,78.91425781249995],[12.083984375000028,79.26752929687498],[11.579785156250068,79.28349609375005],[11.208105468750034,79.12963867187503],[10.737597656250017,79.52016601562502],[10.804003906250045,79.79877929687504],[11.150390625,79.71699218749998],[11.702343750000011,79.82060546875005],[12.287792968750068,79.713134765625],[12.279980468749983,79.81596679687507],[13.692871093749972,79.860986328125],[13.777539062500011,79.71528320312498],[12.555371093750068,79.56948242187502],[13.333789062500017,79.57480468750006],[14.029589843750017,79.34414062500005],[14.59365234375008,79.79873046875002],[16.34375,78.97612304687502],[15.816113281250011,79.68183593750001],[16.245703125000034,80.04946289062502],[16.786718750000034,79.90673828125]]],[[[32.52597656250006,80.119140625],[31.48193359374997,80.10791015625003],[33.62929687499999,80.21743164062497],[32.52597656250006,80.119140625]]],[[[20.897851562500023,80.24995117187501],[22.289746093749983,80.04921874999997],[22.450781250000034,80.40224609375005],[23.00800781250004,80.473974609375],[23.114550781250074,80.18696289062498],[24.29755859375004,80.36040039062505],[26.86083984375,80.16000976562498],[27.19863281250008,79.90659179687506],[25.641210937500034,79.40302734374995],[23.94775390625,79.19428710937498],[22.903710937500023,79.23066406250001],[22.865527343750045,79.41186523437497],[20.861132812500017,79.39785156249997],[20.128222656250074,79.489599609375],[19.674609375000045,79.591162109375],[20.784082031250023,79.74858398437502],[18.725,79.7607421875],[18.25537109375,79.92919921875003],[18.855957031250057,80.03662109375],[17.91689453125005,80.14311523437502],[19.343359375000063,80.11640624999998],[19.733300781249994,80.47783203124999],[20.897851562500023,80.24995117187501]]]]},"properties":{"name":"Norway","childNum":27}},{"geometry":{"type":"Polygon","coordinates":[[[87.984375,27.133935546874994],[87.9931640625,27.086083984374994],[88.11103515625001,26.928466796875],[88.1572265625,26.807324218749997],[88.16152343750002,26.724804687499997],[88.11152343750001,26.58642578125],[88.05488281250001,26.430029296875],[88.02695312500003,26.39501953125],[87.9951171875,26.382373046874996],[87.28740234374999,26.360302734374997],[87.01640624999999,26.555419921875],[86.70136718750001,26.43505859375],[86.00732421875,26.649365234374997],[85.79453125000003,26.604150390624994],[85.7373046875,26.63974609375],[85.6484375,26.829003906249994],[85.56845703125003,26.83984375],[85.29296875,26.741015625],[85.19179687500002,26.766552734374997],[84.68535156249999,27.041015625],[84.65380859375,27.091699218749994],[84.65478515625,27.203662109374996],[84.64072265625003,27.249853515625],[84.61015624999999,27.298681640625],[84.48085937500002,27.348193359374996],[84.22978515624999,27.42783203125],[84.09101562500001,27.491357421874994],[83.82880859375001,27.377832031249994],[83.74697265625002,27.395947265624997],[83.55166015625002,27.456347656249996],[83.44716796875002,27.46533203125],[83.38398437500001,27.44482421875],[83.36943359374999,27.41025390625],[83.28974609375001,27.370996093749994],[82.7333984375,27.518994140624997],[82.71083984375002,27.5966796875],[82.67734375000003,27.6734375],[82.6298828125,27.687060546874996],[82.45136718750001,27.671826171874997],[82.28769531250003,27.756542968749997],[82.11191406250003,27.864941406249997],[82.03701171875002,27.900585937499997],[81.98769531250002,27.913769531249997],[81.94521484375002,27.899267578125],[81.896875,27.874462890624997],[81.85263671875003,27.867089843749994],[81.1689453125,28.335009765624996],[80.58701171875003,28.649609375],[80.51787109374999,28.665185546874994],[80.49580078125001,28.635791015624996],[80.47910156250003,28.604882812499994],[80.41855468750003,28.612011718749997],[80.32480468750003,28.66640625],[80.2265625,28.723339843749997],[80.07070312500002,28.83017578125],[80.05166015625002,28.8703125],[80.08457031250003,28.994189453124996],[80.13046875000003,29.100390625],[80.16953125000003,29.124316406249996],[80.23300781250003,29.194628906249996],[80.25595703125003,29.318017578124994],[80.2548828125,29.42333984375],[80.31689453125,29.572070312499996],[80.40185546875,29.730273437499996],[80.54902343750001,29.899804687499994],[80.81992187500003,30.119335937499997],[80.84814453125,30.13974609375],[80.90761718750002,30.171923828124996],[80.96611328124999,30.180029296875],[81.17714843750002,30.039892578125],[81.25507812500001,30.093310546874996],[81.41718750000001,30.337597656249997],[81.64189453124999,30.3875],[81.85488281250002,30.36240234375],[82.04335937500002,30.3267578125],[82.220703125,30.063867187499994],[83.15546875000001,29.612646484375],[83.58349609375,29.18359375],[83.93593750000002,29.279492187499997],[84.02197265625,29.253857421874997],[84.10136718749999,29.219970703125],[84.12783203125002,29.156298828124996],[84.17558593749999,29.036376953125],[84.22871093750001,28.911767578124994],[84.796875,28.560205078124994],[84.85507812500003,28.553613281249994],[85.06914062499999,28.609667968749996],[85.12636718750002,28.60263671875],[85.15908203125002,28.592236328124997],[85.16015625,28.571875],[85.12148437500002,28.484277343749994],[85.08857421875001,28.372265625],[85.12246093750002,28.315966796874996],[85.21210937500001,28.292626953124994],[85.41064453125,28.276025390624994],[85.67832031250003,28.27744140625],[85.75947265625001,28.220654296874997],[85.84023437500002,28.1353515625],[85.92167968749999,27.989697265624997],[85.9541015625,27.92822265625],[85.99453125000002,27.910400390625],[86.06416015625001,27.934716796874994],[86.07871093750003,28.08359375],[86.13701171874999,28.11435546875],[86.21796875000001,28.0220703125],[86.32861328125,27.959521484374996],[86.40869140625,27.928662109374997],[86.51689453124999,27.963525390624994],[86.55449218749999,28.085205078125],[86.61445312500001,28.10302734375],[86.69052734375003,28.094921875],[86.71962890625002,28.070654296875],[86.75039062500002,28.0220703125],[86.93378906250001,27.968457031249997],[87.02011718750003,27.928662109374997],[87.14140624999999,27.838330078124997],[87.29072265625001,27.821923828124994],[87.62255859375,27.815185546875],[87.86074218750002,27.886083984375],[88.10976562500002,27.87060546875],[87.984375,27.133935546874994]]]},"properties":{"name":"Nepal","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[169.17822265624997,-52.497265625],[169.12753906250006,-52.570312499999964],[169.02177734375002,-52.49541015624998],[169.17822265624997,-52.497265625]]],[[[166.22109375,-50.76152343749997],[166.2428710937501,-50.84570312499998],[165.88916015624997,-50.80771484374996],[166.10136718750002,-50.538964843750016],[166.26748046875005,-50.558593750000014],[166.22109375,-50.76152343749997]]],[[[168.14492187500005,-46.862207031249966],[168.04316406250004,-46.9326171875],[168.2409179687501,-47.070019531250026],[167.52197265624997,-47.258691406249994],[167.80078125000003,-46.90654296875002],[167.78398437500007,-46.699804687500006],[167.9557617187501,-46.69443359374998],[168.14492187500005,-46.862207031249966]]],[[[166.97949218749997,-45.17968750000003],[167.02265625000004,-45.299804687499986],[166.89267578125012,-45.24052734374999],[166.97949218749997,-45.17968750000003]]],[[[-176.17763671874997,-43.74033203124998],[-176.38173828124997,-43.86679687499998],[-176.40737304687497,-43.7609375],[-176.516552734375,-43.78476562499996],[-176.33359375000003,-44.02529296875004],[-176.51552734374997,-44.11660156249998],[-176.62934570312495,-44.036132812500014],[-176.55512695312504,-43.85195312499998],[-176.84765625000003,-43.82392578125004],[-176.56611328124995,-43.717578125000045],[-176.17763671874997,-43.74033203124998]]],[[[173.91464843750018,-40.86367187500004],[173.78085937500012,-40.921777343749966],[173.964453125,-40.71298828124998],[173.91464843750018,-40.86367187500004]]],[[[173.11533203125006,-41.27929687499997],[173.94716796875005,-40.92412109375],[173.79785156250003,-41.271972656249986],[173.99941406250005,-40.99326171874996],[174.30253906249996,-41.019531249999986],[174.03857421875003,-41.24189453125],[174.37011718750009,-41.1037109375],[174.06933593750009,-41.42949218750002],[174.08369140625015,-41.67080078124998],[174.2831054687501,-41.740625],[173.22119140624997,-42.976562499999986],[172.62402343749997,-43.27246093749996],[172.73476562500005,-43.35478515625003],[172.52666015625002,-43.464746093749966],[172.69345703125006,-43.444335937499986],[172.80703125000005,-43.620996093749994],[173.07324218750003,-43.676171874999966],[173.065625,-43.87460937499998],[172.50273437500002,-43.84365234374998],[172.48037109375,-43.726660156250034],[172.29658203125004,-43.867871093750026],[172.035546875,-43.70175781250002],[172.17978515625006,-43.895996093749986],[171.24072265624997,-44.26416015625003],[171.14628906250002,-44.9123046875],[170.99902343750003,-44.91142578124999],[171.11328125000003,-45.03925781250001],[170.7005859375,-45.68427734374997],[170.77626953125005,-45.870898437499974],[170.4191406250001,-45.94101562499996],[169.68662109375006,-46.55166015625002],[169.34228515625003,-46.62050781250001],[168.38212890625007,-46.60537109374995],[168.1891601562501,-46.362207031249966],[167.8419921875001,-46.366210937499986],[167.539453125,-46.14853515624996],[167.36894531250007,-46.24150390624999],[166.73154296875006,-46.19785156249998],[166.91669921875004,-45.95722656249998],[166.64990234374997,-46.04169921875004],[166.71796875000004,-45.88935546875001],[166.49316406249997,-45.9638671875],[166.48828124999997,-45.83183593750002],[167.0033203125,-45.71210937500004],[166.79765625000002,-45.64560546874999],[166.99082031250012,-45.531738281249986],[166.73398437500012,-45.54355468749999],[166.74306640625,-45.46845703124997],[166.91992187499997,-45.40791015624998],[166.86923828125006,-45.31123046875],[167.15566406250005,-45.410937499999974],[167.23007812500012,-45.29033203125],[167.02587890624997,-45.12363281249998],[167.25947265625004,-45.08222656249997],[167.19453125000004,-44.963476562500034],[167.41074218750006,-44.82792968750003],[167.4662109375,-44.958300781250045],[167.48496093750006,-44.77138671874998],[167.78701171875,-44.59501953125002],[167.90898437500002,-44.66474609375001],[167.85654296875012,-44.50068359374998],[168.45742187500005,-44.030566406250045],[169.17890625000004,-43.9130859375],[169.16953125000006,-43.77705078125],[169.83388671875,-43.53701171875004],[170.24023437499997,-43.163867187500045],[170.39609375000012,-43.18222656249996],[170.30283203125012,-43.10761718750004],[170.61181640625003,-43.091796875000014],[170.5236328125001,-43.00898437500001],[170.6654296875,-42.961230468749974],[170.73525390625005,-43.029785156249986],[170.96992187500004,-42.71835937499996],[171.01171875000003,-42.88505859374999],[171.027734375,-42.696093750000045],[171.31337890625005,-42.460156250000026],[171.48623046875,-41.7947265625],[171.94804687500002,-41.53867187499996],[172.13945312500002,-40.947265625000014],[172.640625,-40.51826171875001],[172.94365234375007,-40.51875],[172.73261718750004,-40.54375],[172.70439453125002,-40.6677734375],[172.988671875,-40.84824218749999],[173.11533203125006,-41.27929687499997]]],[[[175.54316406250015,-36.279296874999986],[175.34619140624997,-36.217773437499986],[175.3895507812501,-36.07773437499996],[175.54316406250015,-36.279296874999986]]],[[[173.26943359375,-34.93476562499998],[173.44785156250012,-34.844335937500034],[173.47265625000003,-34.94697265624998],[174.10400390625003,-35.14287109375002],[174.1431640625,-35.3],[174.32031250000003,-35.246679687500034],[174.58066406250018,-35.78554687500004],[174.39580078124996,-35.79736328124996],[174.8021484375,-36.30947265625001],[174.72246093750007,-36.84121093749998],[175.29951171875004,-36.99326171874996],[175.38535156250012,-37.206933593749966],[175.54248046874997,-37.2013671875],[175.46083984375005,-36.475683593750034],[175.77216796875004,-36.73515625],[176.10839843749997,-37.64511718749998],[177.27402343750012,-37.993457031249974],[178.0091796875,-37.55488281249998],[178.53623046875006,-37.69208984375004],[178.26767578125006,-38.551171875],[177.976171875,-38.72226562500005],[177.90878906250012,-39.23955078125],[177.52294921875003,-39.07382812499999],[177.07675781250012,-39.22177734375002],[176.93925781249996,-39.55527343750002],[177.10986328125009,-39.673144531250045],[176.8421875000001,-40.15781250000002],[175.98291015625003,-41.21328125000002],[175.30976562499998,-41.610644531249974],[175.16562500000012,-41.41738281249995],[174.88134765624997,-41.42402343749997],[174.8656250000001,-41.223046874999966],[174.63535156250012,-41.28945312499999],[175.1625,-40.62158203125],[175.25410156250004,-40.28935546875],[175.1559570312501,-40.11494140625],[175.00927734375009,-39.95214843749996],[173.93437500000013,-39.50908203125002],[173.76367187499997,-39.31875],[173.84433593750006,-39.13935546875001],[174.39843749999997,-38.96259765624998],[174.59736328124998,-38.78505859374995],[174.80166015625005,-37.895507812500014],[174.92802734375002,-37.80449218750003],[174.58583984374994,-37.09775390625002],[174.73427734375,-37.21523437499998],[174.92890625000004,-37.084765625000045],[174.78203125000013,-36.94375],[174.47558593750009,-36.94189453124997],[174.1888671875001,-36.492285156250034],[174.4015625000001,-36.60195312499999],[174.39277343750004,-36.24003906249999],[174.26787109375002,-36.16308593750003],[174.25371093749996,-36.24912109374998],[174.03642578125013,-36.12246093750001],[173.91445312499994,-35.908691406249986],[173.91728515625002,-36.01816406249999],[174.16640624999994,-36.327636718749986],[174.05468749999991,-36.35976562500004],[173.41220703125012,-35.542578125],[173.62617187500004,-35.31914062499996],[173.3763671875001,-35.50009765624996],[173.31396484375003,-35.44335937499996],[173.11669921874997,-35.205273437500026],[173.190625,-35.01621093749998],[172.70595703125005,-34.45517578124998],[173.04394531249997,-34.429101562499994],[172.96376953125,-34.53515625000003],[173.26943359375,-34.93476562499998]]]]},"properties":{"name":"New Zealand","childNum":9}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[58.722070312499994,20.21875],[58.640917968750074,20.210693359375057],[58.64121093750006,20.33735351562501],[58.884375,20.680566406250023],[58.95078125000006,20.516162109375017],[58.722070312499994,20.21875]]],[[[56.38798828125002,24.97919921875004],[56.640625,24.4703125],[57.12304687500003,23.980712890625],[58.773046875,23.517187499999977],[59.42939453125004,22.660839843749955],[59.82324218749997,22.50898437500004],[59.8,22.21992187500001],[59.37148437500005,21.498828125000017],[58.89570312500004,21.11279296874997],[58.47421875000006,20.406884765624966],[58.20898437500003,20.423974609374994],[58.245019531249994,20.599218749999977],[58.16943359375003,20.58950195312505],[57.86181640624997,20.24414062500003],[57.71416015625002,19.678417968749983],[57.81162109375006,19.01708984374997],[56.825976562500074,18.753515625],[56.3834960937501,17.98798828125001],[55.479101562500006,17.84326171875003],[55.25537109375003,17.58564453125004],[55.275195312500074,17.320898437500006],[55.06416015625004,17.038916015625034],[54.06816406250002,17.005517578124966],[53.60986328124997,16.75996093750004],[53.08564453125004,16.648388671874955],[51.977636718750006,18.996142578125074],[54.97734375000002,19.995947265625006],[55.64101562499999,22.001855468749994],[55.185839843750074,22.7041015625],[55.1999023437501,23.034765625000034],[55.53164062499999,23.81904296875001],[55.4684570312501,23.94111328125001],[55.98515625000002,24.063378906249966],[55.92861328125005,24.215136718750074],[55.76083984375006,24.24267578125],[55.795703125000074,24.868115234374955],[56.00058593750006,24.953222656249977],[56.06386718750005,24.73876953125],[56.38798828125002,24.97919921875004]]],[[[56.29785156250003,25.650683593750045],[56.144628906250006,25.690527343750006],[56.16748046875003,26.047460937499977],[56.08046875,26.06264648437505],[56.41308593749997,26.351171875000034],[56.29785156250003,25.650683593750045]]]]},"properties":{"name":"Oman","childNum":3}},{"geometry":{"type":"Polygon","coordinates":[[[76.76689453124999,35.66171875],[76.81279296874999,35.571826171874996],[76.88222656250002,35.4357421875],[76.927734375,35.346630859375],[77.04863281249999,35.109912109374996],[77.00087890625002,34.991992187499996],[76.78291015625001,34.900195312499996],[76.75751953125001,34.877832031249994],[76.7490234375,34.847558593749994],[76.6962890625,34.786914062499996],[76.59443359375001,34.73583984375],[76.45673828125001,34.756103515625],[76.17246093750003,34.667724609375],[76.041015625,34.669921875],[75.93828125000002,34.612548828125],[75.86210937500002,34.56025390625],[75.70917968750001,34.503076171874994],[74.300390625,34.765380859375],[74.17197265625,34.7208984375],[74.05585937500001,34.6806640625],[73.96123046875002,34.653466796874994],[73.79453125,34.378222656249996],[73.80996093750002,34.325341796874994],[73.92460937500002,34.287841796875],[73.97236328125001,34.236621093749996],[73.9794921875,34.191308593749994],[73.90390625,34.1080078125],[73.94990234375001,34.018798828125],[74.24648437500002,33.990185546875],[73.97646484375002,33.7212890625],[74.15,33.506982421874994],[73.98984375,33.22119140625],[74.30361328125002,32.991796875],[74.30546875000002,32.810449218749994],[74.35458984375,32.768701171874994],[74.58828125000002,32.753222656249996],[74.632421875,32.770898437499994],[74.66328125000001,32.757666015625],[74.64335937500002,32.607714843749996],[74.68574218750001,32.493798828124994],[74.78886718750002,32.4578125],[74.9873046875,32.462207031249996],[75.33349609375,32.279199218749994],[75.25410156250001,32.14033203125],[75.13876953125,32.104785156249996],[75.07148437500001,32.08935546875],[74.73945312500001,31.948828125],[74.6357421875,31.88974609375],[74.55556640625002,31.818554687499997],[74.5259765625,31.76513671875],[74.50996093750001,31.712939453124996],[74.58183593750002,31.52392578125],[74.59394531250001,31.465380859374996],[74.53496093750002,31.261376953124994],[74.51767578125,31.185595703124996],[74.6103515625,31.112841796874996],[74.62578125000002,31.06875],[74.6328125,31.03466796875],[74.509765625,30.959667968749997],[74.38037109375,30.893408203125],[74.33935546875,30.8935546875],[74.00898437500001,30.519677734374994],[73.89931640625002,30.435351562499996],[73.88271484375002,30.3521484375],[73.92460937500002,30.28164062499999],[73.93339843750002,30.222070312499994],[73.88652343750002,30.162011718749994],[73.8091796875,30.093359375],[73.38164062500002,29.934375],[72.9033203125,29.028759765624997],[72.34189453125,28.751904296874997],[72.2919921875,28.697265625],[72.128515625,28.346337890624994],[71.94804687500002,28.177294921874996],[71.88886718750001,28.0474609375],[71.87031250000001,27.9625],[71.54296875,27.869873046875],[71.18476562500001,27.831640625],[70.87490234375002,27.714453125],[70.79794921875,27.709619140624994],[70.69160156250001,27.768994140624997],[70.62910156250001,27.937451171874997],[70.40371093750002,28.025048828124994],[70.24433593750001,27.934130859374996],[70.1939453125,27.894873046875],[70.14453125,27.849023437499994],[70.0498046875,27.694726562499994],[69.89628906250002,27.4736328125],[69.56796875,27.174609375],[69.47001953125002,26.804443359375],[70.11464843750002,26.548046875],[70.14921875000002,26.347558593749994],[70.1001953125,25.910058593749994],[70.2646484375,25.70654296875],[70.3251953125,25.685742187499997],[70.44853515625002,25.681347656249997],[70.505859375,25.685302734375],[70.56953125000001,25.705957031249994],[70.6484375,25.666943359374997],[70.65205078125001,25.422900390625003],[70.87773437500002,25.06298828125],[70.95087890625001,24.8916015625],[71.02070312500001,24.75766601562499],[71.0478515625,24.687744140625],[71.00234375000002,24.65390625],[70.97636718750002,24.61875],[70.96982421875,24.571875],[71.04531250000002,24.429980468750003],[71.04404296875,24.400097656249997],[70.98281250000002,24.361035156249997],[70.928125,24.362353515625003],[70.88623046875,24.34375],[70.80507812500002,24.261962890625],[70.76728515625001,24.245410156250003],[70.71630859375,24.237988281249997],[70.65947265625002,24.24609375],[70.57929687500001,24.279052734375],[70.55585937500001,24.331103515625003],[70.5650390625,24.385791015625003],[70.54677734375002,24.41831054687499],[70.2890625,24.35629882812499],[70.0982421875,24.2875],[69.80517578125,24.165234375],[69.71621093750002,24.172607421875],[69.63417968750002,24.22519531249999],[69.5591796875,24.273095703124994],[69.44345703125,24.275390625],[69.23505859375001,24.268261718749997],[69.11953125000002,24.26865234374999],[69.05156250000002,24.286328125],[68.98457031250001,24.273095703124994],[68.90078125000002,24.292431640624997],[68.86347656250001,24.266503906249994],[68.82832031250001,24.26401367187499],[68.78115234375002,24.313720703125],[68.75898437500001,24.30722656249999],[68.73964843750002,24.2919921875],[68.728125,24.265625],[68.72412109375,23.96469726562499],[68.48867187500002,23.967236328124997],[68.38125,23.950878906249997],[68.28251953125002,23.927978515625],[68.1650390625,23.857324218749994],[68.11552734375002,23.753369140624997],[67.8599609375,23.90268554687499],[67.66845703125,23.810986328124997],[67.309375,24.1748046875],[67.171484375,24.756103515625],[66.70302734375002,24.8609375],[66.69863281250002,25.226318359375],[66.32421875,25.601806640625],[66.13115234375002,25.49326171874999],[66.46767578125002,25.4453125],[64.77666015625002,25.307324218749997],[64.65898437500002,25.18408203125],[64.059375,25.40292968749999],[63.556640625,25.353173828124994],[63.49140625000001,25.210839843749994],[61.56689453125,25.186328125],[61.587890625,25.20234375],[61.61542968750001,25.2861328125],[61.64013671875,25.584619140624994],[61.67138671875,25.6923828125],[61.66181640625001,25.751269531250003],[61.66865234375001,25.768994140624997],[61.73769531250002,25.82109375],[61.75439453125,25.84335937499999],[61.78076171875,25.995849609375],[61.80996093750002,26.165283203125],[61.842382812500006,26.225927734375],[62.1259765625,26.368994140625],[62.239355468750006,26.35703125],[62.31230468750002,26.490869140624994],[63.168066406250006,26.665576171874996],[63.186132812500006,26.837597656249997],[63.24160156250002,26.86474609375],[63.25039062500002,26.879248046875],[63.24208984375002,27.077685546874996],[63.30517578125,27.124560546874996],[63.30156250000002,27.15146484375],[63.25625,27.207910156249994],[63.19609375000002,27.243945312499996],[63.16679687500002,27.252490234374996],[62.75273437500002,27.265625],[62.782324218750006,27.800537109375],[62.7625,28.202050781249994],[61.88984375000001,28.546533203124994],[61.15214843750002,29.542724609375],[61.0341796875,29.663427734375],[60.843359375,29.858691406249996],[61.22441406250002,29.749414062499994],[62.0009765625,29.530419921874994],[62.4765625,29.408349609374994],[63.56757812500001,29.497998046874997],[64.09873046875,29.391943359375],[64.39375,29.544335937499994],[65.09550781250002,29.559472656249994],[66.23125,29.86572265625],[66.346875,30.802783203124996],[66.82929687500001,31.263671875],[67.45283203125001,31.234619140625],[67.737890625,31.343945312499997],[67.57822265625,31.506494140624994],[68.16103515625002,31.802978515625],[68.59765625,31.802978515625],[68.86894531250002,31.634228515624997],[69.279296875,31.936816406249996],[69.24140625000001,32.433544921875],[69.5015625,33.020068359374996],[70.26113281250002,33.289013671875],[69.8896484375,34.007275390625],[70.65400390625001,33.952294921874994],[71.05156250000002,34.049707031249994],[71.095703125,34.369433593749996],[70.965625,34.53037109375],[71.62050781250002,35.183007812499994],[71.57197265625001,35.546826171875],[71.18505859375,36.04208984375],[71.23291015625,36.12177734375],[72.24980468750002,36.734716796875],[73.116796875,36.868554687499994],[74.03886718750002,36.825732421874996],[74.54140625000002,37.02216796875],[74.69218750000002,37.0357421875],[74.8892578125,36.952441406249996],[74.94912109375002,36.968359375],[75.05390625000001,36.987158203125],[75.14521484375001,36.9732421875],[75.3466796875,36.913476562499994],[75.37685546875002,36.883691406249994],[75.42421875000002,36.738232421875],[75.46025390625002,36.725048828125],[75.57373046875,36.759326171874996],[75.66718750000001,36.741992187499996],[75.77216796875001,36.694921875],[75.84023437500002,36.649707031249996],[75.88496093750001,36.600732421874994],[75.93300781250002,36.52158203125],[75.95185546875001,36.45810546875],[75.97441406250002,36.382421875],[75.91230468750001,36.048974609374994],[76.07089843750003,35.9830078125],[76.14785156250002,35.829003906249994],[76.17783203125003,35.810546875],[76.25166015625001,35.8109375],[76.3857421875,35.837158203125],[76.50205078125003,35.878222656249996],[76.55126953125,35.887060546875],[76.5634765625,35.772998046874996],[76.6318359375,35.729394531249994],[76.7275390625,35.678662109375],[76.76689453124999,35.66171875]]]},"properties":{"name":"Pakistan","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-81.60327148437497,7.332812499999989],[-81.85205078125003,7.453320312500026],[-81.812158203125,7.59238281250002],[-81.72875976562494,7.62119140625002],[-81.60327148437497,7.332812499999989]]],[[[-78.89833984375002,8.27426757812502],[-78.960595703125,8.435839843749989],[-78.88325195312495,8.460253906249989],[-78.89833984375002,8.27426757812502]]],[[[-77.37421874999993,8.65830078125002],[-77.47851562499994,8.498437500000037],[-77.19599609374995,7.972460937500003],[-77.53828124999995,7.56625976562502],[-77.76191406249995,7.698828125000034],[-77.90117187499999,7.229345703125048],[-78.42158203124995,8.060986328125011],[-78.28735351562497,8.091796874999972],[-78.14189453125002,8.386083984374977],[-77.76054687499993,8.133251953124983],[-78.09946289062498,8.496972656250009],[-78.22304687500002,8.396630859374994],[-78.39921874999993,8.505664062500003],[-78.40986328124998,8.35532226562502],[-78.51406249999997,8.628173828125],[-79.08637695312495,8.997167968750034],[-79.50708007812494,8.97006835937502],[-79.68745117187493,8.850976562500009],[-79.81591796875,8.639208984375031],[-79.75043945312498,8.595507812500017],[-80.458984375,8.213867187499972],[-80.45810546875,8.077050781249994],[-80.01123046875,7.500048828125031],[-80.66669921874995,7.225683593750006],[-80.90122070312503,7.277148437500017],[-81.06386718749994,7.89975585937502],[-81.26840820312495,7.625488281250014],[-81.50415039062503,7.721191406249972],[-81.72763671875,8.137548828124977],[-82.15986328124995,8.19482421875],[-82.23544921874998,8.311035156250057],[-82.67954101562503,8.321972656249969],[-82.86611328124994,8.246337890625014],[-82.87934570312498,8.07065429687502],[-83.02734375,8.337744140624991],[-82.86162109374999,8.453515625000037],[-82.84477539062493,8.489355468749963],[-82.85571289062494,8.635302734375031],[-82.91704101562502,8.740332031250034],[-82.88198242187497,8.805322265625037],[-82.72783203125002,8.916064453125031],[-82.78305664062498,8.990283203124974],[-82.88134765625003,9.055859375000011],[-82.94033203124997,9.060107421874989],[-82.93984374999994,9.449169921875026],[-82.92504882812494,9.469042968749989],[-82.88896484374999,9.481005859375017],[-82.86015625,9.511474609375014],[-82.84399414062497,9.570800781250014],[-82.801025390625,9.591796875000028],[-82.64409179687502,9.505859375000028],[-82.56357421875003,9.576660156249972],[-82.50034179687503,9.523242187500017],[-82.37080078124993,9.428564453124991],[-82.33974609375,9.209179687499983],[-82.18813476562502,9.191748046874977],[-82.24418945312499,9.031494140625014],[-82.07788085937503,8.93486328124996],[-81.78022460937495,8.957226562499983],[-81.89448242187495,9.140429687500003],[-81.35478515624996,8.78056640624996],[-80.83867187499999,8.887207031250014],[-80.12709960937497,9.20991210937504],[-79.57729492187497,9.597851562500026],[-78.08276367187494,9.236279296874997],[-77.37421874999993,8.65830078125002]]]]},"properties":{"name":"Panama","childNum":3}},{"geometry":{"type":"Polygon","coordinates":[[[-73.137353515625,-6.4658203125],[-73.75810546874999,-6.90576171875],[-73.79301757812499,-7.135058593750003],[-73.758203125,-7.172753906250009],[-73.72041015625,-7.309277343750011],[-73.964306640625,-7.37890625],[-73.95849609375,-7.506640625],[-73.98173828124999,-7.535742187500006],[-74.00205078124999,-7.556054687500009],[-73.98173828124999,-7.585058593750006],[-73.946875,-7.611230468750009],[-73.89462890624999,-7.65478515625],[-73.82207031249999,-7.738964843750011],[-73.76689453124999,-7.753515625],[-73.72041015625,-7.782519531250003],[-73.73203125,-7.875390625],[-73.54912109374999,-8.345800781250006],[-73.39814453125,-8.458984375],[-73.36040039062499,-8.479296875],[-73.351708984375,-8.51416015625],[-73.35673828124999,-8.566992187500006],[-73.30244140625,-8.654003906250011],[-73.203125,-8.719335937500006],[-73.0705078125,-8.8828125],[-72.9740234375,-8.9931640625],[-72.970361328125,-9.1201171875],[-73.08984375,-9.265722656250006],[-73.209423828125,-9.411425781250003],[-72.379052734375,-9.51015625],[-72.181591796875,-10.003710937500003],[-71.33940429687499,-9.988574218750003],[-71.11528320312499,-9.852441406250009],[-71.041748046875,-9.81875],[-70.6369140625,-9.478222656250011],[-70.60791015625,-9.463671875],[-70.54111328124999,-9.4375],[-70.57016601562499,-9.48984375],[-70.592236328125,-9.54345703125],[-70.59916992187499,-9.620507812500009],[-70.642333984375,-11.01025390625],[-70.59653320312499,-10.976855468750003],[-70.53325195312499,-10.946875],[-70.45087890625,-11.024804687500009],[-70.39228515625,-11.05859375],[-70.3419921875,-11.066699218750003],[-70.29038085937499,-11.064257812500003],[-70.22006835937499,-11.04765625],[-70.06630859375,-10.982421875],[-69.9603515625,-10.929882812500011],[-69.839794921875,-10.933398437500003],[-69.6740234375,-10.9541015625],[-69.57861328125,-10.951757812500006],[-68.68525390625,-12.501953125],[-68.97861328124999,-12.880078125000011],[-69.07412109375,-13.682812500000011],[-68.87089843749999,-14.169726562500003],[-69.35947265624999,-14.7953125],[-69.37470703125,-14.962988281250006],[-69.17246093749999,-15.236621093750003],[-69.4208984375,-15.640625],[-69.21757812499999,-16.14912109375001],[-68.8427734375,-16.337890625],[-69.03291015625,-16.47597656250001],[-69.020703125,-16.6421875],[-69.62485351562499,-17.2001953125],[-69.645703125,-17.24853515625],[-69.521923828125,-17.388964843750003],[-69.510986328125,-17.46035156250001],[-69.51108398437499,-17.5048828125],[-69.5109375,-17.50605468750001],[-69.58642578125,-17.5732421875],[-69.684765625,-17.64980468750001],[-69.85209960937499,-17.70380859375001],[-69.80258789062499,-17.990234375],[-69.92636718749999,-18.2060546875],[-70.41826171874999,-18.34560546875001],[-71.33696289062499,-17.68251953125001],[-71.5322265625,-17.29433593750001],[-72.46767578125,-16.708105468750006],[-73.727685546875,-16.20166015625],[-75.104248046875,-15.411914062500003],[-75.533642578125,-14.89921875],[-75.93388671874999,-14.63359375],[-76.37646484375,-13.863085937500003],[-76.259228515625,-13.802832031250006],[-76.2236328125,-13.371191406250006],[-76.83212890624999,-12.348730468750006],[-77.152734375,-12.060351562500003],[-77.2203125,-11.663378906250003],[-77.633203125,-11.287792968750011],[-77.736083984375,-10.83671875],[-78.18559570312499,-10.089062500000011],[-78.76225585937499,-8.616992187500003],[-79.37724609374999,-7.835546875],[-79.99497070312499,-6.768945312500009],[-81.142041015625,-6.056738281250006],[-81.164306640625,-5.875292968750003],[-80.9306640625,-5.8408203125],[-80.88193359374999,-5.635058593750003],[-81.33662109375,-4.66953125],[-81.283203125,-4.322265625],[-80.503662109375,-3.49609375],[-80.324658203125,-3.387890625000011],[-80.24375,-3.576757812500006],[-80.19414062499999,-3.905859375],[-80.23051757812499,-3.924023437500011],[-80.26689453124999,-3.948828125],[-80.30327148437499,-4.005078125000011],[-80.43720703125,-3.978613281250006],[-80.49013671875,-4.010058593750003],[-80.510009765625,-4.069531250000011],[-80.49345703124999,-4.119140625],[-80.4884765625,-4.16552734375],[-80.453759765625,-4.205175781250006],[-80.35288085937499,-4.20849609375],[-80.44384765625,-4.335839843750009],[-80.4884765625,-4.393652343750006],[-80.47856445312499,-4.430078125],[-80.42416992187499,-4.46142578125],[-80.38349609375,-4.463671875],[-80.293359375,-4.416796875],[-80.1974609375,-4.31103515625],[-80.13955078125,-4.296093750000011],[-80.06352539062499,-4.327539062500009],[-79.962890625,-4.390332031250011],[-79.8451171875,-4.445898437500006],[-79.797265625,-4.476367187500003],[-79.71098632812499,-4.467578125],[-79.63852539062499,-4.454882812500003],[-79.57768554687499,-4.500585937500006],[-79.51616210937499,-4.539160156250006],[-79.501904296875,-4.670605468750011],[-79.45576171875,-4.766210937500006],[-79.3994140625,-4.840039062500011],[-79.33095703125,-4.927832031250006],[-79.26811523437499,-4.957617187500006],[-79.186669921875,-4.958203125000011],[-79.07626953124999,-4.990625],[-79.03330078124999,-4.969140625],[-78.995263671875,-4.908007812500003],[-78.97539062499999,-4.873242187500011],[-78.919189453125,-4.8583984375],[-78.92578125,-4.770703125000011],[-78.9076171875,-4.714453125],[-78.8615234375,-4.6650390625],[-78.68603515625,-4.562402343750009],[-78.64799804687499,-4.248144531250006],[-78.345361328125,-3.397363281250009],[-78.240380859375,-3.472558593750009],[-77.860595703125,-2.981640625000011],[-76.6791015625,-2.562597656250006],[-76.089794921875,-2.133105468750003],[-75.570556640625,-1.53125],[-75.42041015625,-0.962207031250003],[-75.40805664062499,-0.92431640625],[-75.24960937499999,-0.951855468750011],[-75.259375,-0.590136718750003],[-75.42470703125,-0.408886718750011],[-75.49106445312499,-0.248339843750003],[-75.56059570312499,-0.200097656250009],[-75.63203125,-0.157617187500009],[-75.62626953124999,-0.122851562500003],[-75.340478515625,-0.1421875],[-75.13837890625,-0.050488281250011],[-74.8017578125,-0.200097656250009],[-74.78046875,-0.24453125],[-74.75537109375,-0.298632812500003],[-74.691650390625,-0.335253906250003],[-74.616357421875,-0.370019531250009],[-74.555078125,-0.429882812500011],[-74.5138671875,-0.470117187500009],[-74.46518554687499,-0.517675781250006],[-74.41787109375,-0.580664062500006],[-74.334423828125,-0.850878906250003],[-74.28388671875,-0.927832031250006],[-74.24638671874999,-0.970605468750009],[-74.05439453125,-1.028613281250003],[-73.98681640625,-1.09814453125],[-73.926953125,-1.125195312500011],[-73.86318359375,-1.196679687500009],[-73.664306640625,-1.248828125],[-73.4962890625,-1.693066406250011],[-73.19697265625,-1.830273437500011],[-73.1544921875,-2.278222656250009],[-72.9896484375,-2.339746093750009],[-72.94111328125,-2.39404296875],[-72.21845703125,-2.400488281250006],[-71.98427734375,-2.3265625],[-71.93247070312499,-2.288671875],[-71.86728515624999,-2.227734375000011],[-71.802734375,-2.166308593750003],[-71.75253906249999,-2.152734375],[-71.55947265625,-2.22421875],[-71.39697265625,-2.334082031250006],[-71.19638671874999,-2.313085937500006],[-71.11337890624999,-2.245410156250003],[-71.027294921875,-2.225781250000011],[-70.96855468749999,-2.206835937500003],[-70.70537109374999,-2.341992187500011],[-70.64799804687499,-2.40576171875],[-70.57587890625,-2.418261718750003],[-70.29462890625,-2.552539062500003],[-70.24443359374999,-2.606542968750006],[-70.16474609375,-2.639843750000011],[-70.095849609375,-2.658203125],[-70.735107421875,-3.781542968750003],[-70.5296875,-3.866406250000011],[-70.48583984375,-3.869335937500011],[-70.42109375,-3.849609375],[-70.37919921874999,-3.81875],[-70.339501953125,-3.814355468750009],[-70.2984375,-3.84423828125],[-70.24028320312499,-3.882714843750009],[-70.16752929687499,-4.050195312500009],[-70.0171875,-4.162011718750009],[-69.96591796874999,-4.2359375],[-69.97202148437499,-4.301171875],[-70.00395507812499,-4.327246093750006],[-70.05332031249999,-4.333105468750006],[-70.12880859375,-4.28662109375],[-70.23916015625,-4.301171875],[-70.31689453125,-4.246972656250009],[-70.34365234375,-4.193652343750003],[-70.40463867187499,-4.150097656250011],[-70.5306640625,-4.167578125],[-70.72158203125,-4.158886718750011],[-70.79951171875,-4.17333984375],[-70.97368164062499,-4.350488281250009],[-71.8447265625,-4.50439453125],[-72.256787109375,-4.748925781250009],[-72.35283203124999,-4.786035156250009],[-72.468994140625,-4.901269531250009],[-72.608349609375,-5.009570312500003],[-72.69873046875,-5.0671875],[-72.83193359375,-5.09375],[-72.88706054687499,-5.122753906250011],[-72.9798828125,-5.634863281250006],[-73.16289062499999,-5.933398437500003],[-73.209375,-6.028710937500009],[-73.235546875,-6.0984375],[-73.137353515625,-6.4658203125]]]},"properties":{"name":"Peru","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[120.250390625,5.256591796875043],[119.82148437500004,5.06953125000004],[120.1652343750001,5.332421875000037],[120.250390625,5.256591796875043]]],[[[121.159375,6.075634765625011],[121.41103515625005,5.939843749999966],[121.29443359374997,5.869970703125034],[120.8763671875,5.95263671875],[121.159375,6.075634765625011]]],[[[122.09287109375012,6.428320312500006],[121.95917968750004,6.415820312500045],[121.83203125000003,6.664062499999986],[122.0583007812501,6.740722656249972],[122.32353515625002,6.602246093750011],[122.09287109375012,6.428320312500006]]],[[[122.93710937500006,7.409130859374983],[122.80468750000003,7.315966796875017],[122.82216796875,7.428466796875014],[122.93710937500006,7.409130859374983]]],[[[117.07988281250007,7.883398437499977],[117.02832031249997,7.807519531249966],[116.96953125000007,7.894921875],[116.9935546875,8.050537109375014],[117.07705078125,8.069140624999974],[117.07988281250007,7.883398437499977]]],[[[117.35527343750002,8.21464843749996],[117.28701171875,8.191015625000034],[117.28085937500006,8.314990234374974],[117.35527343750002,8.21464843749996]]],[[[124.80664062500003,9.142626953125003],[124.66582031250002,9.132324218750043],[124.65332031250003,9.225830078125],[124.80664062500003,9.142626953125003]]],[[[123.69765625000005,9.237304687500028],[123.61445312500004,9.103320312499989],[123.49345703125002,9.192089843750054],[123.69765625000005,9.237304687500028]]],[[[126.00595703125006,9.320947265625009],[126.19335937499997,9.276708984374963],[126.30458984375,8.952050781249994],[126.13955078125005,8.59565429687504],[126.36533203125012,8.483886718750014],[126.45869140625004,8.20283203125004],[126.43535156250002,7.832812499999974],[126.57011718750002,7.677246093749986],[126.58154296875003,7.247753906249969],[126.1920898437501,6.852539062500014],[126.18935546875,6.309667968749991],[125.82441406250004,7.333300781249989],[125.68925781250007,7.263037109374977],[125.38066406250007,6.689941406250014],[125.58847656250012,6.465771484374997],[125.66796874999997,5.97866210937498],[125.34648437500002,5.598974609374977],[125.23154296875006,6.069531250000011],[124.92734375000006,5.875341796874977],[124.21279296875,6.233251953124977],[124.078125,6.404443359375037],[123.98525390625,6.993701171875003],[124.20664062500006,7.396435546874983],[123.66582031250002,7.817773437500023],[123.49306640625,7.80791015624996],[123.39091796875007,7.407519531250017],[123.09667968749997,7.700439453125],[122.8429687500001,7.529296875000043],[122.79179687500002,7.72246093749996],[122.61621093749997,7.763134765624983],[122.14248046875,6.949658203124997],[121.96425781250005,6.96821289062504],[121.92460937500002,7.199511718750003],[122.24335937500004,7.945117187500031],[122.91113281250003,8.156445312499997],[123.05058593750002,8.433935546875048],[123.43457031249997,8.70332031250004],[123.84921875000006,8.432714843749977],[123.79941406250006,8.049121093749989],[124.19765625,8.229541015624974],[124.40488281250006,8.599853515625014],[124.7311523437501,8.562988281250043],[124.86894531250002,8.972265625000034],[125.141015625,8.86875],[125.20966796875004,9.027148437500017],[125.49873046875004,9.014746093749977],[125.47128906250006,9.756787109374983],[126.00595703125006,9.320947265625009]]],[[[126.059375,9.766210937500034],[125.99121093750003,9.838525390625023],[126.07382812500006,10.059228515625051],[126.1725585937501,9.79995117187498],[126.059375,9.766210937500034]]],[[[124.59384765625006,9.787207031249963],[124.1224609375,9.599316406249969],[123.93564453125012,9.623974609375011],[123.81718750000002,9.817382812499986],[124.17285156250003,10.135205078124983],[124.33574218750002,10.159912109375043],[124.57714843749997,10.026708984374991],[124.59384765625006,9.787207031249963]]],[[[125.69023437500007,9.914453125000037],[125.49482421875004,10.118701171875003],[125.66679687500002,10.440136718750026],[125.69023437500007,9.914453125000037]]],[[[119.91621093750004,10.485986328125037],[119.79316406250004,10.455273437499997],[119.85205078124997,10.64013671875],[120.00839843750012,10.570117187500031],[119.91621093750004,10.485986328125037]]],[[[122.64951171875012,10.472705078125003],[122.53837890625002,10.424951171875037],[122.5375,10.607568359375023],[122.70126953125006,10.740625],[122.64951171875012,10.472705078125003]]],[[[123.13085937500003,9.064111328124994],[122.99472656250006,9.058837890624986],[122.8666015625,9.319824218750043],[122.5625,9.482812500000037],[122.39951171875006,9.823046874999989],[122.47148437500007,9.961523437500034],[122.85556640625006,10.0869140625],[122.81699218750012,10.503808593750023],[122.98330078125,10.886621093750037],[123.25664062500007,10.99394531249996],[123.51064453125005,10.923046875],[123.5675781250001,10.780761718750057],[123.16201171875,9.864257812500028],[123.1498046875,9.606152343750026],[123.32050781250004,9.27294921875],[123.13085937500003,9.064111328124994]]],[[[123.37031250000004,9.449609375000023],[123.38623046874997,9.967089843750017],[124.03886718750002,11.273535156249991],[124.00498046875012,10.40009765625004],[123.70048828125007,10.128320312500009],[123.37031250000004,9.449609375000023]]],[[[123.75703125000004,11.28330078125002],[123.815625,11.15073242187502],[123.73671875,11.151464843749991],[123.75703125000004,11.28330078125002]]],[[[117.31113281250012,8.439599609375051],[117.21855468750007,8.367285156249963],[117.34990234375002,8.713574218749997],[119.22382812500004,10.477294921875043],[119.30566406250003,10.9736328125],[119.55332031250012,11.31352539062496],[119.52666015625002,10.953173828125003],[119.68691406250005,10.500341796875034],[119.36933593750004,10.327294921875037],[119.19150390625012,10.061083984374989],[118.78212890625005,9.91611328125002],[118.4349609375,9.256005859375009],[117.31113281250012,8.439599609375051]]],[[[119.86142578125006,11.52534179687504],[119.83066406250012,11.375683593750011],[119.72998046874997,11.431933593750017],[119.86142578125006,11.52534179687504]]],[[[124.574609375,11.343066406250031],[124.92998046875002,11.372851562499974],[125.02656250000004,11.21171875],[125.01318359374997,10.785693359374989],[125.26845703125005,10.307714843750048],[125.14257812499997,10.189453125000028],[124.9875,10.36757812499998],[125.02656250000004,10.033105468749966],[124.78076171874997,10.16806640625002],[124.78671875000012,10.781396484375009],[124.66269531250006,10.961962890625017],[124.44550781250004,10.923583984375014],[124.33066406250012,11.535205078125003],[124.574609375,11.343066406250031]]],[[[124.60839843750003,11.492187500000043],[124.48349609375006,11.485839843749986],[124.36035156250003,11.665917968749994],[124.5109375000001,11.687109375000048],[124.60839843750003,11.492187500000043]]],[[[122.49619140625006,11.615087890625034],[122.83808593750004,11.595654296874983],[122.89453125000003,11.44130859374998],[123.15830078125012,11.53554687499999],[123.11953125,11.286816406250026],[122.8029296875001,10.99003906249996],[122.76992187500005,10.823828125000034],[121.95400390625,10.444384765625003],[122.10351562499997,11.64291992187502],[121.91601562499997,11.854345703125006],[122.02919921875005,11.895410156250023],[122.49619140625006,11.615087890625034]]],[[[120.03876953125004,11.703320312499969],[119.94492187500006,11.690722656249989],[119.86093750000006,11.953955078124963],[120.03593750000002,11.917236328125028],[120.03876953125004,11.703320312499969]]],[[[120.1,12.167675781249983],[120.22822265625004,12.219824218750034],[120.31455078125012,12.012402343749969],[120.01054687500002,12.008251953125011],[119.88574218749997,12.299853515625003],[120.1,12.167675781249983]]],[[[122.65449218750004,12.309033203125011],[122.42294921875006,12.455078125],[122.60361328125006,12.49160156249998],[122.65449218750004,12.309033203125011]]],[[[125.23955078125002,12.527880859375003],[125.32021484375,12.321826171875031],[125.53564453125003,12.191406250000028],[125.49179687500006,11.594335937499977],[125.57353515625002,11.238232421874997],[125.73564453125002,11.049609375000017],[125.23339843749997,11.145068359375017],[125.03427734375012,11.341259765625026],[124.91699218750003,11.558398437500031],[124.99501953125,11.764941406250003],[124.445703125,12.152783203124969],[124.29472656250007,12.569335937500014],[125.23955078125002,12.527880859375003]]],[[[123.71660156250007,12.287353515625028],[124.04033203125002,11.966796875],[124.04550781250012,11.752441406250028],[123.47373046875006,12.21665039062502],[123.15781250000012,11.925634765624963],[123.23642578125012,12.583496093750057],[123.71660156250007,12.287353515625028]]],[[[122.09404296875002,12.354882812500023],[122.01396484375002,12.105615234375037],[121.9232421875,12.331298828125014],[122.00156250000006,12.598535156250009],[122.14501953124997,12.652636718750017],[122.09404296875002,12.354882812500023]]],[[[123.77539062499997,12.453906250000031],[123.77910156250002,12.366259765625031],[123.62148437500005,12.67490234375002],[123.77539062499997,12.453906250000031]]],[[[123.28183593750006,12.85341796874998],[123.36718750000003,12.70083007812498],[122.95751953124997,13.107177734374986],[123.28183593750006,12.85341796874998]]],[[[120.70439453125002,13.479492187499986],[121.20273437500006,13.432324218749969],[121.52275390625007,13.131201171874991],[121.540625,12.63818359375],[121.39433593750002,12.300585937499974],[121.23671875000005,12.218798828125003],[120.92216796875002,12.51162109374998],[120.65136718749997,13.169140625],[120.33847656250012,13.412353515624986],[120.40126953125,13.517041015624997],[120.70439453125002,13.479492187499986]]],[[[121.91484375000002,13.540332031250031],[122.11455078125002,13.463183593750031],[122.00488281249997,13.204980468750009],[121.82919921875006,13.328613281249972],[121.91484375000002,13.540332031250031]]],[[[124.35361328125006,13.632226562500009],[124.17539062500012,13.531542968750017],[124.03886718750002,13.663134765625003],[124.22490234375007,14.077587890624969],[124.41718750000004,13.871044921874997],[124.35361328125006,13.632226562500009]]],[[[122.03349609375002,15.005029296875009],[121.93300781250005,14.656054687500045],[121.83984374999997,15.038134765625003],[122.03349609375002,15.005029296875009]]],[[[121.10156249999997,18.615283203125017],[121.84560546875,18.29541015625003],[122.03847656250005,18.32792968749999],[122.14667968750004,18.486572265625],[122.26552734375005,18.458837890625034],[122.15234374999997,17.664404296875006],[122.51914062500012,17.124853515625034],[122.13515625000005,16.18481445312503],[121.59531250000012,15.933251953125023],[121.60703125000006,15.669824218749994],[121.39228515625004,15.324414062499969],[121.69541015625006,14.7373046875],[121.62792968749997,14.581152343749977],[121.76660156249997,14.16806640625002],[122.21171875000002,13.930175781250057],[122.2875,13.996191406250006],[122.19970703125003,14.148046875000034],[122.6271484375001,14.317529296875009],[122.93417968750012,14.18808593750002],[123.101953125,13.750244140624986],[123.29697265625012,13.836425781250043],[123.32031249999997,14.061669921875023],[123.81572265625002,13.837109375000011],[123.80625000000012,13.721728515625045],[123.54960937500007,13.645751953125014],[123.81923828125,13.269482421875011],[123.78515625000003,13.110546875000054],[124.14277343750004,13.035791015625009],[124.0597656250001,12.567089843749997],[123.87783203125005,12.689697265625014],[123.94853515625007,12.916406250000023],[123.31093750000005,13.044091796875009],[123.16328125000004,13.44174804687502],[122.59521484374997,13.90761718749998],[122.46796875000004,13.886718749999986],[122.66787109375,13.395361328124991],[122.59990234375002,13.194140625000031],[122.37656250000012,13.520605468750006],[121.77792968750006,13.93764648437498],[121.50107421875006,13.8421875],[121.344140625,13.649121093749997],[121.09550781250007,13.679492187500045],[120.84072265625,13.884716796875026],[120.637109375,13.804492187500031],[120.61679687500006,14.188037109375003],[120.9220703125001,14.493115234374983],[120.94130859375,14.645068359375031],[120.58369140625004,14.88125],[120.58867187500002,14.483105468749983],[120.43876953125002,14.453369140624972],[120.25078125000002,14.793310546875034],[120.08212890625012,14.851074218749986],[119.77255859375012,16.25512695312503],[119.83076171875004,16.326562500000023],[120.15976562500012,16.047656250000045],[120.36875,16.109570312499955],[120.35839843749997,17.63818359375],[120.59970703125012,18.507861328125074],[121.10156249999997,18.615283203125017]]],[[[121.92167968750007,18.89472656250001],[121.82519531250003,18.842724609374983],[121.94335937500003,19.010449218749955],[121.92167968750007,18.89472656250001]]],[[[121.52089843750005,19.361962890624994],[121.53125,19.271337890625006],[121.37460937500006,19.356298828124977],[121.52089843750005,19.361962890624994]]]]},"properties":{"name":"Philippines","childNum":37}},{"geometry":{"type":"Polygon","coordinates":[[[134.5954101562501,7.382031249999969],[134.51572265625012,7.525781250000037],[134.65117187500002,7.712109374999983],[134.5954101562501,7.382031249999969]]]},"properties":{"name":"Palau","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[153.53613281249997,-11.476171874999949],[153.75986328125006,-11.586328125],[153.55371093749997,-11.630566406249969],[153.28681640625004,-11.516992187500009],[153.20361328124997,-11.32412109374998],[153.53613281249997,-11.476171874999949]]],[[[154.28076171874997,-11.36142578125002],[154.12119140625006,-11.425683593749966],[154.02343750000003,-11.347949218750031],[154.28076171874997,-11.36142578125002]]],[[[150.89873046875002,-10.565332031250023],[150.88466796875,-10.643457031250037],[150.78574218750006,-10.603417968749966],[150.89873046875002,-10.565332031250023]]],[[[151.08095703125,-10.020117187499963],[151.29648437500012,-9.956738281250026],[151.230859375,-10.194726562500009],[150.95917968750004,-10.092578124999989],[150.77607421875004,-9.70908203125002],[151.08095703125,-10.020117187499963]]],[[[150.52841796875006,-9.34658203124998],[150.78867187500006,-9.417968749999957],[150.89404296875003,-9.667480468749986],[150.43623046875004,-9.624609374999949],[150.5084960937501,-9.536132812499957],[150.43730468750007,-9.359960937500034],[150.52841796875006,-9.34658203124998]]],[[[150.3454101562501,-9.493847656249955],[150.10976562500005,-9.361914062499991],[150.20830078125002,-9.206347656250003],[150.32011718750007,-9.264160156249972],[150.3454101562501,-9.493847656249955]]],[[[152.63095703125012,-8.959375],[152.95292968750007,-9.07011718749996],[152.96689453125006,-9.208984375000014],[152.51513671874997,-9.009863281250034],[152.63095703125012,-8.959375]]],[[[151.10683593750005,-8.733496093749949],[151.12412109375012,-8.804882812500011],[151.00498046875006,-8.523828124999952],[151.117578125,-8.41884765624998],[151.10683593750005,-8.733496093749949]]],[[[143.58681640625005,-8.481738281250003],[143.321875,-8.367578125],[143.5814453125,-8.390917968749974],[143.58681640625005,-8.481738281250003]]],[[[148.02578125,-5.826367187500011],[147.78105468750007,-5.627246093749946],[147.7946289062501,-5.492382812500011],[148.05478515625006,-5.61152343750004],[148.02578125,-5.826367187500011]]],[[[155.95761718750006,-6.686816406249989],[155.71933593750012,-6.862792968749957],[155.34404296875007,-6.721679687499986],[155.20214843750003,-6.3076171875],[154.75927734375003,-5.931347656249997],[154.72929687500002,-5.444433593750006],[155.09384765625006,-5.620214843750034],[155.46699218750004,-6.145117187500034],[155.82255859375002,-6.38046875000002],[155.95761718750006,-6.686816406249989]]],[[[147.17626953124997,-5.431933593749946],[147.00585937499997,-5.30703125],[147.1310546875001,-5.190820312500037],[147.17626953124997,-5.431933593749946]]],[[[154.64726562500002,-5.43271484375002],[154.54003906250003,-5.11083984375],[154.63261718750007,-5.013867187499955],[154.72714843750006,-5.218066406249989],[154.64726562500002,-5.43271484375002]]],[[[146.01933593750007,-4.726171874999963],[145.88359375000007,-4.66748046875],[145.9958007812501,-4.539257812499983],[146.01933593750007,-4.726171874999963]]],[[[151.915625,-4.296777343749966],[152.11718749999997,-4.212207031249974],[152.40566406250005,-4.340722656249952],[152.35117187500006,-4.82216796874998],[151.98369140625007,-5.07441406250004],[152.14296875,-5.357031249999963],[152.07705078125,-5.458300781249989],[151.86542968750004,-5.564843750000023],[151.51513671874997,-5.552343749999963],[151.22929687500002,-5.919921874999986],[150.47353515625,-6.263378906249969],[149.65253906250004,-6.290429687499966],[149.38232421874997,-6.078125],[149.0990234375,-6.116992187499989],[148.33720703125007,-5.669433593750014],[148.43203125,-5.471777343749991],[149.35888671875003,-5.583984375000014],[149.8314453125,-5.524121093749997],[149.96279296875,-5.447753906249972],[150.0900390625001,-5.011816406249977],[150.1703125,-5.070605468749974],[150.0724609375001,-5.309570312499986],[150.18310546874997,-5.523632812499983],[150.90029296875005,-5.447167968750037],[151.32656250000005,-4.96035156249998],[151.67119140625007,-4.88330078125],[151.59306640625007,-4.200781249999949],[151.915625,-4.296777343749966]]],[[[152.67060546875004,-3.13339843750002],[152.64619140625004,-3.221191406249957],[152.54326171875002,-3.095605468749952],[152.63876953125012,-3.042773437500031],[152.67060546875004,-3.13339843750002]]],[[[140.97617187500012,-9.11875],[140.97519531250006,-6.90537109375002],[140.86230468749997,-6.740039062499989],[140.975,-6.346093750000023],[140.97353515625,-2.803417968750026],[140.97343750000007,-2.609765625],[142.90517578125,-3.32070312499998],[143.50898437500004,-3.431152343750014],[144.06640625000003,-3.80517578125],[144.4777343750001,-3.82529296875002],[145.08779296875,-4.349121093749972],[145.33457031250012,-4.385253906249972],[145.7669921875,-4.823046874999989],[145.74521484375012,-5.402441406249977],[147.56669921875002,-6.056933593750003],[147.80205078125002,-6.31523437499996],[147.84550781250007,-6.662402343749989],[147.11914062499997,-6.721679687499986],[146.95361328124997,-6.834082031249963],[147.19003906250012,-7.378125],[148.12675781250007,-8.103613281249963],[148.246875,-8.554296875000034],[148.45117187499997,-8.694531250000011],[148.58310546875006,-9.051757812499957],[149.19833984375006,-9.03125],[149.26318359374997,-9.497851562499974],[150.01103515625007,-9.688183593750026],[149.76123046874997,-9.805859375000011],[149.87441406250005,-10.012988281250031],[150.84951171875,-10.236035156249997],[150.44609375000007,-10.30732421875004],[150.6471679687501,-10.517968749999966],[150.31992187500012,-10.654882812499963],[150.0167968750001,-10.577148437500028],[149.75410156250004,-10.353027343750028],[147.76865234375012,-10.070117187500031],[147.01718750000006,-9.38789062500004],[146.96376953125,-9.059570312499943],[146.63085937499997,-8.951171874999972],[146.03320312499997,-8.076367187500011],[144.97382812500004,-7.802148437500009],[144.86425781249997,-7.631542968749983],[144.50986328125006,-7.567382812499972],[144.14287109375007,-7.757226562500009],[143.65488281250012,-7.460351562500009],[143.94228515625005,-7.944238281250009],[143.8333984375,-8.029101562499974],[143.51816406250006,-8.000683593749955],[143.61376953125003,-8.200390624999969],[142.52412109375004,-8.32167968749998],[142.34746093750002,-8.167480468750014],[142.20683593750002,-8.195800781250014],[142.47480468750004,-8.369433593750031],[142.79794921875006,-8.345019531250031],[143.11181640624997,-8.474511718750037],[143.37724609375007,-8.762207031250028],[143.36621093750003,-8.961035156250034],[142.6471679687501,-9.327832031249969],[142.22958984375012,-9.169921874999957],[141.13320312500005,-9.221289062500034],[140.97617187500012,-9.11875]]],[[[152.96582031249997,-4.756347656249986],[152.89169921875006,-4.832421875000023],[152.73994140625004,-4.635839843750034],[152.66816406250004,-4.131835937500028],[152.27939453125006,-3.582421875],[151.06679687500005,-2.829003906249994],[150.74609374999997,-2.73886718750002],[150.8253906250001,-2.572949218749969],[152.03291015625004,-3.25136718749998],[153.01679687500004,-4.105664062500026],[153.1325195312501,-4.352441406250037],[152.96582031249997,-4.756347656249986]]],[[[150.43662109375012,-2.66181640625004],[150.16572265625004,-2.660253906249991],[149.96162109375004,-2.473828125000026],[150.22714843750006,-2.384179687499966],[150.42949218750007,-2.47041015625004],[150.43662109375012,-2.66181640625004]]],[[[147.06757812500004,-1.96015625],[147.43808593750012,-2.05898437499998],[147.20634765625007,-2.181933593749974],[146.54648437500012,-2.20859375],[146.65625,-1.97402343749998],[147.06757812500004,-1.96015625]]],[[[149.76542968750007,-1.553027343750017],[149.54589843749997,-1.471679687499957],[149.58095703125005,-1.353222656249983],[149.76542968750007,-1.553027343750017]]]]},"properties":{"name":"Papua New Guinea","childNum":21}},{"geometry":{"type":"Polygon","coordinates":[[[23.484667968750017,53.939794921875],[23.915429687500023,52.770263671875],[23.175097656250017,52.28662109375],[23.652441406250006,52.040380859375],[23.605273437500017,51.517919921875],[23.664453125000023,51.31005859375],[24.095800781250006,50.87275390625],[23.9970703125,50.809375],[24.089941406250006,50.53046875],[23.97265625,50.410058593749994],[23.711718750000017,50.37734375],[23.03632812500001,49.899072265624994],[22.706152343750006,49.606201171875],[22.6494140625,49.539013671875],[22.66064453125,49.483691406249996],[22.71992187500001,49.353808593749996],[22.732421875,49.295166015625],[22.705664062500006,49.171191406249996],[22.847070312500023,49.08125],[22.538671875,49.072705078125],[22.473046875000023,49.081298828125],[22.020117187500006,49.209521484374996],[21.6396484375,49.411962890625],[21.079394531250017,49.418261718749996],[20.868457031250017,49.314697265625],[20.36298828125001,49.38525390625],[20.0576171875,49.181298828124994],[19.756640625000017,49.204394531249996],[19.77392578125,49.37216796875],[19.44160156250001,49.597705078124996],[19.1494140625,49.4],[18.83222656250001,49.510791015624996],[18.562402343750023,49.879345703125],[18.0283203125,50.03525390625],[17.874804687500017,49.972265625],[17.627050781250006,50.11640625],[17.702246093750006,50.307177734374996],[17.41523437500001,50.254785156249994],[16.88007812500001,50.427050781249996],[16.989648437500023,50.2369140625],[16.63916015625,50.1021484375],[16.210351562500023,50.423730468749994],[16.419726562500017,50.573632812499994],[16.2822265625,50.655615234375],[16.007226562500023,50.611621093749996],[14.99375,51.01435546875],[14.98291015625,50.886572265625],[14.895800781250017,50.861376953124996],[14.809375,50.858984375],[14.814257812500017,50.871630859374996],[14.91748046875,51.008740234375],[14.9638671875,51.095117187499994],[14.935546875,51.435351562499996],[14.905957031250011,51.463330078125],[14.724707031250006,51.523876953125],[14.7109375,51.544921875],[14.738671875000023,51.6271484375],[14.601660156250006,51.832373046875],[14.752539062500006,52.081835937499996],[14.679882812500011,52.25],[14.615625,52.277636718749996],[14.573925781250011,52.31416015625],[14.554589843750023,52.359667968749996],[14.569726562500023,52.431103515625],[14.619433593750017,52.528515625],[14.514062500000023,52.64560546875],[14.253710937500017,52.782519531249996],[14.128613281250011,52.878222656249996],[14.138867187500011,52.932861328125],[14.293164062500011,53.0267578125],[14.368554687500023,53.10556640625],[14.410937500000017,53.199023437499996],[14.412304687500011,53.216748046875],[14.41455078125,53.283496093749996],[14.258886718750006,53.729638671875],[14.58349609375,53.63935546875],[14.558398437500017,53.823193359375],[14.21142578125,53.950341796875],[16.186328125000017,54.290380859375],[16.55976562500001,54.55380859375],[18.32343750000001,54.838183593749996],[18.75927734375,54.6845703125],[18.43623046875001,54.7447265625],[18.83642578125,54.369580078125],[19.604394531250023,54.4591796875],[20.20820312500001,54.420751953125],[22.16845703125,54.35986328125],[22.731835937500023,54.35009765625],[22.766210937500006,54.356787109375],[22.82373046875,54.395800781249996],[22.893945312500023,54.39052734375],[22.97675781250001,54.366357421875],[23.015527343750023,54.34833984375],[23.04218750000001,54.30419921875],[23.0875,54.299462890625],[23.170312500000023,54.2814453125],[23.282324218750006,54.24033203125],[23.3701171875,54.200488281249996],[23.45361328125,54.14345703125],[23.484667968750017,53.939794921875]]]},"properties":{"name":"Poland","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-65.42558593749999,18.105615234374994],[-65.57221679687493,18.137304687499977],[-65.29487304687501,18.133349609375045],[-65.42558593749999,18.105615234374994]]],[[[-66.12939453125003,18.444921875000034],[-65.62880859375,18.381396484375045],[-65.62084960937497,18.242333984374966],[-65.97080078124995,17.974365234375],[-67.196875,17.994189453125045],[-67.2640625,18.364599609375006],[-67.15864257812501,18.499218749999983],[-66.12939453125003,18.444921875000034]]]]},"properties":{"name":"Puerto Rico","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[130.52695312500012,42.535400390625],[130.68730468750007,42.30253906249999],[130.2357421875,42.183203125000034],[129.75634765624997,41.712255859375006],[129.70869140625004,40.857324218749994],[129.34111328125002,40.72631835937506],[128.51123046874997,40.130224609375006],[127.56816406250002,39.78198242187503],[127.39453125000003,39.207910156249966],[127.78613281250003,39.084130859374966],[128.37460937500012,38.6234375],[128.03896484375,38.30854492187498],[127.09033203125003,38.28388671875001],[126.63388671875012,37.78183593750006],[126.36992187500007,37.87836914062501],[126.11669921875003,37.74291992187503],[125.76914062500006,37.98535156250003],[125.35781250000005,37.72480468749998],[125.31074218750004,37.843505859375],[124.98876953124997,37.93144531249999],[125.2067382812501,38.08154296875],[124.69091796874997,38.12919921875002],[125.06738281250003,38.556738281250006],[125.55449218750002,38.68623046875001],[125.16884765625,38.80551757812506],[125.40966796875003,39.28837890625002],[125.36083984375003,39.52661132812497],[124.77529296875,39.75805664062506],[124.63828125000006,39.61508789062506],[124.36210937500002,40.004052734374994],[124.8893554687501,40.459814453125006],[125.98906250000002,40.904638671875034],[126.74306640625,41.724853515625],[126.95478515625004,41.76948242187501],[127.17968750000003,41.531347656250006],[128.14941406249997,41.38774414062496],[128.28925781250004,41.60742187500006],[128.04521484375007,41.9875],[128.92343750000006,42.038232421874966],[129.3136718750001,42.41357421874997],[129.69785156250012,42.448144531249994],[129.89824218750002,42.998144531250034],[130.24033203125006,42.891796874999955],[130.24667968750012,42.744824218749955],[130.52695312500012,42.535400390625]]]},"properties":{"name":"Dem. Rep. Korea","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-17.190869140624926,32.86860351562498],[-16.693261718749966,32.75800781250001],[-17.018261718749926,32.66279296874998],[-17.226025390624983,32.76684570312503],[-17.190869140624926,32.86860351562498]]],[[[-25.64897460937499,37.840917968750006],[-25.18193359374996,37.837890625],[-25.19072265624999,37.764355468749955],[-25.73447265624992,37.76289062500001],[-25.845898437499983,37.89404296875],[-25.64897460937499,37.840917968750006]]],[[[-28.14726562499996,38.45268554687502],[-28.064794921875034,38.412744140624966],[-28.454492187500023,38.40864257812504],[-28.54882812499997,38.51855468750003],[-28.14726562499996,38.45268554687502]]],[[[-28.641308593749983,38.525],[-28.842041015625,38.5984375],[-28.69775390625,38.638476562500045],[-28.641308593749983,38.525]]],[[[-27.07524414062496,38.643457031249994],[-27.38593750000001,38.765820312499955],[-27.127001953125017,38.78984375],[-27.07524414062496,38.643457031249994]]],[[[-31.137109374999937,39.40693359375001],[-31.282958984375,39.39409179687496],[-31.260839843750034,39.49677734375001],[-31.137109374999937,39.40693359375001]]],[[[-7.406152343749937,37.17944335937497],[-7.834130859374994,37.005712890625034],[-8.597656249999943,37.12133789062506],[-8.997802734375028,37.03227539062502],[-8.814160156249983,37.43081054687502],[-8.881103515624943,38.44667968750005],[-8.668310546874949,38.42431640625003],[-8.798876953124989,38.518164062500034],[-9.213281249999937,38.44809570312498],[-9.250390624999966,38.65673828125003],[-9.021484374999943,38.746875],[-8.79160156249992,39.07817382812502],[-9.13579101562496,38.74277343749998],[-9.35673828124996,38.697900390624994],[-9.479736328124972,38.79877929687501],[-9.374755859374972,39.338281249999966],[-8.837841796874926,40.11567382812498],[-8.684619140624989,40.75253906250006],[-8.755419921874932,41.69838867187502],[-8.887597656249937,41.76459960937501],[-8.777148437500017,41.941064453124994],[-8.266064453124983,42.13740234375001],[-8.152490234374937,41.81196289062498],[-7.40361328124996,41.833691406249955],[-7.147119140625023,41.98115234374998],[-6.61826171874992,41.9423828125],[-6.542187499999955,41.672509765624994],[-6.2125,41.53203125],[-6.928466796874972,41.009130859375006],[-6.8101562499999,40.343115234375034],[-7.032617187499966,40.16791992187498],[-6.896093749999949,40.02182617187506],[-6.975390624999932,39.79838867187502],[-7.117675781249972,39.681689453125045],[-7.53569335937496,39.66157226562501],[-6.997949218749994,39.05644531250002],[-7.343017578124943,38.45742187500002],[-7.106396484374983,38.181005859375006],[-6.957568359374932,38.18789062499999],[-7.44394531249992,37.72827148437497],[-7.406152343749937,37.17944335937497]]]]},"properties":{"name":"Portugal","childNum":7,"cp":[-8.7440694,39.9251454]}},{"geometry":{"type":"Polygon","coordinates":[[[-58.15976562499999,-20.164648437500006],[-58.13779296874999,-20.2373046875],[-58.12460937499999,-20.29345703125],[-58.09150390625,-20.33320312500001],[-58.05844726562499,-20.38613281250001],[-58.025390625,-20.415820312500003],[-58.00224609374999,-20.465429687500006],[-57.97905273437499,-20.657324218750006],[-57.91513671874999,-20.69033203125001],[-57.830224609374994,-20.99794921875001],[-57.94267578124999,-21.79833984375],[-57.95590820312499,-22.109179687500003],[-56.77519531249999,-22.261328125],[-56.44780273437499,-22.076171875],[-56.39487304687499,-22.09267578125001],[-56.35185546874999,-22.17861328125001],[-56.246044921875,-22.2646484375],[-56.18984375,-22.28115234375001],[-55.99140625,-22.28115234375001],[-55.84916992187499,-22.3076171875],[-55.75327148437499,-22.41015625],[-55.74663085937499,-22.5126953125],[-55.61767578125,-22.671484375],[-55.53828125,-23.58095703125001],[-55.518457031249994,-23.627246093750003],[-55.458886718749994,-23.68671875000001],[-55.4423828125,-23.792578125],[-55.4423828125,-23.865332031250006],[-55.415917968749994,-23.95136718750001],[-55.36630859374999,-23.991015625],[-55.28691406249999,-24.004296875],[-55.1943359375,-24.01748046875001],[-55.08188476562499,-23.99765625],[-54.982666015625,-23.97451171875001],[-54.62548828125,-23.8125],[-54.44023437499999,-23.90175781250001],[-54.37080078125,-23.97119140625],[-54.24179687499999,-24.047265625],[-54.281005859375,-24.30605468750001],[-54.43623046875,-25.12128906250001],[-54.47314453125,-25.22021484375],[-54.610546875,-25.432714843750006],[-54.615869140624994,-25.57607421875001],[-54.63193359374999,-26.00576171875001],[-54.677734375,-26.30878906250001],[-54.934472656249994,-26.70253906250001],[-55.1359375,-26.93115234375],[-55.426660156249994,-27.00927734375],[-55.450634765625,-27.068359375],[-55.496728515624994,-27.115332031250006],[-55.564892578125,-27.15],[-55.59726562499999,-27.207617187500006],[-55.59379882812499,-27.2880859375],[-55.63291015624999,-27.35712890625001],[-55.71464843749999,-27.41484375],[-55.789990234375,-27.41640625],[-55.95146484374999,-27.32568359375],[-56.1640625,-27.32148437500001],[-56.437158203124994,-27.553808593750006],[-58.16826171874999,-27.2734375],[-58.60483398437499,-27.31435546875001],[-58.641748046874994,-27.19609375],[-58.618603515625,-27.132128906250003],[-58.222070312499994,-26.65],[-58.18149414062499,-26.307421875],[-57.943115234375,-26.05292968750001],[-57.563134765624994,-25.473730468750006],[-57.821679687499994,-25.13642578125001],[-59.187255859375,-24.562304687500003],[-59.892480468749994,-24.093554687500003],[-60.83984375,-23.85810546875001],[-61.084716796875,-23.65644531250001],[-61.79853515625,-23.18203125],[-62.21416015624999,-22.612402343750006],[-62.372509765625,-22.43916015625001],[-62.54155273437499,-22.349609375],[-62.6259765625,-22.29042968750001],[-62.62568359375,-22.261523437500003],[-62.65097656249999,-22.233691406250003],[-62.27666015624999,-21.066015625],[-62.276318359375,-20.5625],[-61.7568359375,-19.6453125],[-60.00737304687499,-19.29755859375001],[-59.09052734375,-19.286230468750006],[-58.18017578125,-19.81787109375],[-58.15976562499999,-20.164648437500006]]]},"properties":{"name":"Paraguay","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[34.34833984375004,31.292919921874955],[34.2453125000001,31.208300781250045],[34.2125,31.292285156250017],[34.198144531249994,31.322607421875063],[34.47734375000002,31.584863281250023],[34.52412109375004,31.541650390624994],[34.5255859375001,31.52563476562503],[34.34833984375004,31.292919921874955]]],[[[34.88046875,31.3681640625],[34.950976562500074,31.60229492187503],[35.20371093750006,31.75],[35.1271484375001,31.816748046875006],[35.05322265625003,31.83793945312496],[34.983007812500006,31.816796875000023],[34.9611328125001,31.823339843750006],[34.95380859375004,31.84125976562504],[34.98974609374997,31.913281249999955],[34.955957031249994,32.1609375],[35.01054687500002,32.33818359375002],[35.06503906250006,32.46044921875006],[35.19326171875005,32.53442382812503],[35.303808593750006,32.512939453125],[35.38671875000003,32.493017578125034],[35.402636718750074,32.45063476562501],[35.484375,32.40166015624999],[35.5514648437501,32.39550781250006],[35.57207031250002,32.237890625],[35.450585937499994,31.479296875000017],[34.88046875,31.3681640625]]]]},"properties":{"name":"Palestine","childNum":2}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-149.321533203125,-17.690039062499963],[-149.177685546875,-17.736621093750045],[-149.18178710937497,-17.86230468749997],[-149.34111328125,-17.732421874999986],[-149.57890624999993,-17.734960937499963],[-149.635009765625,-17.564257812500003],[-149.37919921874993,-17.522363281249994],[-149.321533203125,-17.690039062499963]]],[[[-143.44057617187497,-16.619726562499963],[-143.38618164062498,-16.668847656250023],[-143.55068359375002,-16.62109374999997],[-143.44057617187497,-16.619726562499963]]],[[[-139.02431640624997,-9.695214843750037],[-138.82734375,-9.74160156249998],[-139.13408203124996,-9.829492187500037],[-139.02431640624997,-9.695214843750037]]],[[[-140.075634765625,-9.425976562499983],[-140.14438476562498,-9.359375],[-140.07094726562497,-9.328125],[-140.075634765625,-9.425976562499983]]],[[[-140.07260742187503,-8.910449218750031],[-140.21743164062497,-8.929687499999957],[-140.24003906249993,-8.79755859375004],[-140.057666015625,-8.801464843750026],[-140.07260742187503,-8.910449218750031]]]]},"properties":{"name":"Fr. Polynesia","childNum":5}},{"geometry":{"type":"Polygon","coordinates":[[[51.26796875000002,24.607226562500003],[51.17802734375002,24.58671875],[51.093359375,24.564648437499997],[51.02275390625002,24.565234375],[50.96601562500001,24.573925781249997],[50.928320312500006,24.595117187499994],[50.85566406250001,24.679638671874997],[50.80439453125001,24.789257812499997],[50.8359375,24.850390625],[50.846777343750006,24.888574218749994],[50.75458984375001,25.39926757812499],[51.003125,25.9814453125],[51.262304687500006,26.153271484374997],[51.543066406250006,25.902392578125003],[51.4853515625,25.524707031250003],[51.60888671875,25.052880859374994],[51.42792968750001,24.668261718750003],[51.26796875000002,24.607226562500003]]]},"properties":{"name":"Qatar","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[28.2125,45.450439453125],[28.317675781250017,45.347119140625],[28.451269531250006,45.2921875],[28.78828125000001,45.240966796875],[28.78173828125,45.309863281249996],[28.894335937500017,45.289941406249994],[29.223535156250023,45.4029296875],[29.403710937500023,45.419677734375],[29.567675781250017,45.37080078125],[29.705859375000017,45.259912109374994],[29.557519531250023,44.843408203124994],[29.048242187500023,44.757568359375],[29.0953125,44.975048828125],[28.891503906250023,44.91865234375],[28.585351562500023,43.742236328124996],[28.221972656250017,43.772851562499994],[27.88427734375,43.987353515624996],[27.425390625,44.0205078125],[27.0869140625,44.167382812499994],[26.2158203125,44.007275390625],[25.4970703125,43.670800781249994],[22.919042968750006,43.83447265625],[22.868261718750006,43.947900390624994],[23.02851562500001,44.077978515625],[22.705078125,44.23779296875],[22.687890625000023,44.248291015625],[22.494531250000023,44.435449218749994],[22.554003906250017,44.540332031249996],[22.6201171875,44.562353515625],[22.70078125,44.555517578125],[22.734375,44.569921875],[22.72089843750001,44.605517578124996],[22.64208984375,44.6509765625],[22.49765625,44.70625],[22.350683593750006,44.676123046875],[22.200976562500017,44.560693359374994],[22.093066406250017,44.541943359375],[21.909277343750006,44.66611328125],[21.636132812500023,44.71044921875],[21.52314453125001,44.790087890624996],[21.36005859375001,44.82666015625],[21.35791015625,44.86181640625],[21.384375,44.870068359375],[21.442187500000017,44.873388671875],[21.519921875000023,44.880810546875],[21.532324218750006,44.900683593749996],[21.35703125,44.990771484374996],[21.465429687500006,45.171875],[21.431445312500017,45.192529296874994],[20.794042968750006,45.46787109375],[20.775,45.749804687499996],[20.760156250000023,45.758105468749996],[20.746875,45.748974609375],[20.727832031250017,45.73740234375],[20.709277343750017,45.735253906249994],[20.652734375000023,45.77939453125],[20.581152343750006,45.869482421875],[20.35859375000001,45.975488281249994],[20.241796875,46.10859375],[20.28095703125001,46.1330078125],[20.508105468750017,46.166943359375],[20.613671875000023,46.13349609375],[20.76025390625,46.246240234374994],[21.121679687500006,46.282421875],[21.99970703125001,47.505029296874994],[22.87666015625001,47.947265625],[23.054785156250006,48.00654296875],[23.139453125000017,48.08740234375],[23.20263671875,48.084521484374996],[23.408203125,47.989990234375],[23.628710937500017,47.995849609375],[24.578906250000017,47.931054687499994],[24.979101562500006,47.72412109375],[25.464257812500023,47.910791015624994],[25.689257812500017,47.932470703125],[25.90869140625,47.967578125],[26.162695312500006,47.992529296875],[26.236230468750023,48.064355468749994],[26.276953125,48.113232421875],[26.3056640625,48.203759765624994],[26.4423828125,48.22998046875],[26.618945312500017,48.25986328125],[26.980761718750017,48.155029296875],[27.614062500000017,47.34052734375],[28.07177734375,46.978417968749994],[28.23945312500001,46.6408203125],[28.07470703125,45.598974609375],[28.2125,45.450439453125]]]},"properties":{"name":"Romania","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[146.71396484375012,43.743798828124994],[146.62197265625,43.81298828125006],[146.88408203125002,43.82915039062496],[146.71396484375012,43.743798828124994]]],[[[146.20761718750006,44.49765625],[146.5677734375,44.44042968749997],[145.91406249999997,44.10371093750004],[145.58681640625,43.84511718750002],[145.5558593750001,43.66459960937502],[145.46171875000007,43.870898437500045],[146.20761718750006,44.49765625]]],[[[148.59951171875,45.317626953125],[147.91376953125004,44.99038085937502],[147.65781250000012,44.97714843749998],[146.89746093750003,44.404296875],[147.24658203124997,44.856054687500006],[147.88554687500007,45.22563476562499],[147.9240234375001,45.38330078125006],[148.05605468750005,45.26210937500005],[148.32421874999997,45.28242187500001],[148.8122070312501,45.510009765625],[148.83710937500004,45.36269531250002],[148.59951171875,45.317626953125]]],[[[149.68769531250004,45.64204101562501],[149.44707031250002,45.593359375000034],[149.9623046875,46.02192382812504],[150.553125,46.208544921875045],[149.68769531250004,45.64204101562501]]],[[[152.00205078125006,46.89716796874998],[151.72343750000007,46.82880859375001],[152.28886718750007,47.1421875],[152.00205078125006,46.89716796874998]]],[[[154.81044921875005,49.31201171875],[154.61093750000006,49.29404296874998],[154.82490234375004,49.64692382812501],[154.81044921875005,49.31201171875]]],[[[155.9210937500001,50.30219726562501],[155.39716796875004,50.04125976562497],[155.24306640625,50.09462890625002],[155.21835937500012,50.29785156250003],[155.68017578124997,50.400732421875034],[156.096875,50.771875],[155.9210937500001,50.30219726562501]]],[[[156.40507812500002,50.65761718750005],[156.16796874999997,50.73188476562498],[156.37646484374997,50.86210937499996],[156.4875,50.84296874999998],[156.40507812500002,50.65761718750005]]],[[[142.76103515625002,54.393945312499966],[143.32470703125003,52.96308593749998],[143.15556640625002,52.08374023437497],[143.29951171875004,51.632373046875045],[143.81601562500006,50.28261718750002],[144.71376953125,48.64028320312502],[144.04873046875,49.249169921874994],[143.73232421875,49.31201171875],[143.10498046875003,49.198828125000034],[142.57421874999997,48.07216796875002],[142.55693359375002,47.737890625000034],[143.21767578125005,46.79487304687504],[143.48564453125002,46.752050781250006],[143.58066406250012,46.360693359375034],[143.43164062500003,46.02866210937498],[143.28232421875006,46.55898437500002],[142.57802734375005,46.700781250000034],[142.07714843749997,45.91704101562499],[141.83037109375002,46.451074218749966],[142.03867187500012,47.140283203124966],[141.9640625000001,47.58745117187502],[142.18173828125012,48.01337890625001],[141.86630859375006,48.750097656250006],[142.1422851562501,49.56914062499999],[142.06601562500006,50.630468750000034],[142.20673828125004,51.22255859375002],[141.72236328125004,51.73632812499997],[141.66083984375004,52.27294921874997],[141.85556640625012,52.79350585937499],[141.82353515625007,53.33950195312502],[142.1419921875,53.49560546875003],[142.52617187500002,53.44746093749998],[142.70595703125,53.89570312499998],[142.33496093749997,54.28071289062501],[142.76103515625002,54.393945312499966]]],[[[137.17861328125005,55.100439453125034],[137.05527343750006,54.9267578125],[136.71464843750002,54.956152343750034],[137.17861328125005,55.100439453125034]]],[[[137.94052734375012,55.092626953125034],[138.20615234375012,55.03354492187498],[137.72148437500007,54.66323242187505],[137.46269531250002,54.873388671875034],[137.23291015624997,54.79057617187496],[137.5773437500001,55.19702148437497],[137.94052734375012,55.092626953125034]]],[[[21.235742187500023,55.26411132812498],[22.072363281250034,55.06367187499998],[22.56728515625005,55.05913085937496],[22.82470703125,54.87128906249998],[22.684472656250023,54.56293945312504],[22.679882812500068,54.493017578125006],[22.766210937499977,54.356787109375034],[22.168457031250057,54.35986328125006],[21.14052734375008,54.39179687499998],[19.604394531250023,54.45917968750004],[19.974511718750023,54.92119140625002],[20.520312500000017,54.994873046875],[20.89980468750008,55.286669921875045],[20.957812500000074,55.27890625000006],[20.594824218750006,54.982373046874955],[20.995898437500017,54.90268554687506],[21.18886718750008,54.93520507812502],[21.235742187500023,55.26411132812498]]],[[[166.65029296875005,54.83906249999998],[166.64511718750006,54.69409179687503],[165.75107421875006,55.294531250000034],[166.27578125000005,55.311962890624955],[166.24804687499997,55.16542968750002],[166.65029296875005,54.83906249999998]]],[[[150.58994140625006,59.01875],[150.47021484375003,59.05405273437498],[150.66621093750004,59.16015625000003],[150.58994140625006,59.01875]]],[[[163.63515625000005,58.603369140625006],[163.47138671875004,58.509375],[163.7609375000001,59.01503906250002],[164.57265625,59.22114257812501],[164.61572265624997,58.885595703125034],[163.63515625000005,58.603369140625006]]],[[[35.8161132812501,65.18208007812501],[35.77871093750005,64.97666015625],[35.52890625000006,65.15107421875001],[35.8161132812501,65.18208007812501]]],[[[70.02070312500004,66.502197265625],[69.65136718750003,66.56533203125],[69.50273437500002,66.75107421875],[70.07666015624997,66.69589843750003],[70.02070312500004,66.502197265625]]],[[[-179.79853515625,68.9404296875],[-178.873876953125,68.75410156249995],[-178.69262695312503,68.54599609375],[-178.09746093750002,68.4248046875],[-178.05581054687497,68.26489257812503],[-177.79677734374997,68.33798828125],[-178.37304687500003,68.56567382812503],[-177.52724609375002,68.29438476562501],[-177.58920898437503,68.22421875],[-175.34521484375,67.67807617187503],[-175.37470703124998,67.35737304687498],[-175.00268554687494,67.4375],[-174.849853515625,67.34887695312503],[-174.92490234375,66.62314453125006],[-174.503759765625,66.537939453125],[-174.39409179687496,66.34423828124997],[-174.084765625,66.47309570312504],[-174.06503906249998,66.22958984374998],[-173.77397460937502,66.43466796875003],[-174.23159179687497,66.63188476562505],[-174.08642578125,66.94287109375],[-174.55009765624993,67.090625],[-173.6796875,67.144775390625],[-173.15781249999998,67.06909179687503],[-173.32353515625,66.95483398437503],[-173.25893554687497,66.84008789062503],[-173.19301757812497,66.99360351562504],[-172.5201171875,66.952490234375],[-173.00751953125,67.06489257812498],[-171.79555664062502,66.93173828125003],[-170.50952148437503,66.34365234375005],[-170.604443359375,66.24892578125002],[-170.30122070312504,66.29404296874998],[-170.24394531250002,66.16928710937503],[-169.777880859375,66.14311523437505],[-169.83168945312497,65.99892578124997],[-170.54067382812497,65.86542968749995],[-170.66630859375,65.62153320312501],[-171.42153320312502,65.81035156250002],[-171.10585937500002,65.51103515625005],[-171.90712890625,65.495947265625],[-172.78330078124998,65.68105468749997],[-172.23281250000002,65.45571289062497],[-172.30927734375004,65.27563476562497],[-172.66191406249993,65.24853515625006],[-172.28603515625002,65.20571289062502],[-172.21318359375,65.04814453124999],[-173.08579101562498,64.81733398437495],[-172.80107421874996,64.79052734375],[-172.90087890624994,64.62885742187501],[-172.40146484374998,64.413916015625],[-172.73916015624997,64.41225585937502],[-172.90317382812498,64.52607421875004],[-172.96005859375003,64.32768554687502],[-173.27548828124998,64.2896484375],[-173.327490234375,64.53955078125003],[-173.72973632812497,64.36450195312497],[-174.57055664062503,64.7177734375],[-175.39511718749998,64.80239257812502],[-175.85385742187498,65.01083984375003],[-176.09326171875,65.471044921875],[-177.05625,65.613623046875],[-177.48876953125,65.50371093749999],[-178.4125,65.49555664062501],[-178.93906249999998,66.03276367187505],[-178.74672851562497,66.01367187500006],[-178.52656250000004,66.40156250000004],[-178.86811523437498,66.18706054687502],[-179.14340820312503,66.37504882812505],[-179.327197265625,66.16259765625003],[-179.68330078124998,66.18413085937505],[-179.78969726562497,65.90087890625],[-179.352099609375,65.51674804687497],[-180,65.06723632812498],[-180,65.31196289062501],[-180,65.55678710937497],[-180,65.80156250000002],[-180,66.04628906250002],[-180,66.29106445312499],[-180,66.53583984375004],[-180,66.78056640625005],[-180,67.02534179687501],[-180,67.27011718750006],[-180,67.51484374999998],[-180,67.75961914062503],[-180,68.00439453124997],[-180,68.24912109375],[-180,68.49389648437497],[-180,68.738671875],[-179.999951171875,68.98344726562505],[-179.79853515625,68.9404296875]]],[[[50.265234375,69.18559570312502],[49.62626953125002,68.85971679687498],[48.91035156250004,68.74306640625002],[48.4390625,68.80488281249998],[48.319921875,69.26923828125001],[48.8449218750001,69.49472656250003],[49.22519531250006,69.51123046875],[50.265234375,69.18559570312502]]],[[[161.46708984375002,68.90097656250003],[161.08281250000007,69.4056640625],[161.50517578125007,69.63945312500002],[161.46708984375002,68.90097656250003]]],[[[169.20078125000006,69.58046875],[168.34804687500005,69.66435546875005],[167.86474609375003,69.90107421875004],[168.35791015625003,70.01567382812502],[169.37480468750007,69.88261718749999],[169.20078125000006,69.58046875]]],[[[60.450488281250074,69.93486328124999],[60.44023437500002,69.72592773437506],[59.637011718750074,69.72104492187503],[59.50263671875004,69.86621093750003],[58.952734375,69.89277343750004],[58.51992187500005,70.31831054687504],[59.04804687500004,70.46049804687505],[60.450488281250074,69.93486328124999]]],[[[52.90332031250003,71.36499023437503],[53.19257812500004,71.21528320312498],[53.0226562500001,70.96870117187501],[52.24960937500006,71.28491210937506],[52.90332031250003,71.36499023437503]]],[[[178.8615234375001,70.826416015625],[178.68388671875013,71.10566406250004],[180,71.53774414062505],[180,70.993017578125],[178.8615234375001,70.826416015625]]],[[[137.95986328125005,71.50766601562503],[137.71181640625005,71.4232421875],[137.06406250000006,71.52988281250003],[137.816796875,71.58789062500006],[137.95986328125005,71.50766601562503]]],[[[-178.87646484375,71.57705078124997],[-178.13388671874998,71.46547851562497],[-177.523583984375,71.16689453125],[-179.415673828125,70.91899414062502],[-179.999951171875,70.993017578125],[-179.999951171875,71.53774414062505],[-178.87646484375,71.57705078124997]]],[[[77.6325195312501,72.291259765625],[76.87109374999997,72.317041015625],[77.74853515625003,72.63120117187506],[78.36513671875005,72.48242187500003],[77.6325195312501,72.291259765625]]],[[[79.50146484374997,72.72192382812497],[78.63320312500005,72.85073242187502],[79.16425781250004,73.0943359375],[79.50146484374997,72.72192382812497]]],[[[74.660546875,72.87343750000002],[74.18066406250003,72.975341796875],[74.19853515625002,73.10908203124998],[74.9615234375,73.0625],[74.660546875,72.87343750000002]]],[[[120.26132812500012,73.08984374999997],[119.79208984375006,73.04541015624997],[119.64042968750002,73.12431640625007],[120.26132812500012,73.08984374999997]]],[[[55.31982421875003,73.30830078124998],[56.42958984375005,73.201171875],[56.121679687500006,72.80659179687498],[55.40332031249997,72.54907226562503],[55.29785156249997,71.93535156250005],[56.45439453125002,71.10737304687504],[57.62539062500005,70.72880859374999],[57.14589843750005,70.58911132812506],[56.38574218749997,70.73413085937503],[56.49970703125004,70.56640625000003],[55.687304687500074,70.69218749999999],[54.60117187500006,70.68007812500002],[53.383593750000074,70.87353515625],[53.670507812500006,71.08691406250003],[54.155664062499994,71.12548828125],[53.40996093750002,71.34013671875002],[53.41162109375003,71.530126953125],[51.93789062500005,71.47470703124998],[51.511328125,71.64809570312497],[51.58251953124997,72.07119140625],[52.252050781250006,72.12973632812503],[52.66191406250002,72.33686523437495],[52.91660156250006,72.66889648437501],[52.5792968750001,72.791357421875],[53.3698242187501,72.91674804687506],[53.2511718750001,73.182958984375],[54.80390625000004,73.38764648437498],[55.31982421875003,73.30830078124998]]],[[[70.67392578125006,73.09501953125005],[70.04072265625004,73.03715820312507],[69.99589843750002,73.359375],[70.94023437500002,73.51440429687503],[71.6261718750001,73.17397460937497],[70.67392578125006,73.09501953125005]]],[[[142.18486328125007,73.89589843750005],[143.34375,73.56875],[143.45146484375007,73.231298828125],[141.59667968750003,73.31083984375005],[140.66279296875004,73.45200195312503],[139.785546875,73.35522460937503],[141.08476562500002,73.86586914062497],[142.18486328125007,73.89589843750005]]],[[[83.5490234375001,74.07177734375],[82.8177734375,74.09160156250005],[83.14980468750005,74.151611328125],[83.5490234375001,74.07177734375]]],[[[141.01025390625003,73.99946289062501],[140.40947265625002,73.92167968750005],[140.1935546875001,74.23671875000002],[141.03857421875003,74.24272460937502],[141.01025390625003,73.99946289062501]]],[[[113.38720703124997,74.40043945312499],[112.78242187500004,74.09506835937503],[111.50341796874997,74.35307617187502],[111.87978515625,74.36381835937499],[112.08447265624997,74.54897460937505],[113.38720703124997,74.40043945312499]]],[[[86.653125,74.981298828125],[87.05214843750005,74.982568359375],[86.92714843750005,74.83076171874998],[86.25859375000002,74.89350585937498],[86.653125,74.981298828125]]],[[[82.17236328125003,75.41938476562501],[81.97851562499997,75.24711914062499],[81.65478515625003,75.28891601562498],[81.71210937500004,75.45141601562506],[82.165625,75.515625],[82.17236328125003,75.41938476562501]]],[[[146.79521484375007,75.37075195312505],[148.43242187500002,75.41352539062495],[148.59013671875007,75.23637695312502],[150.82236328125006,75.15654296875002],[150.64628906250002,74.944580078125],[149.596875,74.77260742187505],[148.296875,74.80043945312502],[146.14853515625012,75.19829101562499],[146.5375,75.58178710937506],[146.79521484375007,75.37075195312505]]],[[[135.9486328125,75.40957031250005],[135.45195312500007,75.38955078124997],[135.6986328125,75.84526367187499],[136.16894531249997,75.60556640625],[135.9486328125,75.40957031250005]]],[[[140.04873046875,75.82895507812503],[140.81591796874997,75.63071289062498],[141.48544921875012,76.13715820312495],[142.66953125000012,75.86342773437497],[143.68583984375002,75.86367187500002],[145.35996093750006,75.53046874999998],[144.01972656250004,75.04467773437506],[143.1703125,75.11689453125001],[142.72949218749997,75.33764648437506],[142.941796875,75.71328125000002],[142.30791015625007,75.69169921875005],[142.19882812500006,75.39267578124998],[143.12792968749997,74.9703125],[142.47275390625006,74.82041015625],[141.98730468750003,74.99125976562499],[140.26787109375002,74.846923828125],[139.68125,74.96406249999995],[139.09912109374997,74.65654296875002],[138.09228515625003,74.79746093750003],[136.94765625000005,75.32553710937498],[137.28974609375004,75.34863281249997],[137.26884765625002,75.7494140625],[137.70654296875003,75.75957031250002],[137.56054687499997,75.95522460937502],[138.20761718750006,76.11494140624995],[138.91953125000006,76.19672851562501],[140.04873046875,75.82895507812503]]],[[[96.5324218750001,76.278125],[96.30058593750002,76.121728515625],[95.31113281250006,76.21474609375002],[95.37988281250003,76.2890625],[96.5324218750001,76.278125]]],[[[112.47802734375003,76.62089843749999],[112.531640625,76.450048828125],[111.96894531250004,76.62617187500001],[112.47802734375003,76.62089843749999]]],[[[149.15019531250002,76.65991210937506],[148.39863281250004,76.64824218750007],[149.4064453125001,76.78208007812498],[149.15019531250002,76.65991210937506]]],[[[67.7653320312501,76.23759765624999],[61.35595703124997,75.31484375000002],[60.27685546875003,75.00756835937503],[60.501367187499994,74.90463867187503],[59.67402343750004,74.61015624999999],[59.24013671875005,74.69296874999998],[59.040429687499994,74.48554687500001],[58.53466796875003,74.49892578124997],[58.6178710937501,74.22739257812498],[57.76738281250002,74.013818359375],[57.755957031250006,73.769189453125],[57.313085937500006,73.838037109375],[57.54257812500006,73.65820312500003],[56.96386718750003,73.36655273437503],[56.43037109375004,73.29721679687503],[55.00683593750003,73.45385742187506],[54.29990234375006,73.35097656249997],[53.7628906250001,73.76616210937499],[54.64267578125006,73.95957031250006],[55.34091796875006,74.41962890624998],[56.13710937500005,74.49609375000003],[55.5822265625001,74.627685546875],[56.4987304687501,74.95708007812505],[55.81005859374997,75.12490234374997],[56.03554687499999,75.19423828124997],[56.57031250000003,75.09775390625003],[56.8444335937501,75.351416015625],[57.606835937499994,75.34125976562498],[58.05830078125004,75.6630859375],[58.88125,75.85478515625007],[60.27929687499997,76.09624023437505],[60.94218750000002,76.07128906250003],[61.20166015624997,76.28203125000007],[62.97148437500002,76.23666992187498],[64.4634765625,76.37817382812503],[67.65185546874997,77.011572265625],[68.48574218750005,76.93369140625003],[68.94169921875002,76.707666015625],[67.7653320312501,76.23759765624999]]],[[[96.28544921875002,77.02666015625007],[95.27031250000007,77.01884765624999],[96.52841796875006,77.20551757812501],[96.28544921875002,77.02666015625007]]],[[[89.51425781250006,77.18881835937498],[89.14169921875012,77.22680664062497],[89.61621093749997,77.31103515625],[89.51425781250006,77.18881835937498]]],[[[130.68730468750007,42.30253906249999],[130.52695312500012,42.535400390625],[130.42480468749997,42.72705078124997],[131.06855468750004,42.90224609375005],[131.25732421875003,43.378076171874994],[131.2552734375,44.07158203124999],[130.9816406250001,44.844335937500034],[131.44687500000012,44.984033203124966],[131.85185546875002,45.32685546875001],[132.93603515624997,45.029931640624994],[133.1134765625001,45.130712890625006],[133.18603515625003,45.49482421875004],[133.43642578125,45.60468750000004],[133.86132812500003,46.24775390625004],[134.1676757812501,47.30219726562501],[134.75234375,47.71542968749998],[134.56601562500006,48.02250976562502],[134.66523437500004,48.25390625],[134.29335937500005,48.37343750000002],[133.46835937500006,48.09716796875003],[133.14404296875003,48.10566406249998],[132.7072265625001,47.94726562500006],[132.47626953125004,47.714990234374994],[130.96191406249997,47.70932617187498],[130.7326171875001,48.01923828124998],[130.80429687500012,48.34150390624998],[130.5521484375,48.602490234374955],[130.553125,48.861181640625006],[130.1959960937501,48.89165039062499],[129.49814453125012,49.38881835937502],[129.0651367187501,49.374658203124966],[128.70400390625,49.60014648437499],[127.99960937500006,49.56860351562506],[127.55078124999997,49.801806640625045],[127.590234375,50.20898437500003],[127.33720703125007,50.35014648437502],[127.30703125000005,50.70795898437501],[126.92480468749997,51.10014648437496],[126.34169921875,52.36201171875001],[125.64902343750012,53.042285156250045],[125.075,53.20366210937496],[124.81230468750002,53.133837890625045],[123.6078125,53.546533203124994],[120.98544921875012,53.28457031250002],[120.09453125000007,52.787207031250034],[120.0675781250001,52.632910156250034],[120.65615234375,52.56665039062503],[120.74980468750007,52.096533203125006],[120.06689453125003,51.60068359375006],[119.16367187500006,50.40600585937503],[119.34628906250012,50.278955078124994],[119.25986328125012,50.06640625000003],[118.4515625,49.84448242187503],[117.8734375,49.51347656250002],[116.6833007812501,49.82377929687499],[116.551171875,49.92031250000002],[116.35117187500012,49.97807617187499],[116.21679687500003,50.00927734375003],[116.13457031250002,50.01079101562499],[115.9259765625001,49.95214843750003],[115.79521484375002,49.90590820312502],[115.71777343750003,49.88061523437503],[115.58798828125006,49.88603515624996],[115.42919921874997,49.89648437499997],[115.36503906250002,49.911767578124966],[115.27451171875006,49.948876953124994],[115.00332031250005,50.138574218749994],[114.74316406249997,50.23369140625002],[114.29707031250004,50.27441406250006],[113.57421874999997,50.00703125000001],[113.44550781250004,49.94160156250001],[113.31904296875004,49.87431640624999],[113.16416015625012,49.79716796874999],[113.09208984375007,49.692529296874994],[113.05556640625,49.61625976562499],[112.91484375000002,49.569238281249994],[112.80644531250007,49.52358398437502],[112.69736328125012,49.50727539062498],[112.49492187500002,49.532324218750034],[112.07968750000006,49.42421875000002],[111.42929687500006,49.342626953125034],[111.3366210937501,49.355859374999966],[111.20419921875012,49.304296875000034],[110.82792968750002,49.16616210937505],[110.70976562500002,49.14296875000002],[110.42783203125006,49.219970703125],[110.32138671875012,49.215869140625045],[110.19990234375004,49.17041015625003],[109.5287109375,49.269873046875034],[109.45371093750012,49.29633789062501],[109.23671875000005,49.334912109374955],[108.61367187500005,49.32280273437499],[108.52246093750003,49.34150390624998],[108.4069335937501,49.39638671875005],[107.96542968750012,49.65351562500004],[107.91660156250012,49.947802734375045],[107.63095703125012,49.98310546875004],[107.3470703125,49.986669921875034],[107.23330078125,49.989404296874994],[107.14306640625003,50.03300781249999],[107.04023437500004,50.086474609375045],[106.94130859375005,50.19667968750002],[106.71113281250004,50.312597656250006],[106.57441406250004,50.32880859375004],[106.36845703125002,50.317578124999955],[106.21787109375006,50.304589843749966],[105.38359375000002,50.47373046874998],[104.07871093750012,50.15424804687498],[103.63291015625006,50.138574218749994],[103.49628906250004,50.16494140625005],[103.42119140625002,50.18706054687502],[103.3043945312501,50.200292968750034],[102.28837890625007,50.58510742187502],[102.31660156250004,50.71845703125001],[102.21503906250004,50.82944335937506],[102.19453125000004,51.05068359375002],[102.15195312500006,51.107519531250034],[102.14238281250007,51.21606445312503],[102.16005859375005,51.260839843750006],[102.1556640625,51.31376953124996],[102.1115234375001,51.353466796874955],[101.97919921875004,51.382226562499966],[101.82119140625,51.421044921874966],[101.57089843750006,51.46718750000005],[101.38125,51.45263671875],[100.53623046875006,51.713476562500034],[100.46894531250004,51.72607421875003],[100.23037109375,51.729833984375006],[100.0345703125,51.73710937499996],[99.92167968750002,51.755517578124994],[99.71923828124997,51.87163085937502],[98.89316406250006,52.11728515625006],[98.64052734375005,51.80117187500005],[98.103125,51.483544921874994],[97.82529296875012,50.985253906249994],[97.953125,50.85517578124998],[98.02978515625003,50.64462890624998],[98.07890625000002,50.60380859375002],[98.14501953124997,50.56855468750001],[98.22050781250007,50.55717773437502],[98.2794921875001,50.53325195312502],[98.25029296875002,50.30244140624998],[98.00390625000003,50.01425781249998],[97.35976562500005,49.741455078125],[97.20859375000006,49.73081054687506],[96.98574218750005,49.88281250000003],[96.31503906250012,49.90112304687503],[96.06552734375006,49.99873046875001],[95.52265625000004,49.911230468750034],[95.11142578125012,49.935449218749994],[94.93027343750006,50.04375],[94.8112304687501,50.04819335937506],[94.71806640625002,50.04326171875002],[94.67548828125004,50.02807617187506],[94.61474609375003,50.02373046874996],[94.56464843750004,50.08793945312499],[94.35468750000004,50.221826171874994],[94.25107421875006,50.55639648437503],[93.103125,50.60390625000002],[92.94130859375005,50.77822265625002],[92.85644531250003,50.78911132812502],[92.77929687500003,50.778662109375006],[92.738671875,50.71093749999997],[92.68134765625004,50.683203125],[92.6266601562501,50.68828124999999],[92.57890625000002,50.725439453125006],[92.42636718750006,50.803076171875006],[92.35478515625002,50.86416015625002],[92.29580078125,50.84980468750004],[92.19238281249997,50.700585937499994],[91.80429687500006,50.693603515625],[91.4464843750001,50.52216796874998],[91.41503906249997,50.46801757812506],[91.34082031249997,50.470068359375034],[91.30058593750002,50.46337890625],[91.2337890625,50.45239257812497],[91.02158203125012,50.41547851562501],[90.83808593750004,50.32373046874997],[90.76074218749997,50.30595703124999],[90.71435546874997,50.25942382812502],[90.65507812500007,50.22236328125001],[90.05371093750003,50.09375],[89.64384765625002,49.90302734374998],[89.65410156250007,49.71748046875001],[89.57919921875006,49.69970703125003],[89.475,49.66054687500005],[89.39560546875006,49.61152343750001],[89.24394531250007,49.62705078125006],[89.20292968750007,49.59570312499997],[89.17998046875002,49.5322265625],[89.10947265625012,49.50136718750002],[89.00839843750006,49.472802734374994],[88.97060546875,49.483740234375006],[88.94541015625012,49.50766601562498],[88.90019531250002,49.53969726562502],[88.86386718750006,49.52763671874996],[88.83164062500012,49.44843749999998],[88.633203125,49.486132812500045],[88.19257812500004,49.451708984375045],[88.13554687500002,49.38149414062502],[88.11572265624997,49.25629882812501],[88.0285156250001,49.219775390625045],[87.98808593750002,49.186914062499994],[87.9347656250001,49.16455078124997],[87.81425781250002,49.162304687499955],[87.7625,49.16582031249996],[87.5158203125001,49.122412109375006],[87.41669921875004,49.07661132812501],[87.32285156250012,49.085791015625006],[86.62646484374997,49.56269531250001],[86.67548828125004,49.77729492187501],[86.1808593750001,49.49931640624996],[85.2326171875001,49.61582031249998],[84.9894531250001,50.061425781249994],[84.32324218749997,50.239160156249966],[83.94511718750007,50.774658203125],[83.35732421875005,50.99458007812504],[82.76083984375012,50.89335937500002],[82.49394531250007,50.72758789062499],[81.46591796875006,50.73984375],[81.38828125000006,50.95649414062501],[81.0714843750001,50.96875],[81.12724609375002,51.19106445312502],[80.73525390625,51.29340820312498],[80.44804687500002,51.18334960937503],[80.42363281250002,50.94628906249997],[79.98623046875,50.774560546874966],[77.85996093750006,53.269189453124994],[76.48476562500005,54.02255859374998],[76.42167968750007,54.151513671874966],[76.65458984375007,54.14526367187503],[76.8373046875,54.4423828125],[75.43720703125004,54.08964843749999],[75.22021484374997,53.89379882812506],[74.45195312500007,53.64726562500002],[74.35156250000003,53.487646484375006],[73.85898437500006,53.61972656249998],[73.40693359375004,53.44755859374999],[73.30566406250003,53.707226562499955],[73.71240234375003,54.04238281250002],[73.22988281250005,53.957812500000045],[72.62226562500004,54.13432617187502],[72.44677734375003,53.94184570312498],[72.18603515625003,54.32563476562501],[72.00449218750006,54.20566406249998],[71.09316406250005,54.21220703124999],[71.18554687500003,54.59931640624998],[70.73808593750007,55.30517578125],[70.18242187500002,55.162451171875034],[68.9772460937501,55.389599609374955],[68.20625,55.16093750000002],[68.15585937500006,54.97670898437505],[65.476953125,54.62329101562497],[65.08837890624997,54.340185546875034],[64.46123046875002,54.38417968750002],[61.92871093750003,53.94648437500004],[61.231054687500006,54.01948242187498],[60.97949218749997,53.62172851562505],[61.53496093750002,53.52329101562506],[61.22890625,53.445898437500006],[61.19921874999997,53.28715820312502],[61.65986328125004,53.22846679687504],[62.08271484375004,53.00541992187499],[61.047460937500006,52.97246093750002],[60.77441406249997,52.67578124999997],[60.99453125000005,52.33686523437504],[60.03027343749997,51.93325195312505],[60.464746093749994,51.651171875000045],[61.55468750000003,51.32460937500005],[61.38945312500002,50.86103515625001],[60.94228515625005,50.69550781250004],[60.42480468749997,50.67915039062498],[60.05859374999997,50.850292968749955],[59.812402343749994,50.58203125],[59.523046875,50.492871093749955],[59.4523437500001,50.62041015625002],[58.88369140625005,50.694433593750006],[58.359179687500074,51.063818359375034],[57.83886718750003,51.091650390625006],[57.44218750000002,50.88886718749998],[57.01171874999997,51.06518554687503],[56.49140625000004,51.01953124999997],[55.68623046875004,50.582861328125006],[54.64160156250003,51.011572265625034],[54.555273437500006,50.535791015624994],[54.139746093750006,51.04077148437503],[53.33808593750004,51.48237304687504],[52.57119140625005,51.481640624999955],[52.21914062499999,51.709375],[51.344531250000074,51.47534179687503],[51.16347656250005,51.6474609375],[50.79394531249997,51.729199218749955],[50.246875,51.28950195312498],[49.49804687500003,51.08359375000006],[49.32343750000004,50.851708984374966],[48.625097656250006,50.61269531250005],[48.7589843750001,49.92832031250006],[48.33496093750003,49.858251953125006],[47.7057617187501,50.37797851562502],[47.42919921874997,50.35795898437502],[46.889550781249994,49.69697265625001],[46.80205078125002,49.36708984375002],[47.031347656250006,49.150292968749994],[46.70263671875003,48.80556640625002],[46.660937500000074,48.41225585937502],[47.06464843750004,48.23247070312499],[47.292382812499994,47.74091796875004],[47.48193359374997,47.80390624999998],[48.16699218750003,47.70878906249996],[48.959375,46.77460937499998],[48.558398437500074,46.75712890624999],[48.54121093750004,46.60561523437502],[49.232226562500074,46.33715820312503],[48.683691406250006,46.08618164062497],[48.72958984375006,45.896826171875034],[48.4870117187501,45.93486328124996],[47.63330078124997,45.58403320312499],[47.46328125,45.67968750000003],[47.5294921875001,45.530224609374955],[47.3512695312501,45.21772460937498],[46.7072265625001,44.503320312499994],[47.30703125000005,44.103125],[47.462792968749994,43.55502929687498],[47.64648437500003,43.88461914062498],[47.463183593750074,43.03505859375002],[48.572851562500006,41.84448242187503],[47.79101562499997,41.19926757812502],[47.31767578125002,41.28242187500001],[46.74931640625002,41.812597656250006],[46.42988281250004,41.890966796875006],[46.21269531250002,41.989892578124994],[45.63857421875005,42.20507812500003],[45.63427734374997,42.234716796875034],[45.72753906249997,42.47504882812498],[45.70527343750004,42.49809570312496],[45.56289062499999,42.53574218749998],[45.34375,42.52978515625003],[45.16025390625006,42.675],[45.07158203125002,42.69414062500002],[44.94335937499997,42.73027343750002],[44.870996093749994,42.75639648437499],[44.850488281249994,42.746826171875],[44.77109375000006,42.61679687499998],[44.69179687499999,42.709619140624966],[44.64433593750002,42.734716796875034],[44.50585937500003,42.748632812500006],[44.329492187499994,42.703515624999966],[44.10273437500004,42.616357421874994],[44.004687500000074,42.59560546875002],[43.95742187500005,42.56655273437505],[43.825976562500074,42.571533203125],[43.759863281250006,42.593847656250006],[43.738378906250006,42.61699218750002],[43.74990234375005,42.65751953125002],[43.79541015624997,42.702978515625034],[43.78261718750005,42.747021484374955],[43.62304687500003,42.80771484374998],[43.5578125000001,42.844482421875],[43.089160156250074,42.9890625],[43.00019531250004,43.04965820312506],[42.991601562499994,43.09150390624998],[42.76064453125005,43.169580078124966],[41.58056640624997,43.21923828124997],[41.460742187500074,43.276318359374955],[41.35820312500002,43.33339843750005],[41.08310546875006,43.37446289062498],[40.94199218750006,43.41806640624998],[40.801660156249994,43.479931640624955],[40.64804687500006,43.53388671875004],[40.084570312500006,43.553125],[40.02373046875002,43.48486328125],[39.873632812500006,43.47280273437502],[38.71728515624997,44.28808593750003],[38.18125,44.41967773437503],[37.851464843749994,44.698828125000034],[37.49511718750003,44.69526367187504],[37.20478515625004,44.97197265624999],[36.62763671875004,45.15131835937504],[36.941210937500074,45.289697265624994],[36.72041015625004,45.371875],[36.8659179687501,45.42705078124999],[37.21357421875004,45.272314453125006],[37.6471679687501,45.37719726562506],[37.61240234375006,45.56469726562506],[37.93310546875003,46.001708984375],[38.014257812500006,46.047753906249966],[38.07958984375003,45.93481445312506],[38.18359374999997,46.09482421875006],[38.49228515625006,46.09052734374998],[37.913867187500074,46.40649414062503],[37.766503906249994,46.63613281250002],[38.50097656249997,46.663671875000034],[38.43867187500004,46.813085937500006],[39.29345703125003,47.105761718750045],[39.19570312499999,47.268847656250045],[39.023730468750074,47.27221679687503],[38.928320312500006,47.175683593749994],[38.55244140625004,47.15034179687498],[38.7619140625001,47.261621093749994],[38.21435546875003,47.091455078124966],[38.36884765625004,47.609960937500006],[38.90029296875005,47.85512695312502],[39.77871093750005,47.88754882812506],[39.95791015625005,48.268896484375034],[39.8356445312501,48.54277343749996],[39.6447265625001,48.591210937499966],[39.792871093749994,48.807714843750034],[40.00361328125004,48.82207031250002],[39.68652343749997,49.007910156250034],[40.10878906250005,49.251562500000034],[40.080664062500006,49.576855468749955],[39.780566406250074,49.57202148437503],[39.17480468750003,49.85595703124997],[38.91835937499999,49.82470703125],[38.258593750000074,50.05234375],[38.046875,49.92001953125006],[37.42285156249997,50.411474609375006],[36.619433593750074,50.209228515625],[36.1164062500001,50.408544921875006],[35.59111328125002,50.36875],[35.31191406250005,51.043896484374955],[35.0640625,51.203417968750045],[34.21386718750003,51.25537109375006],[34.12109375000003,51.67915039062498],[34.397851562499994,51.780419921874994],[33.735253906249994,52.344775390625045],[32.435449218749994,52.307226562500034],[32.12226562500004,52.05058593749996],[31.763378906250097,52.10107421875003],[31.758593750000017,52.125830078125034],[31.690625,52.22065429687498],[31.64990234374997,52.26220703125],[31.60156250000003,52.284814453124994],[31.57734375000004,52.31230468749999],[31.585546875,52.532470703125],[31.56484375,52.75922851562501],[31.53515624999997,52.798242187499966],[31.442773437499994,52.86181640625003],[31.35302734374997,52.93344726562498],[31.295117187500097,52.98979492187499],[31.25878906249997,53.01669921875006],[31.364550781250017,53.13896484375002],[31.388378906250097,53.18481445312503],[31.41787109375005,53.196044921875],[31.849707031250006,53.106201171875],[32.14199218750005,53.091162109375034],[32.46933593750006,53.270312500000045],[32.578027343749994,53.312402343749994],[32.644433593749994,53.32890624999999],[32.70429687500004,53.33632812499999],[32.45097656250002,53.6533203125],[32.20039062500004,53.78125],[31.99218750000003,53.796875],[31.82080078124997,53.79194335937498],[31.754199218750017,53.81044921875002],[31.825292968750006,53.93500976562501],[31.837792968749994,54.00078124999999],[31.825976562500074,54.030712890624955],[31.79199218749997,54.05590820312503],[31.62841796874997,54.111181640625006],[31.403613281250017,54.195947265624966],[31.299121093750017,54.29169921875001],[31.184765625000097,54.452978515625006],[31.074804687500063,54.491796875],[31.154882812500063,54.610937500000034],[31.152148437500017,54.625341796875034],[31.12128906250004,54.64848632812496],[30.984179687500074,54.695898437500034],[30.79882812499997,54.78325195312499],[30.79101562499997,54.806005859375006],[30.804492187500074,54.8609375],[30.829882812500017,54.91499023437498],[30.977734375000097,55.05048828124998],[30.977734375000097,55.08779296875002],[30.958886718749994,55.13759765625005],[30.87744140625003,55.223437500000045],[30.81445312499997,55.27871093750002],[30.81054687499997,55.306982421875006],[30.82099609375004,55.330273437499955],[30.900585937500097,55.397412109374955],[30.906835937500063,55.57001953125004],[30.625585937500006,55.666259765625],[30.23359375000004,55.84521484375006],[30.04267578125004,55.83642578125003],[29.93701171874997,55.84526367187499],[29.881640625000074,55.83232421875002],[29.82392578125004,55.79511718749998],[29.74414062499997,55.770410156249994],[29.630078125000097,55.75117187499998],[29.482226562500074,55.6845703125],[29.412988281249994,55.72485351562506],[29.35341796875005,55.784375],[29.375,55.938720703125],[28.284277343750006,56.055908203125],[28.14794921875003,56.142919921875034],[28.202050781250023,56.260400390624994],[28.191699218750045,56.31557617187505],[28.169238281250017,56.386865234374994],[28.11083984375,56.51069335937501],[28.103125,56.545703125000045],[27.89208984375003,56.741064453125034],[27.88154296875001,56.82416992187501],[27.848632812500057,56.85341796875002],[27.806054687499994,56.86708984375005],[27.639453125000074,56.84565429687504],[27.83027343750004,57.19448242187505],[27.83828125000008,57.247705078124966],[27.82861328124997,57.293310546875006],[27.796875,57.316943359375045],[27.538671875000063,57.429785156250034],[27.51113281250005,57.508154296875006],[27.469726562500057,57.524023437500034],[27.35195312500005,57.528125],[27.4,57.66679687499999],[27.542089843750063,57.799414062500006],[27.778515625000068,57.87070312500006],[27.502441406250057,58.221337890624994],[27.434179687500006,58.787255859374994],[28.15107421875004,59.374414062499966],[28.0125,59.484277343749966],[28.05800781250008,59.781542968750045],[28.334570312500034,59.69252929687502],[28.518164062500034,59.849560546874955],[28.947265625000057,59.828759765624994],[29.147265625000045,59.999755859375],[30.12255859374997,59.873583984375074],[30.172656250000017,59.957128906250034],[29.72119140624997,60.19531249999997],[29.069140625000017,60.19145507812499],[28.643164062500006,60.375292968750045],[28.512792968750006,60.67729492187502],[27.797656250000074,60.53613281250003],[29.69013671875004,61.54609375000001],[31.18671875000004,62.48139648437504],[31.533984375000017,62.885400390624994],[31.180859375000097,63.208300781250074],[29.991503906250074,63.73515625000002],[30.50390625000003,64.02060546875],[30.513769531250006,64.2],[30.04189453125005,64.44335937499997],[30.072851562500063,64.76503906250005],[29.60419921875004,64.968408203125],[29.826953125000017,65.14506835937502],[29.608007812500006,65.248681640625],[29.715917968750063,65.62456054687502],[30.102734375000097,65.72626953125004],[29.066210937500045,66.89174804687497],[29.988085937500017,67.66826171874999],[29.343847656250006,68.06186523437506],[28.685156250000034,68.189794921875],[28.470703125000057,68.48837890625],[28.77285156250005,68.84003906249995],[28.414062500000057,68.90415039062506],[28.96582031250003,69.02197265625],[29.38828125,69.29814453125005],[30.08730468750005,69.43286132812503],[30.18017578124997,69.63583984375],[30.860742187499994,69.53842773437503],[30.869726562500006,69.78344726562506],[31.546972656250063,69.696923828125],[31.997949218749994,69.80991210937503],[31.98457031250004,69.95366210937499],[33.00781249999997,69.72211914062498],[32.91503906249997,69.60170898437497],[32.17675781250003,69.67402343749995],[32.37773437500002,69.47910156250003],[32.99980468750002,69.4701171875],[32.97890625000005,69.367333984375],[33.45429687500004,69.42817382812495],[33.14121093750006,69.068701171875],[33.684375,69.31025390625001],[35.85791015625003,69.19174804687503],[37.73056640625006,68.69213867187503],[38.43017578125003,68.35561523437505],[39.568945312500006,68.07172851562501],[39.82333984375006,68.05859375],[39.80927734375004,68.15083007812498],[40.38066406250002,67.831884765625],[40.96640625000006,67.71347656250003],[41.358789062499994,67.20966796874998],[41.18896484375003,66.82617187500003],[40.10332031250002,66.29995117187502],[38.65390625000006,66.06904296874995],[35.51347656250002,66.39580078125002],[34.82460937499999,66.61113281249999],[34.48261718750004,66.55034179687505],[34.4515625,66.651220703125],[33.15019531250002,66.84394531250001],[32.93046875000002,67.08681640625002],[31.895312500000074,67.16142578125002],[33.65595703125004,66.44262695312506],[33.36054687500004,66.32954101562501],[34.112695312499994,66.225244140625],[34.69179687500005,65.95185546874998],[34.77695312500006,65.76826171874998],[34.40644531250004,65.39575195312503],[35.03535156250004,64.44023437500005],[35.802050781250074,64.3353515625],[36.3649414062501,64.00283203125002],[37.44218750000002,63.813378906249966],[37.9679687500001,63.949121093749994],[38.0622070312501,64.09101562499995],[37.953710937500006,64.32011718749999],[37.183691406250006,64.40849609375007],[36.6242187500001,64.75053710937502],[36.534570312499994,64.93862304687497],[36.88281249999997,65.17236328124997],[39.7580078125001,64.57705078125002],[40.05781250000004,64.77075195312497],[40.44492187500006,64.7787109375],[39.7980468750001,65.349853515625],[39.816503906250006,65.59794921874999],[41.4757812500001,66.12343750000002],[42.21054687500006,66.51967773437502],[43.23320312500002,66.41552734375003],[43.653125,66.2509765625],[43.54189453125005,66.12338867187503],[43.84375,66.14238281249999],[44.10439453125005,66.00859374999999],[44.42929687500006,66.93774414062503],[43.7824218750001,67.25449218749998],[44.20468750000006,68.25375976562498],[43.33320312500004,68.67338867187502],[44.04804687500004,68.54882812499997],[45.891992187499994,68.47968750000001],[46.69042968750003,67.84882812500001],[45.52871093750005,67.75756835937497],[44.90214843750002,67.41313476562505],[45.56220703125004,67.18559570312507],[45.88535156250006,66.89106445312501],[46.4923828125001,66.80019531249997],[47.65585937500006,66.97592773437498],[47.87470703125004,67.58417968749998],[48.83320312500004,67.681494140625],[48.75429687500005,67.89594726562501],[49.15527343750003,67.87041015625005],[51.994726562500006,68.53876953124995],[52.3966796875001,68.35170898437505],[52.72265624999997,68.484033203125],[52.34404296875002,68.60815429687497],[53.80195312500004,68.99589843750002],[54.49121093750003,68.992333984375],[53.797656250000074,68.90747070312503],[53.9308593750001,68.43554687499997],[53.260546875000074,68.26748046875002],[54.476171875,68.29414062499995],[54.86132812500003,68.20185546874998],[55.418066406250006,68.56782226562501],[56.04365234375004,68.64887695312501],[57.126855468749994,68.55400390625005],[58.17304687500004,68.88974609375006],[59.0573242187501,69.00605468750004],[59.37050781250005,68.73837890625003],[59.09902343750005,68.4443359375],[59.725683593750006,68.35161132812502],[59.89599609374997,68.70634765624999],[60.489160156249994,68.72895507812498],[60.93359374999997,68.98676757812501],[60.17060546875004,69.59091796875],[60.90908203125005,69.84711914062495],[64.19042968750003,69.53466796875],[64.89628906250002,69.247802734375],[67.00244140625003,68.87358398437505],[68.37119140625006,68.31425781250005],[69.14052734375005,68.95063476562501],[68.54277343750002,68.96708984374999],[68.00585937499997,69.48002929687505],[67.62412109375,69.58442382812501],[67.06445312500003,69.69370117187498],[66.89667968750004,69.55380859374998],[67.28476562500006,70.73872070312498],[67.14335937500002,70.83754882812502],[66.70224609375006,70.81850585937497],[66.63964843749997,71.08139648437498],[68.2692382812501,71.68281250000001],[69.61181640625003,72.98193359375],[69.73828124999997,72.88496093749998],[71.5001953125001,72.91367187500003],[72.812109375,72.69140624999997],[72.57412109375,72.01254882812506],[71.86728515625,71.457373046875],[72.70449218750005,70.96323242187498],[72.5767578125,68.96870117187498],[73.59169921875005,68.48188476562501],[73.13945312500002,68.18134765624998],[73.06679687500005,67.766943359375],[71.84746093750002,67.00761718750005],[71.36523437500003,66.96152343749998],[71.53955078125003,66.68310546875],[70.72490234375007,66.51943359374997],[70.38281249999997,66.60249023437501],[70.69072265625002,66.74531249999998],[70.2833984375001,66.68579101562503],[69.8771484375001,66.84545898437506],[69.21777343749997,66.82861328125],[69.01347656250002,66.78833007812503],[69.19433593749997,66.57866210937505],[70.33945312500006,66.34238281250006],[71.35800781250006,66.35942382812505],[71.91699218749997,66.24672851562502],[72.32158203125002,66.33212890625],[72.4173828125,66.56079101562506],[73.79208984375,66.99531250000001],[74.07451171875007,67.41411132812499],[74.76953124999997,67.76635742187497],[74.39140625000007,68.42060546874995],[74.57958984375003,68.751220703125],[76.10751953125006,68.975732421875],[76.45917968750004,68.97827148437497],[77.2384765625001,68.46958007812498],[77.17441406250012,67.77851562499998],[77.77158203125006,67.57026367187501],[78.92246093750006,67.58911132812503],[77.58828125000005,67.75190429687498],[77.66484375000002,68.19038085937495],[77.99511718749997,68.25947265624998],[77.65068359375007,68.90302734375001],[76.00097656249997,69.23505859374998],[75.42001953125,69.23862304687498],[74.81484375,69.09057617187503],[73.83603515625006,69.143212890625],[73.578125,69.80297851562503],[74.34335937500006,70.57871093749998],[73.08623046875007,71.44492187500006],[73.67177734375,71.84506835937503],[74.99218749999997,72.14482421874999],[74.78681640625004,72.811865234375],[75.15244140625,72.85273437499998],[75.74140625000004,72.29624023437503],[75.273828125,71.95893554687495],[75.33203125000003,71.34174804687498],[76.92900390625002,71.12788085937504],[77.58964843750007,71.16791992187501],[78.32060546875002,70.93041992187503],[78.94218750000002,70.93378906250001],[79.08388671875,71.00200195312505],[78.58769531250007,70.993896484375],[78.21259765625004,71.26630859374998],[76.43339843750002,71.55249023437503],[76.03242187500004,71.91040039062503],[76.87138671875002,72.03300781250005],[77.77753906250004,71.83642578125006],[78.23242187500003,71.95229492187502],[78.01640625000007,72.092041015625],[77.49287109375004,72.07172851562504],[77.47158203125,72.19213867187506],[78.22539062500007,72.37744140625006],[79.4220703125001,72.38076171875002],[80.7625,72.08916015625002],[81.66162109374997,71.71596679687502],[82.75781250000003,71.76411132812498],[83.23359375000004,71.66816406249995],[82.32285156250006,71.26000976562503],[82.16318359375012,70.59814453125003],[82.22119140625003,70.39570312499998],[82.86914062499997,70.95483398437503],[83.03017578125,70.58051757812498],[82.6823242187501,70.21772460937498],[83.0807617187501,70.09301757812497],[83.07382812500012,70.276708984375],[83.73593750000006,70.54648437499998],[83.15126953125005,71.10361328124998],[83.534375,71.68393554687498],[83.20029296875012,71.87470703125004],[82.64541015625005,71.92524414062504],[82.09365234375,72.26542968750005],[80.82705078125005,72.48828124999997],[80.84160156250007,72.94916992187498],[80.4245117187501,73.23115234374998],[80.5832031250001,73.56845703125003],[85.20058593750005,73.72153320312506],[86.89296875,73.88710937500002],[85.79257812500012,73.438330078125],[86.67705078125002,73.10678710937503],[85.93896484374997,73.45649414062495],[87.12011718750003,73.61503906250002],[87.57119140625,73.81074218750001],[86.57109375000007,74.24375],[86.0013671875,74.316015625],[86.39580078125007,74.45009765624997],[86.89794921874997,74.32534179687497],[87.22968750000004,74.3638671875],[85.79101562499997,74.6451171875],[86.20126953125006,74.81621093750005],[86.65146484375012,74.68242187500005],[87.04179687500007,74.77885742187499],[87.46757812500002,75.01323242187505],[86.93906250000006,75.06811523437503],[87.00595703125012,75.16982421874997],[87.67138671874997,75.12958984375004],[90.18496093750005,75.59106445312497],[94.07519531249997,75.91289062499999],[92.89042968750002,75.90996093750002],[93.25927734375003,76.09877929687502],[95.57871093750012,76.13730468749998],[96.07548828125007,76.08198242187498],[95.65332031250003,75.89218750000003],[96.50859375000002,76.00556640624995],[96.49707031249997,75.89121093750003],[98.66201171875005,76.24267578125003],[99.77041015625,76.02875976562498],[99.5407226562501,75.79858398437497],[99.85136718750007,75.93027343749998],[99.8253906250001,76.13593749999995],[98.80566406250003,76.48066406250004],[100.84375,76.52519531250005],[101.59775390625006,76.43920898437503],[100.92802734375002,76.55673828124998],[100.98994140625004,76.99047851562497],[102.61015625000007,77.508544921875],[104.01455078125,77.73041992187501],[106.05957031249997,77.39052734375002],[104.20244140625002,77.101806640625],[106.9416015625001,77.034375],[107.42978515625006,76.92656250000002],[106.41357421874997,76.51225585937499],[107.72216796875003,76.52231445312498],[108.18164062500003,76.73784179687502],[111.39248046875,76.686669921875],[112.09394531250004,76.48032226562506],[111.94267578125002,76.38046875000003],[112.61953125,76.38354492187506],[112.65625,76.05356445312498],[113.2726562500001,76.25166015625001],[113.5638671875,75.89165039062502],[113.85722656250007,75.92128906250002],[113.56757812500004,75.56840820312499],[112.45302734375,75.83017578125003],[112.95566406250006,75.571923828125],[113.24296875000007,75.61142578125003],[113.72617187500012,75.45063476562498],[112.92490234375012,75.01503906249997],[109.84033203124997,74.32197265624998],[109.8102539062501,74.16918945312503],[108.19951171875002,73.69409179687497],[107.27109375000006,73.62104492187501],[106.67939453125004,73.3306640625],[106.1886718750001,73.3080078125],[105.14394531250005,72.77705078125001],[105.7082031250001,72.836669921875],[106.47792968750005,73.13940429687503],[107.750390625,73.17314453125007],[109.33105468749997,73.48745117187497],[109.85527343750002,73.47246093750002],[110.86816406249997,73.73071289062497],[109.70673828125004,73.74375],[110.2614257812501,74.01743164062503],[111.05625,73.93935546875002],[111.13085937500003,74.05283203125003],[111.55058593750007,74.02851562499998],[111.22812500000012,73.96855468750002],[111.40039062500003,73.827734375],[112.14726562500007,73.70893554687498],[112.79541015625003,73.74609375],[112.83593750000003,73.96206054687502],[113.03281250000006,73.91386718750007],[113.4162109375001,73.647607421875],[113.15693359375004,73.45957031249998],[113.49091796875004,73.34609375000002],[113.12783203125,72.8306640625],[113.66455078124997,72.63452148437503],[113.2155273437501,72.80585937500001],[113.88623046875003,73.34580078124998],[113.51035156250012,73.50498046874998],[115.33769531250007,73.70258789062501],[118.87089843750007,73.53789062500002],[118.45703124999997,73.46440429687507],[118.43027343750012,73.24653320312501],[119.750390625,72.97910156250006],[122.26015625,72.88056640624995],[122.75195312500003,72.906494140625],[122.61523437499997,73.02792968750006],[123.1603515625001,72.95488281250002],[123.62226562500004,73.19326171875],[123.49111328125005,73.666357421875],[124.54121093750004,73.75126953125007],[125.59853515625005,73.447412109375],[126.25449218750012,73.548193359375],[126.55253906250007,73.33491210937498],[127.03134765625006,73.54746093750003],[127.74033203125012,73.48154296875],[129.10058593750003,73.11235351562502],[128.5990234375,72.895166015625],[129.01728515625004,72.8724609375],[129.250390625,72.70517578125003],[128.41826171875002,72.53515625000003],[129.28134765625006,72.43769531249998],[129.41064453124997,72.16630859375002],[128.93496093750005,72.07949218750002],[127.8034179687501,72.43403320312504],[127.84140625000012,72.308251953125],[128.91142578125002,71.75532226562495],[129.21025390625007,71.91694335937501],[129.46083984375,71.73930664062499],[128.84326171875003,71.6634765625],[129.76191406250004,71.11953125000002],[130.53710937500003,70.89252929687495],[130.75712890625002,70.96235351562498],[131.02158203125006,70.74609374999997],[132.0353515625001,71.24404296875],[132.65390625000006,71.92597656250001],[133.6888671875,71.434228515625],[134.70273437500012,71.38681640625003],[135.55917968750006,71.6103515625],[136.09033203125003,71.61958007812501],[137.9396484375001,71.1333984375],[137.84404296875007,71.22680664062503],[138.31406250000006,71.32553710937498],[137.918359375,71.38408203124999],[138.23417968750007,71.596337890625],[138.78017578125,71.62900390624998],[139.209375,71.44477539062501],[139.98417968750007,71.49150390625005],[139.72294921875002,71.88496093749998],[139.35927734375005,71.95136718750001],[140.18769531250004,72.19130859374997],[139.17636718750006,72.16347656249997],[139.14082031250004,72.32973632812502],[139.60117187500012,72.49609374999997],[141.07929687500004,72.5869140625],[140.80820312500006,72.89096679687503],[142.06142578125005,72.72080078125],[146.25292968749997,72.442236328125],[146.234765625,72.34970703125],[144.77636718749997,72.38227539062495],[144.16923828125002,72.25878906250003],[144.29492187499997,72.19262695312497],[146.83183593750007,72.29541015625003],[146.11328125000003,71.94497070312497],[146.23027343750007,72.1375],[145.75859375000007,72.22587890624999],[145.75673828125005,71.94130859375002],[145.06396484374997,71.92607421875002],[145.18857421875012,71.69580078125],[146.07324218749997,71.80834960937503],[147.26181640625006,72.327880859375],[149.50156250000012,72.16430664062497],[150.01689453125002,71.89565429687505],[149.04873046875005,71.79575195312503],[148.9681640625,71.69047851562499],[150.59980468750004,71.5201171875],[150.09765624999997,71.22656249999997],[150.96777343749997,71.38046874999998],[151.58242187500005,71.28696289062503],[152.09277343749997,71.02329101562503],[151.76201171875002,70.98247070312499],[152.50878906250003,70.83447265625003],[156.68457031250003,71.09375],[158.03701171875005,71.03925781250001],[159.35068359375006,70.79072265625001],[160.00644531250006,70.30966796875006],[159.72939453125005,69.87021484375006],[160.91074218750012,69.60634765625002],[161.03554687500005,69.09819335937507],[161.30986328125007,68.98227539062498],[160.85605468750006,68.53833007812506],[161.565625,68.90517578125],[161.53691406250002,69.379541015625],[162.16601562499997,69.61157226562503],[163.20136718750004,69.71474609375],[166.82031250000003,69.49956054687505],[167.8568359375,69.72822265624998],[168.30302734375002,69.27148437500003],[169.31064453125006,69.07954101562498],[169.60986328124997,68.78603515624997],[170.53759765624997,68.82539062500001],[170.99541015625002,69.04531250000005],[170.58222656250004,69.58334960937506],[170.16093750000007,69.62656249999998],[170.48681640625003,70.107568359375],[173.27744140625006,69.823828125],[173.43867187500004,69.94682617187502],[175.92148437500012,69.89531250000002],[179.27265624999998,69.25966796875002],[180,68.98344726562505],[180,65.06723632812498],[178.51953125000003,64.60297851562498],[177.7486328125,64.71704101562503],[176.88085937499997,65.08193359375002],[176.34101562500015,65.04731445312501],[177.03730468750004,64.99965820312497],[177.22285156250004,64.861669921875],[177.06875,64.78666992187502],[176.06113281250012,64.96088867187498],[174.54882812500009,64.68388671875005],[176.0565429687501,64.90473632812498],[176.35097656250005,64.70512695312502],[176.14091796875007,64.58583984375005],[177.42744140625015,64.76337890624998],[177.43291015625002,64.44448242187502],[177.6875,64.30473632812507],[178.04472656250013,64.21958007812503],[178.22949218749991,64.36440429687497],[178.38144531250018,64.26088867187502],[178.73144531250003,63.667089843750006],[178.44042968750009,63.605566406250006],[178.74404296874994,63.39477539062503],[178.79296874999997,63.54033203125002],[179.38857421875,63.14721679687497],[179.25957031250002,63.00830078125],[179.5705078125001,62.6875],[179.12070312500012,62.32036132812499],[177.292578125,62.59902343750002],[177.33896484375006,62.781347656250034],[177.02353515625012,62.777246093749994],[177.15947265625007,62.56098632812498],[174.51435546875015,61.823632812499966],[173.6234375,61.716064453125],[173.13183593749997,61.40664062500002],[172.85654296875006,61.469189453124955],[172.90800781250002,61.311621093750006],[172.39609375000006,61.16738281250002],[172.39277343750004,61.061767578125],[170.60820312500007,60.434912109375034],[170.3509765625,59.965527343749955],[169.9826171875001,60.067089843749955],[169.2267578125001,60.59594726562497],[168.1375,60.57392578125001],[167.22675781250004,60.406298828125045],[166.27304687500012,59.85625],[166.13603515625007,59.979345703125034],[166.35214843750006,60.48481445312498],[165.08457031250006,60.09858398437498],[164.95371093750006,59.843603515625006],[164.52529296875,60.06127929687503],[164.11328125000003,59.89755859374998],[164.13505859375002,59.984375],[163.74384765625004,60.02802734374998],[163.36484375000012,59.78144531250004],[163.27285156250005,59.302587890625006],[162.14160156249997,58.44741210937502],[161.96005859375012,58.07690429687506],[162.39140625000002,57.717236328124955],[162.65429687499997,57.94824218750003],[163.22578125000004,57.790380859375034],[162.77929687500003,57.35761718749998],[162.79111328125012,56.875390624999966],[162.92207031250004,56.72265625000003],[163.2565429687501,56.68803710937499],[163.33554687500012,56.232519531250006],[163.04736328125003,56.044677734375],[162.84033203125003,56.065625],[162.628125,56.232275390625034],[163.03837890625002,56.521875],[162.67148437500006,56.49008789062498],[162.52822265625005,56.260693359374955],[162.08496093749997,56.08964843750002],[161.72392578125002,55.49614257812499],[162.10556640625006,54.75214843750004],[161.62480468750002,54.51625976562502],[160.77265625000004,54.54135742187498],[160.0744140625001,54.18916015625001],[159.84375,53.78364257812498],[160.02509765625004,53.129589843749955],[159.58593750000003,53.237695312499966],[158.74541015625002,52.90893554687506],[158.47207031250005,53.032373046874966],[158.6087890625,52.873632812500034],[158.49316406249997,52.383154296875034],[158.10351562500003,51.80961914062499],[156.84746093750002,51.006591796875],[156.74775390625004,50.969287109375045],[156.52119140625004,51.38027343750002],[156.36474609374997,52.509375],[156.11035156250003,52.86616210937504],[155.62031250000004,54.86455078125002],[155.5548828125001,55.348486328125034],[155.98251953125012,56.69521484375002],[156.8488281250001,57.290185546874994],[156.97675781250004,57.46630859375],[156.82988281250007,57.77963867187498],[157.4503906250001,57.79926757812498],[157.66640625000005,58.01977539062506],[158.27519531250007,58.00898437499998],[159.21064453125004,58.519433593749966],[159.8473632812501,59.127148437499955],[161.75351562500012,60.15229492187501],[162.06816406250002,60.466406250000034],[163.70996093749997,60.916796875000045],[163.55351562500002,61.02563476562503],[164.00546875000006,61.34379882812499],[163.80439453125004,61.46137695312498],[164.20722656250004,62.29223632812506],[164.59833984375004,62.470556640625034],[165.20810546875012,62.37397460937501],[165.41738281250005,62.447070312500045],[164.418359375,62.704638671875045],[163.33173828125004,62.550927734374994],[163.01767578125006,61.89106445312504],[163.25781249999997,61.69946289062497],[163.08525390625002,61.570556640625],[162.85595703125003,61.705029296874955],[162.39257812500003,61.662109375],[160.76660156249997,60.753320312499966],[160.17363281250002,60.638427734375],[160.37890625000003,61.02548828124998],[159.79042968750005,60.956640625],[160.309375,61.894384765625006],[159.55234375000012,61.71948242187497],[159.18925781250007,61.92939453125001],[158.07011718750002,61.75361328125001],[157.46933593750012,61.798925781250006],[157.0841796875001,61.67568359375002],[155.71611328125002,60.682373046875],[154.97080078125012,60.376660156249955],[154.29306640625006,59.833349609375034],[154.1498046875,59.52851562500001],[154.97128906250006,59.44960937500002],[155.16044921875002,59.19013671875001],[154.45800781250003,59.21655273437497],[154.01093750000004,59.075537109375006],[153.69521484375005,59.22475585937505],[153.36113281250002,59.214794921874955],[152.81787109375003,58.92626953124997],[152.31962890625002,59.03076171875003],[152.08789062499997,58.910449218750045],[151.32675781250006,58.875097656250034],[151.12109375000003,59.08251953125003],[152.26064453125,59.22358398437498],[151.34824218750012,59.561132812500006],[150.4835937500001,59.494384765625],[150.66728515625002,59.55634765625001],[149.64257812499997,59.770410156249994],[149.06523437500002,59.63051757812502],[149.20498046875,59.488183593749966],[148.79707031250004,59.532324218750006],[148.74414062499997,59.37353515624997],[148.96464843750007,59.36914062499997],[148.72666015625006,59.257910156250034],[148.25742187500006,59.414208984374994],[147.51445312500002,59.2685546875],[146.53720703125006,59.45698242187501],[146.0495117187501,59.17055664062502],[145.55458984375,59.413525390624955],[143.19218750000002,59.3701171875],[142.58027343750004,59.240136718749966],[140.79023437500004,58.30346679687503],[140.446875,57.81367187499998],[138.66210937500003,56.96552734375004],[137.69150390625006,56.13935546875004],[135.2625,54.94331054687498],[135.25771484375005,54.73149414062499],[135.85156249999997,54.583935546874955],[136.797265625,54.62099609375005],[136.71884765625006,53.804101562499994],[137.15537109375012,53.82167968750002],[137.14160156249997,54.182226562500006],[137.66601562500003,54.283300781250006],[137.3392578125,54.10053710937498],[137.83476562500002,53.94672851562498],[137.25371093750007,53.546142578125],[137.95048828125007,53.60356445312499],[138.52792968750012,53.959863281249994],[138.56914062500002,53.818798828124955],[138.24970703125004,53.524023437500034],[138.45068359375003,53.53701171875002],[138.69941406250004,53.869726562500034],[138.65722656249997,54.29833984375003],[139.31972656250005,54.19296874999998],[139.707421875,54.27714843749999],[140.68759765625012,53.59643554687503],[141.3737304687501,53.29277343749999],[141.18125,53.01528320312505],[140.83964843750002,53.087890625],[141.25585937499997,52.84013671874996],[141.13242187500006,52.435693359374994],[141.48525390625,52.17851562500002],[141.36689453125004,51.92065429687506],[140.93261718750003,51.61992187499999],[140.5208984375,50.80019531250005],[140.62451171874997,50.08242187500002],[140.46269531250002,49.911474609375006],[140.51718750000012,49.59614257812498],[140.17060546875004,48.52368164062497],[138.58681640625005,47.057226562500006],[138.33691406250003,46.543408203124955],[137.68544921875,45.81835937500003],[136.14228515625004,44.489111328125034],[135.87460937500012,44.37353515625003],[135.1310546875001,43.52573242187506],[134.01044921875004,42.94746093750001],[133.15996093750007,42.69697265624998],[132.70898437500003,42.875830078125006],[132.30380859375006,42.88330078125],[132.30957031249997,43.31352539062499],[131.8666015625,43.09516601562501],[131.93896484374997,43.30195312500004],[131.15830078125012,42.62602539062499],[130.709375,42.656396484374966],[130.8341796875001,42.52294921875006],[130.68730468750007,42.30253906249999]]],[[[107.69550781250004,78.13090820312505],[107.48164062500004,78.057763671875],[106.41552734375003,78.13984375000001],[107.69550781250004,78.13090820312505]]],[[[102.88476562499997,79.25395507812505],[102.4123046875001,78.83544921874997],[103.80078124999997,79.14926757812503],[104.45205078125005,78.880029296875],[105.14599609375003,78.81884765625006],[105.31259765625012,78.49990234375],[104.74179687500012,78.33974609374997],[102.79667968750007,78.18789062500002],[101.20410156249997,78.19194335937505],[99.50029296875002,77.97607421875003],[101.590625,79.350439453125],[102.25126953125002,79.25605468749995],[102.40488281250006,79.43320312499998],[102.88476562499997,79.25395507812505]]],[[[76.24892578125005,79.65107421874995],[77.58896484375012,79.50190429687504],[76.64951171875012,79.493408203125],[76.24892578125005,79.65107421874995]]],[[[92.68349609375005,79.685205078125],[91.37626953125007,79.83549804687505],[91.22929687500007,80.03071289062504],[93.803125,79.904541015625],[92.68349609375005,79.685205078125]]],[[[51.409277343750006,79.94423828125],[50.09140625,79.98056640625003],[50.93632812500002,80.09423828125],[51.409277343750006,79.94423828125]]],[[[59.68886718750005,79.95581054687506],[58.91923828125002,79.98461914062506],[59.54453125000006,80.11884765624995],[59.68886718750005,79.95581054687506]]],[[[97.67451171875004,80.15825195312499],[97.65166015625002,79.76064453125],[98.59648437500002,80.05219726562495],[100.0612304687501,79.77709960937506],[99.68066406250003,79.32333984374998],[99.04179687500007,79.29301757812502],[99.92929687500012,78.96142578124997],[98.41113281250003,78.78779296875004],[95.53105468750007,79.09809570312501],[95.02041015625005,79.05268554687498],[94.21875,79.40234375],[93.07080078124997,79.49531250000001],[94.98730468749997,80.096826171875],[95.28134765625012,80.030517578125],[97.67451171875004,80.15825195312499]]],[[[50.05175781250003,80.07431640625003],[49.55605468750005,80.15893554687503],[49.883691406249994,80.230224609375],[50.05175781250003,80.07431640625003]]],[[[57.07871093750006,80.35092773437498],[56.986914062500006,80.07148437499998],[55.811621093750006,80.08715820312497],[56.02441406250003,80.34130859374997],[57.07871093750006,80.35092773437498]]],[[[53.521386718749994,80.18520507812497],[52.34355468750002,80.213232421875],[52.85390625,80.40239257812499],[53.85166015625006,80.26835937500005],[53.521386718749994,80.18520507812497]]],[[[57.95625,80.12324218749995],[57.33232421875002,80.15810546875005],[57.075,80.49394531249999],[59.25546875000006,80.34321289062501],[58.39794921874997,80.31875],[57.95625,80.12324218749995]]],[[[54.41533203125002,80.47280273437502],[53.811914062499994,80.47622070312502],[53.87724609375002,80.60527343750002],[54.41533203125002,80.47280273437502]]],[[[47.441992187500006,80.853662109375],[48.44570312500005,80.80600585937506],[48.68359375000003,80.63325195312504],[47.7052734375001,80.76518554687499],[46.141406250000074,80.44672851562495],[45.969042968750074,80.56948242187502],[44.9049804687501,80.61127929687501],[47.441992187500006,80.853662109375]]],[[[62.167773437500074,80.83476562500005],[62.07578125000006,80.616943359375],[61.05126953124997,80.418603515625],[60.27832031249997,80.49443359374999],[59.649804687499994,80.43125],[59.59228515625003,80.81650390624998],[62.167773437500074,80.83476562500005]]],[[[50.278125,80.92724609374997],[51.70361328125003,80.68764648437502],[48.81103515625003,80.35371093750001],[48.97753906250003,80.16259765624997],[47.73730468749997,80.08168945312502],[47.89296875000005,80.23925781249997],[46.991015625000074,80.182763671875],[46.644433593749994,80.30034179687507],[47.89580078125002,80.52905273437503],[49.087792968749994,80.515771484375],[49.24433593750004,80.82138671875],[50.278125,80.92724609374997]]],[[[80.02666015625007,80.84814453125003],[79.09853515625005,80.81206054687505],[79.21738281250012,80.96035156249997],[80.27958984375007,80.94980468750003],[80.02666015625007,80.84814453125003]]],[[[61.1408203125001,80.95034179687497],[60.0783203125001,80.99916992187497],[61.45742187499999,81.10395507812501],[61.1408203125001,80.95034179687497]]],[[[54.71894531250004,81.11596679687497],[56.47226562500006,80.99824218749995],[57.58037109375002,80.75546874999998],[55.88339843750006,80.62841796875003],[54.66816406250004,80.73867187500002],[54.04541015624997,80.87197265625],[54.71894531250004,81.11596679687497]]],[[[58.62236328125002,81.04165039062502],[58.930566406249994,80.83168945312497],[58.28564453124997,80.76489257812503],[57.21093749999997,81.01708984374997],[58.04951171875004,81.11845703125002],[58.62236328125002,81.04165039062502]]],[[[63.37382812500002,80.70009765624997],[62.59257812500002,80.85302734375006],[64.80205078125002,81.197265625],[65.43740234375005,80.93071289062507],[63.37382812500002,80.70009765624997]]],[[[91.56718750000007,81.14121093750003],[91.2228515625001,81.063818359375],[89.90117187500002,81.17070312500002],[91.56718750000007,81.14121093750003]]],[[[96.52656250000004,81.0755859375],[97.86992187500007,80.76328125000006],[97.02539062499997,80.53554687500002],[97.29843750000006,80.27275390625005],[93.6546875,80.009619140625],[91.52382812500005,80.35854492187502],[93.2625,80.79125976562497],[92.59257812500007,80.780859375],[92.7103515625,80.87216796875003],[95.1595703125,81.27099609375003],[95.80068359375005,81.28046874999998],[96.52656250000004,81.0755859375]]],[[[57.81025390625004,81.54604492187502],[58.563867187499994,81.41840820312504],[57.858691406250074,81.36806640625],[57.76972656250004,81.16972656249999],[55.71669921875005,81.1884765625],[55.46601562500004,81.31118164062502],[57.81025390625004,81.54604492187502]]],[[[63.65097656250006,81.60932617187501],[62.10644531249997,81.679345703125],[63.709570312500006,81.68730468750002],[63.65097656250006,81.60932617187501]]],[[[58.29541015625003,81.715185546875],[58.13457031250002,81.82797851562498],[59.261816406250006,81.85419921874998],[59.35644531250003,81.75898437499995],[58.29541015625003,81.715185546875]]]]},"properties":{"name":"Russia","childNum":73}},{"geometry":{"type":"Polygon","coordinates":[[[30.50996093750001,-1.067285156250009],[30.47705078125,-1.0830078125],[30.47021484375,-1.131152343750003],[30.508105468750017,-1.208203125000011],[30.631933593750006,-1.367480468750003],[30.710742187500017,-1.396777343750003],[30.76220703125,-1.458691406250011],[30.812597656250006,-1.563085937500006],[30.8765625,-2.143359375],[30.85498046875,-2.265429687500003],[30.828710937500006,-2.338476562500006],[30.7625,-2.371679687500006],[30.71484375,-2.363476562500011],[30.656640625000023,-2.373828125],[30.593359375,-2.396777343750003],[30.553613281250023,-2.400097656250011],[30.408496093750017,-2.31298828125],[30.117285156250006,-2.416601562500006],[29.93017578125,-2.339550781250011],[29.8681640625,-2.71640625],[29.698046875000017,-2.794726562500003],[29.390234375,-2.80859375],[29.10205078125,-2.595703125],[29.01435546875001,-2.72021484375],[28.893945312500023,-2.635058593750003],[28.876367187500023,-2.400292968750009],[29.13154296875001,-2.195117187500003],[29.196582031250017,-1.719921875000011],[29.576953125000017,-1.387890625000011],[29.82539062500001,-1.335546875],[29.930078125000023,-1.469921875000011],[30.360253906250023,-1.074609375],[30.41230468750001,-1.063085937500006],[30.46992187500001,-1.066015625],[30.50996093750001,-1.067285156250009]]]},"properties":{"name":"Rwanda","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-8.683349609375,27.2859375],[-8.682861328125,26.921337890624997],[-8.6826171875,26.72314453125],[-8.682324218749983,26.497705078124994],[-8.68212890625,26.273193359375],[-8.68212890625,26.10947265625],[-8.682226562499977,25.995507812499994],[-12.016308593749983,25.995410156250003],[-12.016308593749983,25.740136718749994],[-12.016308593749983,25.331689453124994],[-12.016308593749983,25.059375],[-12.016308593749983,24.923242187499994],[-12.016308593749983,24.378662109375],[-12.016308593749983,23.97021484375],[-12.0234375,23.467578125],[-12.372900390624977,23.318017578124994],[-12.559375,23.290820312500003],[-12.620410156249989,23.27133789062499],[-13.031494140625,23.000244140625],[-13.153271484374983,22.820507812499997],[-13.155957031249983,22.68930664062499],[-13.094335937499977,22.495996093749994],[-13.051220703124983,21.854785156250003],[-13.041748046875,21.713818359374997],[-13.0322265625,21.572070312500003],[-13.025097656249983,21.466796875],[-13.016210937499977,21.333935546874997],[-15.231201171875,21.331298828125],[-16.964550781249983,21.329248046874994],[-17.06396484375,20.89882812499999],[-17.048046874999983,20.80615234375],[-17.098779296874994,20.856884765624997],[-17.009619140624977,21.377099609374994],[-17.003076171874994,21.420703125],[-17.00297851562499,21.42075195312499],[-16.951123046874983,21.43027343749999],[-16.73095703125,21.4703125],[-16.581005859374983,21.48105468749999],[-16.190869140624983,21.48105468749999],[-16.041015625,21.50058593749999],[-15.4609375,21.45078125],[-14.971142578124983,21.44101562499999],[-14.8408203125,21.45078125],[-14.7509765625,21.50058593749999],[-14.670849609374983,21.60019531249999],[-14.610791015624983,21.75058593749999],[-14.62109375,21.82089843749999],[-14.630859375,21.8609375],[-14.52099609375,21.990869140624994],[-14.22119140625,22.31015625],[-14.1708984375,22.76035156249999],[-14.12109375,22.96054687499999],[-14.10107421875,23.10019531249999],[-13.89111328125,23.69101562499999],[-13.840771484374983,23.75058593749999],[-13.770947265624983,23.790625],[-13.310986328124983,23.98105468749999],[-13.06103515625,24.40097656249999],[-12.991162109374983,24.4703125],[-12.40087890625,24.88046875],[-12.060986328124983,25.99082031249999],[-12.056787109374994,25.996337890625],[-12.03076171875,26.030859375],[-11.880859375,26.0708984375],[-11.7548828125,26.0865234375],[-11.718212890624983,26.1041015625],[-11.69921875,26.1626953125],[-11.684521484374983,26.2134765625],[-11.63720703125,26.2955078125],[-11.337890625,26.6333984375],[-11.316845703124983,26.7447265625],[-11.361279296874983,26.7935546875],[-11.392578125,26.8833984375],[-10.922802734374983,27.0103515625],[-10.830078125,27.0103515625],[-10.757763671874983,27.0201171875],[-10.654248046874983,27.0005859375],[-10.55126953125,26.9908203125],[-10.25146484375,26.8609375],[-9.81787109375,26.8501953125],[-9.4873046875,27.050390625],[-8.794873046874983,27.120703125],[-8.774365234374983,27.460546875],[-8.784570312499994,27.530859375],[-8.813916015624983,27.6138671875],[-8.817773437499994,27.655908203124994],[-8.817822265624983,27.656445312499997],[-8.683349609375,27.656445312499997],[-8.683349609375,27.2859375]]]},"properties":{"name":"W. Sahara","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[41.98769531250005,16.715625],[42.059960937499994,16.803515625000017],[42.15781250000006,16.570703125000023],[41.80156250000002,16.778759765624955],[41.86044921875006,17.002539062499977],[41.98769531250005,16.715625]]],[[[46.53144531250004,29.09624023437499],[47.433203125,28.989550781250017],[47.671289062499994,28.53315429687504],[48.442480468750006,28.542919921874983],[48.80898437499999,27.895898437499966],[48.797167968750074,27.72431640625001],[49.2375,27.49272460937499],[49.17509765625002,27.43764648437505],[49.40527343749997,27.18095703124996],[50.149804687499994,26.66264648437499],[50.00810546875002,26.678515625000017],[50.21386718750003,26.30849609375005],[50.15546875000004,26.100537109374955],[50.03164062499999,26.11098632812505],[50.55791015625002,25.086669921875],[50.66689453125005,24.96381835937501],[50.72558593749997,24.869384765625057],[50.80439453125004,24.789257812499983],[50.928320312500006,24.595117187500023],[50.96601562500004,24.573925781249983],[51.022753906250074,24.56523437499999],[51.09335937500006,24.564648437499955],[51.178027343750074,24.586718750000017],[51.26796875,24.607226562500017],[51.33847656250006,24.564355468749994],[51.41123046875006,24.570800781250057],[51.30986328125002,24.340380859375017],[51.56835937500003,24.286181640625074],[51.592578125000074,24.07885742187503],[52.55507812500005,22.932812499999955],[55.104296875000074,22.621484375000023],[55.185839843750074,22.7041015625],[55.64101562499999,22.001855468749994],[54.97734375000002,19.995947265625006],[51.977636718750006,18.996142578125074],[49.04199218750003,18.58178710937503],[48.17216796875002,18.156933593749983],[47.57958984374997,17.448339843750034],[47.44179687499999,17.111865234375045],[47.14355468749997,16.946679687499966],[46.97568359375006,16.953466796875034],[46.72763671875006,17.26557617187501],[45.5353515625001,17.30205078124999],[45.14804687500006,17.427441406249955],[43.91699218749997,17.32470703124997],[43.41796875000003,17.516259765625023],[43.19091796875003,17.359375],[43.16503906249997,16.689404296874955],[42.79931640624997,16.37177734375001],[42.29394531249997,17.434960937499966],[41.75,17.88574218749997],[41.22949218750003,18.678417968749983],[40.75917968750005,19.755468750000034],[40.080664062500006,20.265917968750017],[39.728320312500074,20.390332031249955],[39.27607421875004,20.973974609375034],[39.093554687500074,21.31035156249999],[39.14707031250006,21.518994140624955],[38.98789062500006,21.88173828125005],[39.06201171874997,22.592187500000023],[38.46416015625002,23.71186523437504],[37.91972656250002,24.185400390625063],[37.54306640625006,24.291650390625023],[37.18085937500004,24.82001953125001],[37.26630859375004,24.960058593750034],[37.14882812499999,25.291113281249977],[35.18046875000002,28.03486328125004],[34.722070312499994,28.130664062500017],[34.625,28.064501953125017],[34.95078125,29.353515625],[36.068457031250006,29.200537109375006],[36.28281250000006,29.355371093750023],[36.47607421874997,29.49511718749997],[36.59179687500003,29.666113281250006],[36.703906250000074,29.831640624999977],[36.75527343750005,29.86601562499996],[37.46923828125003,29.995068359374955],[37.49072265625003,30.01171874999997],[37.55361328125005,30.14458007812496],[37.63359375000002,30.313281250000045],[37.64990234374997,30.330957031249994],[37.669726562500074,30.34814453125003],[37.862890625,30.44262695312503],[37.98007812500006,30.5],[37.47900390624997,31.007763671874955],[37.10527343750002,31.35517578125004],[36.95859375000006,31.491503906250017],[37.215625,31.55610351562501],[37.49335937500004,31.625878906250023],[38.111425781250006,31.78115234375005],[38.37548828124997,31.84746093749996],[38.962304687499994,31.99492187499999],[38.99707031249997,32.00747070312505],[39.145410156249994,32.12451171875],[39.36865234374997,32.09174804687498],[39.70410156250003,32.04252929687499],[40.02783203124997,31.995019531249994],[40.3693359375001,31.93896484375003],[40.47890625000005,31.89335937499999],[42.07441406250004,31.08037109374999],[43.77373046875002,29.84921875],[44.71650390625004,29.19360351562503],[46.35644531250003,29.06367187500001],[46.53144531250004,29.09624023437499]]]]},"properties":{"name":"Saudi Arabia","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[36.87138671875002,21.996728515624994],[36.92695312500001,21.58652343749999],[37.25859375000002,21.108544921874994],[37.25722656250002,21.03940429687499],[37.15058593750001,21.103759765625],[37.14111328125,20.98178710937499],[37.19316406250002,20.12070312499999],[37.471289062500006,18.820117187500003],[38.609472656250006,18.005078125],[38.422460937500006,17.823925781249997],[38.39716796875001,17.778369140625003],[38.38554687500002,17.751269531250003],[38.37373046875001,17.717333984375003],[38.34736328125001,17.68359375],[38.28984375000002,17.637011718750003],[38.26728515625001,17.61669921875],[38.253515625,17.584765625],[37.78242187500001,17.4580078125],[37.547460937500006,17.324121093749994],[37.51015625000002,17.288134765625003],[37.45292968750002,17.108691406250003],[37.41103515625002,17.06171875],[37.24882812500002,17.056884765625],[37.16953125,17.04140625],[37.0615234375,17.061279296875],[37.00898437500001,17.058886718750003],[36.995214843750006,17.020556640625003],[36.97578125000001,16.86655273437499],[36.97871093750001,16.800585937500003],[36.887792968750006,16.624658203124994],[36.91376953125001,16.296191406250003],[36.566015625,15.362109375],[36.4267578125,15.132080078125],[36.44814453125002,14.940087890624994],[36.470800781250006,14.736474609374994],[36.52431640625002,14.2568359375],[36.12519531250001,12.75703125],[35.67021484375002,12.623730468749997],[35.1123046875,11.816552734374994],[34.93144531250002,10.864794921874989],[34.77128906250002,10.746191406249991],[34.571875,10.880175781249989],[34.34394531250001,10.658642578124997],[34.31123046875001,10.190869140624997],[34.078125,9.461523437499991],[33.87148437500002,9.506152343749989],[33.96328125000002,9.861767578124997],[33.90703125000002,10.181445312499989],[33.13007812500001,10.745947265624991],[33.073339843750006,11.606103515624994],[33.199316406250006,12.21728515625],[32.721875,12.223095703124997],[32.73671875000002,12.009667968749994],[32.072265625,12.006738281249994],[32.338476562500006,11.710107421874994],[32.42080078125002,11.089111328125],[31.224902343750017,9.799267578124997],[30.75537109375,9.731201171875],[30.003027343750006,10.277392578124989],[29.60546875,10.065087890624994],[29.47314453125,9.768603515624989],[28.979589843750006,9.594189453124997],[28.844531250000017,9.326074218749994],[28.048925781250006,9.32861328125],[27.880859375,9.601611328124989],[27.07421875,9.613818359374989],[26.65869140625,9.484130859375],[25.91914062500001,10.169335937499994],[25.858203125000017,10.406494140625],[25.211718750000017,10.329931640624991],[25.066992187500006,10.293798828124991],[24.785253906250006,9.774658203125],[24.53193359375001,8.886914062499997],[24.147363281250023,8.665625],[23.53730468750001,8.815820312499994],[23.46826171875,9.11474609375],[23.62265625,9.340625],[23.646289062500017,9.822900390624994],[22.86005859375001,10.919677734375],[22.922656250000017,11.344873046874994],[22.591113281250017,11.579882812499989],[22.580957031250023,11.990136718749994],[22.472460937500017,12.067773437499994],[22.352343750000017,12.660449218749989],[21.928125,12.678125],[21.825292968750006,12.79052734375],[22.228125,13.32958984375],[22.1064453125,13.7998046875],[22.53857421875,14.161865234375],[22.38154296875001,14.550488281249997],[22.6708984375,14.722460937500003],[22.93232421875001,15.162109375],[22.933886718750017,15.533105468749994],[23.10517578125001,15.702539062499994],[23.970800781250006,15.721533203124991],[23.980273437500017,19.496630859375003],[23.980273437500017,19.99594726562499],[24.9794921875,20.002587890624994],[24.980273437500017,21.995849609375],[28.036425781250017,21.995361328125],[31.092675781250023,21.994873046875],[31.260644531250023,22.00229492187499],[31.400292968750023,22.202441406250003],[31.486132812500017,22.14780273437499],[31.434472656250023,21.995849609375],[36.87138671875002,21.996728515624994]]]},"properties":{"name":"Sudan","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[34.078125,9.461523437499991],[34.07275390625,8.545263671874991],[33.95332031250001,8.443505859374994],[33.28105468750002,8.437255859375],[32.99892578125002,7.899511718749991],[33.902441406250006,7.509521484375],[34.06425781250002,7.225732421874994],[34.71064453125001,6.660302734374994],[34.98359375000001,5.858300781249994],[35.26835937500002,5.492285156249991],[35.08447265625,5.311865234374991],[34.87832031250002,5.109570312499997],[34.63984375000001,4.87548828125],[34.38017578125002,4.620654296874989],[34.176855468750006,4.419091796874994],[33.97607421875,4.22021484375],[33.74160156250002,3.985253906249994],[33.568457031250006,3.81171875],[33.489355468750006,3.755078125],[32.99726562500001,3.880175781249989],[32.33574218750002,3.706201171874994],[32.13593750000001,3.519726562499997],[31.79804687500001,3.802636718749994],[31.547167968750017,3.677587890624991],[31.15234375,3.785595703124997],[30.83857421875001,3.49072265625],[30.757226562500023,3.62421875],[30.586718750000017,3.62421875],[30.50830078125,3.835693359375],[30.194921875,3.98193359375],[29.676855468750006,4.5869140625],[29.469628906250023,4.61181640625],[29.224902343750017,4.391894531249989],[28.72705078125,4.504980468749991],[28.427539062500017,4.324169921874997],[28.19208984375001,4.350244140624994],[27.7880859375,4.644677734374994],[27.4033203125,5.109179687499989],[27.143945312500023,5.722949218749989],[26.514257812500006,6.069238281249994],[26.30859375,6.455322265625],[26.36181640625,6.635302734374989],[25.27890625,7.427490234375],[25.18134765625001,7.557226562499991],[25.20039062500001,7.807910156249989],[24.853320312500017,8.137548828124991],[24.291406250000023,8.29140625],[24.147363281250023,8.665625],[24.53193359375001,8.886914062499997],[24.785253906250006,9.774658203125],[25.066992187500006,10.293798828124991],[25.211718750000017,10.329931640624991],[25.858203125000017,10.406494140625],[25.91914062500001,10.169335937499994],[26.65869140625,9.484130859375],[27.07421875,9.613818359374989],[27.880859375,9.601611328124989],[28.048925781250006,9.32861328125],[28.844531250000017,9.326074218749994],[28.979589843750006,9.594189453124997],[29.47314453125,9.768603515624989],[29.60546875,10.065087890624994],[30.003027343750006,10.277392578124989],[30.75537109375,9.731201171875],[31.224902343750017,9.799267578124997],[32.42080078125002,11.089111328125],[32.338476562500006,11.710107421874994],[32.072265625,12.006738281249994],[32.73671875000002,12.009667968749994],[32.721875,12.223095703124997],[33.199316406250006,12.21728515625],[33.073339843750006,11.606103515624994],[33.13007812500001,10.745947265624991],[33.90703125000002,10.181445312499989],[33.96328125000002,9.861767578124997],[33.87148437500002,9.506152343749989],[34.078125,9.461523437499991]]]},"properties":{"name":"S. Sudan","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-12.280615234374977,14.809033203124997],[-12.228417968749994,14.45859375],[-12.019189453124994,14.206494140624997],[-11.960888671874983,13.875292968750003],[-12.05419921875,13.633056640625],[-11.831689453124994,13.315820312499994],[-11.634960937499983,13.369873046875],[-11.390380859375,12.941992187499991],[-11.389404296875,12.404394531249991],[-12.399072265624994,12.340087890625],[-12.930712890624989,12.532275390624989],[-13.061279296875,12.489990234375],[-13.082910156249994,12.633544921875],[-13.729248046875,12.673925781249991],[-14.06484375,12.67529296875],[-14.349218749999977,12.676416015624994],[-15.196093749999989,12.679931640625],[-15.3779296875,12.588964843749991],[-15.574804687499977,12.490380859374994],[-15.839550781249983,12.43789062499999],[-16.144189453124994,12.45742187499999],[-16.24150390624999,12.443310546874997],[-16.41630859374999,12.36767578125],[-16.521337890624977,12.3486328125],[-16.656933593749983,12.364355468749991],[-16.711816406249994,12.354833984374991],[-16.76030273437499,12.52578125],[-16.44287109375,12.609472656249991],[-16.59765625,12.715283203124997],[-16.743896484375,12.58544921875],[-16.763330078124994,13.064160156249997],[-16.648779296874977,13.154150390624991],[-15.834277343749989,13.156445312499997],[-15.814404296874983,13.325146484374997],[-15.286230468749977,13.39599609375],[-15.151123046875,13.556494140624991],[-14.246777343749983,13.23583984375],[-13.826708984374989,13.4078125],[-13.977392578124977,13.54345703125],[-14.405468749999983,13.503710937500003],[-15.108349609374983,13.81210937499999],[-15.426855468749977,13.727001953124997],[-15.509667968749994,13.586230468750003],[-16.56230468749999,13.587304687499994],[-16.766943359374977,13.904931640624994],[-16.618115234374983,14.04052734375],[-16.791748046875,14.004150390625],[-17.168066406249977,14.640625],[-17.345800781249977,14.729296875],[-17.445019531249983,14.651611328125],[-17.53564453125,14.755126953125],[-17.147167968749983,14.922021484374994],[-16.843408203124994,15.293994140625003],[-16.570751953124983,15.734423828125003],[-16.535253906249977,15.83837890625],[-16.502050781249977,15.917333984374991],[-16.480078124999977,16.097216796875003],[-16.441015624999977,16.204541015624997],[-16.239013671875,16.531298828125003],[-15.768212890624994,16.485107421875],[-14.990625,16.676904296874994],[-14.300097656249989,16.580273437499997],[-13.868457031249989,16.148144531249997],[-13.756640624999989,16.172509765624994],[-13.40966796875,16.05917968749999],[-13.105273437499989,15.57177734375],[-12.735253906249994,15.13125],[-12.40869140625,14.889013671874991],[-12.280615234374977,14.809033203124997]]]},"properties":{"name":"Senegal","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[103.9697265625,1.331445312499994],[103.65019531249999,1.325537109374991],[103.81796875000003,1.447070312499989],[103.9697265625,1.331445312499994]]]},"properties":{"name":"Singapore","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-37.10332031249996,-54.065625],[-36.70380859375001,-54.10810546874999],[-36.64741210937498,-54.26230468749996],[-36.32646484374996,-54.251171875],[-35.79858398437497,-54.76347656250002],[-36.08549804687499,-54.86679687500001],[-36.885986328125,-54.33945312499996],[-37.63090820312496,-54.16748046875001],[-37.61884765625001,-54.04208984375004],[-38.017431640625034,-54.008007812500026],[-37.10332031249996,-54.065625]]]},"properties":{"name":"S. Geo. and S. Sandw. Is.","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-5.692138671874972,-15.997753906249997],[-5.782519531250017,-16.00400390625002],[-5.707861328124977,-15.90615234374998],[-5.692138671874972,-15.997753906249997]]]},"properties":{"name":"Saint Helena","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[160.57626953125006,-11.797851562500028],[160.44306640625004,-11.814941406249957],[159.98632812499997,-11.494726562500006],[160.57626953125006,-11.797851562500028]]],[[[166.13320312500005,-10.757812499999972],[165.90400390625004,-10.851464843749966],[165.79101562500003,-10.784765624999963],[166.02382812500005,-10.6611328125],[166.13320312500005,-10.757812499999972]]],[[[161.71533203124997,-10.387304687499991],[162.10537109375005,-10.45380859375004],[162.37333984375002,-10.823242187499986],[161.78681640625004,-10.716894531249991],[161.53789062500007,-10.566406249999972],[161.4870117187501,-10.361425781249963],[161.29394531250003,-10.326464843750031],[161.30478515625012,-10.204394531250031],[161.71533203124997,-10.387304687499991]]],[[[161.54785156249997,-9.625683593749997],[161.55380859375012,-9.769726562500026],[161.40976562500006,-9.681640625000028],[161.36416015625,-9.353417968750037],[161.54785156249997,-9.625683593749997]]],[[[159.75039062500005,-9.272656250000011],[159.97060546875,-9.433300781249969],[160.35458984375006,-9.421582031249983],[160.81894531250006,-9.862792968749986],[160.64921875000002,-9.92861328124998],[159.80273437499997,-9.763476562500003],[159.61230468749997,-9.470703124999943],[159.62558593750012,-9.311230468749969],[159.75039062500005,-9.272656250000011]]],[[[160.1681640625001,-8.995507812500037],[160.40751953125007,-9.140332031249969],[160.10537109375,-9.080761718749997],[160.1681640625001,-8.995507812500037]]],[[[159.18857421875006,-9.123535156250014],[159.03632812500004,-9.075],[159.12978515625,-8.99306640624998],[159.22841796875005,-9.029980468749955],[159.18857421875006,-9.123535156250014]]],[[[158.10791015625003,-8.684179687500034],[157.93759765625006,-8.73642578125002],[157.90927734375006,-8.565625],[158.10546874999997,-8.536816406250026],[158.10791015625003,-8.684179687500034]]],[[[157.38896484375002,-8.713476562499963],[157.2123046875,-8.565039062500006],[157.37949218750012,-8.420898437499943],[157.38896484375002,-8.713476562499963]]],[[[160.7494140625,-8.313964843750014],[160.99765625000006,-8.612011718749983],[160.94433593750003,-8.799023437499983],[161.15869140624997,-8.961816406250009],[161.36738281250004,-9.61123046874998],[160.77207031250012,-8.963867187499986],[160.7140625000001,-8.539257812499997],[160.59042968750006,-8.372753906249997],[160.7494140625,-8.313964843750014]]],[[[157.76347656250002,-8.242187499999957],[157.89843749999997,-8.506347656249943],[157.81933593750003,-8.612011718749983],[157.58789062500003,-8.445410156249963],[157.5580078125,-8.269921875],[157.30244140625004,-8.33330078124996],[157.21757812500002,-8.262792968749977],[157.490625,-7.965722656250037],[157.76347656250002,-8.242187499999957]]],[[[157.171875,-8.108105468749997],[156.95830078125002,-8.014355468749997],[157.02412109375004,-7.867871093749997],[157.18613281250006,-7.941210937500017],[157.171875,-8.108105468749997]]],[[[156.687890625,-7.92304687500004],[156.5109375000001,-7.707812499999974],[156.5609375,-7.574023437499989],[156.80908203124997,-7.722851562500026],[156.687890625,-7.92304687500004]]],[[[159.8791015625001,-8.534277343749949],[158.9440429687501,-8.04072265625004],[158.457421875,-7.544726562499974],[158.734375,-7.604296875000031],[159.43144531250002,-8.029003906249955],[159.84306640625002,-8.326953124999989],[159.8791015625001,-8.534277343749949]]],[[[155.83984374999997,-7.097167968750014],[155.67753906250002,-7.08896484375002],[155.73896484375004,-6.972949218750017],[155.83984374999997,-7.097167968750014]]],[[[157.48671875000005,-7.330371093750003],[157.44130859375,-7.425683593749966],[157.10156249999997,-7.323632812499966],[156.4525390625,-6.638281249999963],[157.03027343750003,-6.891992187499952],[157.19335937499997,-7.160351562499997],[157.48671875000005,-7.330371093750003]]]]},"properties":{"name":"Solomon Is.","childNum":16}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-12.526074218749926,7.436328125000017],[-12.951611328124926,7.570849609374989],[-12.615234374999972,7.63720703125],[-12.5125,7.582421875000037],[-12.526074218749926,7.436328125000017]]],[[[-10.758593749999989,9.385351562499991],[-10.682714843750006,9.289355468749974],[-10.687646484374937,9.261132812499994],[-10.749951171874926,9.12236328124996],[-10.747021484374955,9.095263671875045],[-10.726855468749932,9.081689453125023],[-10.615966796875,9.059179687499977],[-10.500537109375017,8.687548828125017],[-10.677343749999977,8.400585937499997],[-10.712109374999955,8.335253906250017],[-10.686962890624983,8.321679687500009],[-10.652636718749989,8.330273437499983],[-10.604003906249943,8.319482421874994],[-10.55771484374992,8.315673828125028],[-10.496435546874977,8.362109374999974],[-10.394433593749966,8.480957031250028],[-10.360058593749983,8.49550781249998],[-10.283203124999972,8.48515625],[-10.285742187499949,8.454101562499986],[-10.314648437499983,8.310839843750017],[-10.359814453124926,8.187939453125026],[-10.570849609374932,8.071142578125034],[-10.6474609375,7.759375],[-10.878076171874994,7.538232421874994],[-11.267675781249977,7.232617187499997],[-11.507519531249983,6.906542968750003],[-12.48564453124996,7.386279296875045],[-12.480273437499932,7.75327148437502],[-12.697607421874977,7.715869140625045],[-12.850878906249932,7.818701171875034],[-12.956933593749966,8.145312500000045],[-13.148974609374989,8.214599609375043],[-13.272753906249989,8.429736328124989],[-13.085009765624932,8.42475585937504],[-12.894091796874932,8.62978515624998],[-13.181835937499955,8.576904296875043],[-13.206933593749994,8.843115234375006],[-13.059472656249966,8.881152343750031],[-13.292675781249955,9.04921875],[-13.077294921874966,9.069628906249974],[-12.958789062499989,9.263330078124994],[-12.755859374999943,9.373583984374989],[-12.557861328125,9.704980468749994],[-12.427978515625028,9.898144531250011],[-12.142333984375,9.87539062499999],[-11.911083984374955,9.993017578124977],[-11.273632812499955,9.996533203124983],[-11.205664062499949,9.977734374999969],[-11.180859374999955,9.925341796875045],[-11.047460937499977,9.786328125000054],[-10.758593749999989,9.385351562499991]]]]},"properties":{"name":"Sierra Leone","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[-89.36259765624999,14.416015625],[-89.1205078125,14.370214843749991],[-88.51254882812499,13.978955078124997],[-88.504345703125,13.964208984374991],[-88.49765625,13.904541015625],[-88.482666015625,13.854248046875],[-88.44912109375,13.850976562499994],[-88.40849609374999,13.87539062499999],[-88.27622070312499,13.942675781250003],[-88.151025390625,13.987353515625003],[-87.99101562499999,13.879638671875],[-87.8919921875,13.894970703124997],[-87.80224609375,13.889990234374991],[-87.7314453125,13.841064453125],[-87.71533203125,13.812695312499997],[-87.781884765625,13.521386718749994],[-87.930859375,13.1806640625],[-88.68564453124999,13.281494140625],[-88.51201171874999,13.183935546874991],[-89.80419921875,13.560107421875003],[-90.09521484375,13.736523437499997],[-90.04814453124999,13.904052734375],[-89.54716796874999,14.241259765625003],[-89.5736328125,14.390087890624997],[-89.36259765624999,14.416015625]]]},"properties":{"name":"El Salvador","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[48.938574218750006,11.258447265624994],[48.938085937500006,9.451757812499991],[47.97822265625001,7.9970703125],[46.97822265625001,7.9970703125],[43.98378906250002,9.008837890624989],[43.482519531250006,9.379492187499991],[43.181640625,9.879980468749991],[42.84160156250002,10.203076171874997],[42.65644531250001,10.6],[42.92275390625002,10.999316406249989],[43.24599609375002,11.499804687499989],[43.85273437500001,10.784277343749991],[44.38652343750002,10.430224609374989],[44.94296875,10.43671875],[45.81669921875002,10.835888671874997],[46.565039062500006,10.745996093749994],[47.40498046875001,11.174023437499997],[48.01923828125001,11.139355468749997],[48.57255859375002,11.320507812499997],[48.938574218750006,11.258447265624994]]]},"properties":{"name":"Somaliland","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[41.88398437500001,3.977734375],[41.91533203125002,4.031298828124989],[42.02412109375001,4.137939453125],[42.85664062500001,4.32421875],[43.12568359375001,4.644482421874997],[43.58349609375,4.85498046875],[43.988867187500006,4.950537109374991],[44.940527343750006,4.912011718749994],[47.97822265625001,7.9970703125],[48.938085937500006,9.451757812499991],[48.938574218750006,11.258447265624994],[50.11005859375001,11.529296875],[50.79228515625002,11.983691406249989],[51.2548828125,11.830712890624994],[51.08427734375002,11.335644531249997],[51.140625,10.656884765624994],[51.031835937500006,10.444775390624997],[51.19296875,10.554638671874997],[51.390234375,10.422607421875],[50.93007812500002,10.33554687499999],[50.825,9.428173828124997],[50.10283203125002,8.199804687499991],[49.85205078125,7.962548828124994],[49.234960937500006,6.77734375],[49.04931640625,6.173632812499989],[47.97529296875001,4.497021484374997],[46.87880859375002,3.28564453125],[46.05117187500002,2.475146484374989],[44.92021484375002,1.81015625],[43.71757812500002,0.857861328124997],[41.97988281250002,-0.973046875],[41.53271484375,-1.6953125],[41.521875,-1.572265625],[41.42695312500001,-1.449511718750003],[41.24980468750002,-1.220507812500003],[40.97871093750001,-0.870312500000011],[40.964453125,2.814648437499997],[41.341796875,3.20166015625],[41.61347656250001,3.590478515624994],[41.88398437500001,3.977734375]]]},"properties":{"name":"Somalia","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-56.26708984374997,46.838476562500034],[-56.38476562499994,46.81943359375006],[-56.36464843749994,47.09897460937498],[-56.26708984374997,46.838476562500034]]]},"properties":{"name":"St. Pierre and Miquelon","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[21.431445312500017,45.192529296874994],[21.465429687500006,45.171875],[21.357031250000034,44.99077148437502],[21.532324218750063,44.900683593750045],[21.519921875000023,44.88081054687498],[21.442187500000074,44.87338867187498],[21.384375,44.87006835937501],[21.357910156250057,44.86181640625003],[21.36005859375004,44.82666015624997],[21.52314453125004,44.79008789062499],[21.63613281250005,44.71044921875],[21.909277343750034,44.666113281250034],[22.026953125,44.61987304687503],[22.093066406250074,44.541943359374955],[22.200976562500017,44.560693359374966],[22.350683593750063,44.676123046875034],[22.497656249999977,44.70625],[22.64208984375,44.65097656249998],[22.720898437499983,44.605517578125045],[22.734375,44.56992187499998],[22.700781250000063,44.55551757812498],[22.620117187500057,44.562353515625034],[22.554003906250017,44.54033203124999],[22.49453125000005,44.43544921875002],[22.687890625000023,44.248291015625],[22.42080078125005,44.00742187500006],[22.399023437500063,43.96953125],[22.36542968750004,43.86210937500002],[22.36962890625003,43.78129882812499],[22.55458984375005,43.45449218750002],[22.767578125,43.35415039062502],[22.81972656250005,43.300732421874955],[22.85957031250001,43.252343749999966],[22.97685546874999,43.18798828125],[22.799902343750006,42.985742187499994],[22.706152343750006,42.88393554687505],[22.466796875,42.842480468749955],[22.53242187500004,42.48120117187497],[22.523535156250006,42.440966796875045],[22.44570312500005,42.35913085937497],[22.42207031250004,42.32885742187503],[22.344042968750045,42.31396484375003],[22.23974609375003,42.35815429687506],[21.81464843750001,42.303125],[21.5625,42.24750976562498],[21.541601562499977,42.28081054687502],[21.51894531250008,42.32841796875002],[21.52998046875001,42.35],[21.752929687500057,42.66982421875005],[21.6625,42.681494140625006],[21.390625,42.751416015624955],[21.40302734375001,42.83154296875003],[20.800585937500017,43.26108398437506],[20.623144531250006,43.19863281250002],[20.609667968750017,43.17841796875001],[20.637597656250023,43.13037109374997],[20.657617187500023,43.09985351562497],[20.648535156250034,43.07094726562505],[20.62402343750003,43.03417968750003],[20.475097656250057,42.953027343749994],[20.468847656250034,42.85791015625],[20.344335937500063,42.82792968750002],[19.670996093750006,43.163964843749994],[19.21875,43.449951171875],[19.196484375000068,43.48500976562502],[19.19160156250004,43.52104492187499],[19.19433593749997,43.533300781250006],[19.495117187500057,43.642871093750045],[19.245019531249994,43.96503906250004],[19.583789062500017,44.04345703125003],[19.118457031250074,44.359960937500006],[19.348632812500057,44.88090820312502],[19.007128906250045,44.86918945312502],[19.062890625000023,45.13720703125],[19.4,45.2125],[19.004687500000074,45.39951171875006],[19.064257812500045,45.51499023437506],[18.839062499999983,45.83574218750002],[18.905371093750006,45.931738281250034],[19.421289062500023,46.064453125],[19.61347656250001,46.169189453125],[19.84443359375001,46.145898437499966],[19.934082031250057,46.161474609375034],[20.161425781250017,46.14189453124996],[20.210156250000068,46.12602539062502],[20.241796875000034,46.10859375000001],[20.301367187500006,46.05068359375002],[20.35859375000004,45.975488281249994],[20.581152343749977,45.86948242187506],[20.65273437499999,45.779394531250006],[20.709277343750074,45.735253906249994],[20.727832031250017,45.73740234374998],[20.746875,45.74897460937501],[20.76015625000005,45.75810546875002],[20.775,45.74980468750002],[20.794042968750006,45.467871093750034],[21.431445312500017,45.192529296874994]]]},"properties":{"name":"Serbia","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[6.659960937499989,0.120654296874989],[6.51972656250004,0.066308593750023],[6.468164062499994,0.22734375],[6.68691406250008,0.404394531249977],[6.75,0.24345703124996],[6.659960937499989,0.120654296874989]]],[[[7.423828125,1.567724609375006],[7.330664062500034,1.603369140624991],[7.414453125000051,1.699121093750037],[7.423828125,1.567724609375006]]]]},"properties":{"name":"São Tomé and Principe","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[-54.03422851562499,3.62939453125],[-54.00957031249999,3.448535156249989],[-54.06318359375,3.353320312499989],[-54.18803710937499,3.178759765624989],[-54.203125,3.13818359375],[-54.17070312499999,2.993603515624997],[-54.18808593749999,2.874853515624991],[-54.1955078125,2.81787109375],[-54.256738281249994,2.713720703124991],[-54.402001953124994,2.461523437499991],[-54.53593749999999,2.343310546874989],[-54.56840820312499,2.342578124999989],[-54.604736328125,2.335791015624991],[-54.61625976562499,2.326757812499991],[-54.661865234375,2.327539062499994],[-54.697412109374994,2.359814453124997],[-54.72221679687499,2.441650390625],[-54.87607421874999,2.450390625],[-54.92656249999999,2.497363281249989],[-54.968408203124994,2.54833984375],[-54.978662109374994,2.59765625],[-55.005810546875,2.59296875],[-55.0703125,2.54833984375],[-55.11411132812499,2.539208984374994],[-55.1876953125,2.547509765624994],[-55.286035156249994,2.499658203124994],[-55.343994140625,2.48876953125],[-55.38535156249999,2.440625],[-55.73056640624999,2.406152343749994],[-55.957470703125,2.520458984374997],[-55.99350585937499,2.497509765624997],[-56.02036132812499,2.392773437499997],[-56.0451171875,2.364404296874994],[-56.087792968749994,2.34130859375],[-56.12939453125,2.299511718749997],[-56.1376953125,2.259033203125],[-56.073632812499994,2.236767578124997],[-56.02006835937499,2.158154296874997],[-55.96196289062499,2.095117187499994],[-55.91533203124999,2.03955078125],[-55.921630859375,1.976660156249991],[-55.929638671875,1.8875],[-56.01992187499999,1.842236328124997],[-56.4828125,1.942138671875],[-56.704345703125,2.036474609374991],[-57.19736328124999,2.853271484375],[-57.303662109375,3.377099609374994],[-57.646728515625,3.39453125],[-58.05429687499999,4.101660156249991],[-57.84599609374999,4.668164062499997],[-57.91704101562499,4.820410156249991],[-57.711083984374994,4.991064453124991],[-57.331005859375,5.020166015624994],[-57.20981445312499,5.195410156249991],[-57.3185546875,5.335351562499994],[-57.194775390625,5.5484375],[-56.96982421874999,5.992871093749997],[-56.235595703125,5.885351562499991],[-55.897607421874994,5.699316406249991],[-55.909912109375,5.892626953124989],[-55.648339843749994,5.985888671874989],[-54.83369140625,5.988330078124989],[-54.05419921875,5.807910156249989],[-54.08046875,5.502246093749989],[-54.4796875,4.836523437499991],[-54.350732421874994,4.054101562499994],[-54.03422851562499,3.62939453125]]]},"properties":{"name":"Suriname","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[22.538671875,49.072705078125],[22.52412109375001,49.031396484374994],[22.389453125000017,48.873486328125],[22.295214843750017,48.685839843749996],[22.142871093750017,48.568505859374994],[22.1318359375,48.405322265624996],[21.766992187500023,48.3380859375],[21.45136718750001,48.55224609375],[20.490039062500017,48.526904296874996],[20.333789062500017,48.295556640624994],[19.95039062500001,48.146630859374994],[19.625390625000023,48.223095703125],[18.791894531250023,48.000292968749996],[18.72421875,47.787158203124996],[17.76191406250001,47.770166015624994],[17.147363281250023,48.00595703125],[16.86542968750001,48.3869140625],[16.953125,48.598828125],[17.135644531250023,48.841064453125],[17.75849609375001,48.888134765625],[18.0859375,49.06513671875],[18.160937500000017,49.257373046874996],[18.83222656250001,49.510791015624996],[19.1494140625,49.4],[19.44160156250001,49.597705078124996],[19.77392578125,49.37216796875],[19.756640625000017,49.204394531249996],[20.0576171875,49.181298828124994],[20.36298828125001,49.38525390625],[20.868457031250017,49.314697265625],[21.079394531250017,49.418261718749996],[21.6396484375,49.411962890625],[22.020117187500006,49.209521484374996],[22.473046875000023,49.081298828125],[22.538671875,49.072705078125]]]},"properties":{"name":"Slovakia","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[16.516210937500006,46.499902343749994],[16.427636718750023,46.5244140625],[16.321191406250023,46.534619140625],[16.1064453125,46.382226562499994],[15.608984375,46.171923828124996],[15.592578125000017,46.139990234375],[15.596875,46.109228515625],[15.675585937500017,45.983691406249996],[15.652148437500017,45.862158203125],[15.277050781250011,45.7326171875],[15.353710937500011,45.659912109375],[15.283593750000023,45.5796875],[15.291210937500011,45.541552734374996],[15.32666015625,45.502294921875],[15.339453125,45.467041015625],[15.242089843750023,45.44140625],[15.110449218750006,45.45078125],[14.95458984375,45.499902343749994],[14.793066406250006,45.47822265625],[14.649511718750006,45.571484375],[14.591796875,45.651269531249994],[14.56884765625,45.6572265625],[14.533984375000017,45.645263671875],[14.505175781250017,45.59521484375],[14.42734375,45.505761718749994],[14.369921875000017,45.4814453125],[13.878710937500017,45.428369140624994],[13.577929687500017,45.516894531249996],[13.8447265625,45.59287109375],[13.831152343750006,45.680419921875],[13.663476562500023,45.7919921875],[13.6005859375,45.979785156249996],[13.509179687500023,45.973779296874994],[13.487695312500023,45.987109375],[13.480273437500017,46.009228515625],[13.486425781250006,46.03955078125],[13.548046875000011,46.089111328125],[13.616601562500023,46.133105468749996],[13.634960937500011,46.157763671874996],[13.632519531250011,46.177050781249996],[13.420996093750006,46.212304687499994],[13.399511718750006,46.317529296874994],[13.563281250000017,46.415087890624996],[13.637109375000023,46.448535156249996],[13.6796875,46.462890625],[13.7,46.520263671875],[14.5498046875,46.399707031249996],[14.893261718750011,46.605908203125],[15.957617187500006,46.677636718749994],[16.093066406250017,46.86328125],[16.283593750000023,46.857275390625],[16.516210937500006,46.499902343749994]]]},"properties":{"name":"Slovenia","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[16.52851562500001,56.29052734375],[16.431640625,56.24375],[16.41230468750004,56.568994140624994],[17.02539062499997,57.345068359375006],[16.52851562500001,56.29052734375]]],[[[19.076464843750045,57.8359375],[18.813867187500023,57.70620117187502],[18.907910156250068,57.39833984375002],[18.146386718749994,56.920507812500006],[18.285351562500068,57.08320312500001],[18.136523437500045,57.55664062500003],[18.53740234374999,57.83056640625006],[18.90058593750001,57.91547851562504],[19.076464843750045,57.8359375]]],[[[19.156347656250063,57.92260742187497],[19.086523437500034,57.86499023437506],[19.134863281250034,57.98134765625002],[19.331445312500023,57.962890625],[19.156347656250063,57.92260742187497]]],[[[24.15546875000004,65.80527343750006],[23.102343750000074,65.73535156250003],[22.400976562500006,65.86210937499999],[22.254003906250006,65.59755859375002],[21.565527343750063,65.40810546874997],[21.609179687500074,65.261376953125],[21.410351562500068,65.31743164062505],[21.57392578125001,65.12578124999999],[21.138183593750057,64.80869140625006],[21.519628906250034,64.46308593749998],[20.76269531250003,63.86782226562505],[18.60644531250003,63.17827148437499],[18.31289062500008,62.996386718750045],[18.46308593750004,62.895849609375006],[18.170019531250034,62.789355468750074],[17.906640625000023,62.88676757812502],[18.037304687500068,62.60053710937498],[17.834472656250057,62.50273437500002],[17.410253906250063,62.508398437500034],[17.633691406249994,62.23300781250006],[17.374511718750057,61.866308593750034],[17.465429687500006,61.68447265625005],[17.196386718750006,61.72456054687504],[17.13076171875005,61.57573242187499],[17.25097656250003,60.70078125],[17.6611328125,60.53515625000003],[17.955761718750068,60.589794921874955],[18.85273437500001,60.02587890625],[18.970507812500045,59.757226562499994],[17.964257812500023,59.359375],[18.56025390625004,59.39448242187498],[18.285351562500068,59.109375],[16.978125,58.65415039062506],[16.214257812500023,58.636669921874955],[16.92382812499997,58.49257812499999],[16.651953125,58.43432617187503],[16.65224609375008,57.50068359374998],[16.348730468750063,56.70927734374996],[15.826660156250028,56.12495117187501],[14.782031250000017,56.16191406250002],[14.754785156250051,56.03315429687498],[14.401953125000034,55.97675781250004],[14.21503906250004,55.83261718749998],[14.341699218749994,55.52773437500002],[14.17373046875008,55.396630859374966],[12.885839843750063,55.41137695312506],[12.973925781250074,55.748144531250006],[12.471191406250057,56.29052734375],[12.801660156250051,56.263916015625],[12.65644531250004,56.44057617187502],[12.857421875000028,56.45239257812503],[12.883691406250051,56.61772460937496],[12.421484375000034,56.906396484374966],[11.449316406250063,58.118359374999955],[11.43154296875008,58.339990234374994],[11.24824218750004,58.369140625],[11.14716796875004,58.98862304687498],[11.19580078125,59.07827148437505],[11.388281250000063,59.036523437499966],[11.470703125000057,58.909521484375034],[11.64277343750004,58.92607421875002],[11.798144531250074,59.28989257812498],[11.680761718750034,59.59228515625003],[12.486132812500074,60.10678710937506],[12.588671874999989,60.450732421875045],[12.29414062500004,61.00268554687506],[12.706054687500028,61.059863281250074],[12.88076171875008,61.35229492187506],[12.155371093750006,61.720751953125045],[12.303515625000074,62.28559570312501],[11.999902343750051,63.29169921875001],[12.175195312500051,63.595947265625],[12.792773437500017,64],[13.203515625000023,64.07509765625],[13.960546875000063,64.01401367187498],[14.141210937500006,64.17353515624998],[14.077636718750028,64.464013671875],[13.650292968750023,64.58154296874997],[14.47968750000004,65.30146484374998],[14.543261718750045,66.12934570312498],[15.483789062500051,66.30595703124999],[15.422949218750006,66.48984374999998],[16.40351562500004,67.05498046875002],[16.12744140625,67.42583007812507],[16.783593750000023,67.89501953125],[17.324609375000023,68.10380859374999],[17.91669921875001,67.96489257812502],[18.303027343750045,68.55541992187497],[19.969824218750063,68.35639648437501],[20.348046875000023,68.84873046875003],[20.116699218750057,69.02089843750005],[20.622167968750006,69.036865234375],[21.99746093750005,68.52060546874998],[22.854101562500034,68.36733398437502],[23.63886718750004,67.95439453125002],[23.454882812500045,67.46025390625007],[23.733593750000068,67.42290039062499],[23.64150390625005,67.12939453124997],[23.988574218750045,66.81054687500003],[23.700292968750034,66.25263671874998],[24.15546875000004,65.80527343750006]]]]},"properties":{"name":"Sweden","childNum":4}},{"geometry":{"type":"Polygon","coordinates":[[[31.9482421875,-25.957617187500006],[32.060546875,-26.018359375],[32.04140625000002,-26.28125],[32.10595703125,-26.52001953125],[32.112890625,-26.839453125],[32.02480468750002,-26.811132812500006],[31.994726562500006,-26.817480468750006],[31.967187500000023,-26.96064453125001],[31.946093750000017,-27.173632812500003],[31.958398437500023,-27.30585937500001],[31.742578125000023,-27.30996093750001],[31.469531250000017,-27.295507812500006],[31.274023437500006,-27.238378906250006],[31.063378906250023,-27.1123046875],[30.938085937500006,-26.915820312500003],[30.88330078125,-26.79238281250001],[30.806738281250006,-26.785253906250006],[30.794335937500023,-26.764257812500006],[30.803320312500006,-26.41347656250001],[31.08808593750001,-25.98066406250001],[31.207324218750017,-25.843359375],[31.33515625000001,-25.75556640625001],[31.382617187500017,-25.74296875],[31.415136718750006,-25.74658203125],[31.921679687500017,-25.96875],[31.9482421875,-25.957617187500006]]]},"properties":{"name":"Swaziland","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[55.54033203125002,-4.693066406250011],[55.54296875,-4.785546875],[55.383398437500006,-4.609277343750009],[55.45576171875001,-4.558789062500011],[55.54033203125002,-4.693066406250011]]]},"properties":{"name":"Seychelles","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[42.358984375,37.10859375],[41.78857421875,36.59716796875],[41.41679687500002,36.5146484375],[41.295996093750006,36.383349609374996],[41.354101562500006,35.640429687499996],[41.19472656250002,34.768994140625],[40.98701171875001,34.429052734375],[38.773535156250006,33.372216796874994],[36.818359375,32.317285156249994],[36.3720703125,32.3869140625],[35.78730468750001,32.734912109374996],[35.91347656250002,32.94960937499999],[35.869140625,33.43173828125],[36.03447265625002,33.58505859375],[35.98613281250002,33.75263671875],[36.36503906250002,33.83935546875],[36.27783203125,33.92529296875],[36.5849609375,34.221240234374996],[36.50439453125,34.432373046875],[36.32988281250002,34.499609375],[36.383886718750006,34.65791015625],[35.97626953125001,34.629199218749996],[35.902441406250006,35.420703125],[35.76445312500002,35.571582031249996],[35.83964843750002,35.84921875],[35.892675781250006,35.916552734374996],[35.96757812500002,35.910058593749994],[36.12734375000002,35.831445312499994],[36.15361328125002,35.833886718749994],[36.34755859375002,36.003515625],[36.37539062500002,36.171240234375],[36.63671875,36.233984375],[36.64140625000002,36.263525390625],[36.5375,36.45742187499999],[36.54667968750002,36.50634765625],[36.596875,36.7013671875],[36.62841796875,36.777685546875],[36.65859375000002,36.802539062499996],[36.77656250000001,36.79267578125],[36.94179687500002,36.7583984375],[36.9853515625,36.702392578125],[37.06621093750002,36.652636718749996],[37.43632812500002,36.643310546875],[37.523535156250006,36.6783203125],[37.7203125,36.743701171874996],[37.90664062500002,36.79462890625],[38.19169921875002,36.9015625],[38.7666015625,36.693115234375],[38.90644531250001,36.694677734375],[39.1083984375,36.680566406249994],[39.35664062500001,36.681591796875],[39.50146484375,36.70224609375],[39.6865234375,36.738623046875],[40.01640625000002,36.826074218749994],[40.705664062500006,37.097705078124996],[41.886816406250006,37.156396484374994],[42.05986328125002,37.2060546875],[42.16787109375002,37.288623046874996],[42.202734375,37.29726562499999],[42.24755859375,37.2822265625],[42.2685546875,37.2765625],[42.31289062500002,37.22958984375],[42.358984375,37.10859375]]]},"properties":{"name":"Syria","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-72.3328125,21.85136718749999],[-72.14433593750002,21.79272460937503],[-72.33544921874994,21.758007812499983],[-72.3328125,21.85136718749999]]]},"properties":{"name":"Turks and Caicos Is.","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[23.980273437500017,19.496630859375003],[23.970800781250006,15.721533203124991],[23.10517578125001,15.702539062499994],[22.933886718750017,15.533105468749994],[22.93232421875001,15.162109375],[22.6708984375,14.722460937500003],[22.38154296875001,14.550488281249997],[22.53857421875,14.161865234375],[22.1064453125,13.7998046875],[22.228125,13.32958984375],[21.825292968750006,12.79052734375],[21.928125,12.678125],[22.352343750000017,12.660449218749989],[22.472460937500017,12.067773437499994],[22.580957031250023,11.990136718749994],[22.591113281250017,11.579882812499989],[22.922656250000017,11.344873046874994],[22.86005859375001,10.919677734375],[22.49384765625001,10.996240234374994],[21.771484375,10.642822265625],[21.682714843750006,10.289843749999989],[20.773242187500017,9.405664062499994],[20.342089843750017,9.127099609374994],[18.95625,8.938867187499994],[18.886035156250017,8.836035156249991],[19.108691406250017,8.656152343749994],[18.56416015625001,8.0458984375],[17.6494140625,7.98359375],[16.784765625,7.550976562499997],[16.545312500000023,7.865478515625],[16.37890625,7.683544921874997],[15.957617187500006,7.507568359375],[15.480078125,7.523779296874991],[15.5498046875,7.787890624999989],[15.1162109375,8.557324218749997],[14.332324218750017,9.20351562499999],[13.977246093750011,9.691552734374994],[14.243261718750006,9.979736328125],[15.654882812500006,10.0078125],[15.276074218750011,10.357373046874997],[15.132226562500023,10.648486328124989],[15.029882812500006,11.11367187499999],[15.08125,11.845507812499989],[14.847070312500023,12.502099609374994],[14.461718750000017,13.021777343749989],[14.244824218750011,13.07734375],[14.06396484375,13.07851562499999],[13.932324218750011,13.258496093749997],[13.606347656250023,13.70458984375],[13.505761718750023,14.134423828124994],[13.4482421875,14.380664062500003],[14.367968750000017,15.750146484374994],[15.474316406250011,16.908398437499997],[15.735058593750011,19.904052734375],[15.963183593750017,20.34619140625],[15.587109375000011,20.733300781249994],[15.607324218750023,20.954394531250003],[15.181835937500011,21.523388671874997],[14.97900390625,22.99619140624999],[15.984082031250011,23.445214843749994],[20.14765625000001,21.38925781249999],[23.980273437500017,19.496630859375003]]]},"properties":{"name":"Chad","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[0.900488281250006,10.993261718749991],[0.763378906250011,10.386669921874997],[1.330078125,9.996972656249994],[1.3857421875,9.361669921874991],[1.600195312500006,9.050048828125],[1.624707031250011,6.997314453125],[1.530957031250011,6.992431640625],[1.777929687500006,6.294628906249997],[1.62265625,6.216796875],[1.187207031250011,6.089404296874989],[0.736914062500006,6.452587890624997],[0.525585937500011,6.850927734374991],[0.634765625,7.353662109374994],[0.5,7.546875],[0.686328125000017,8.354882812499994],[0.37255859375,8.75927734375],[0.48876953125,8.851464843749994],[0.525683593750017,9.398486328124989],[0.2333984375,9.463525390624994],[0.342578125000017,9.604150390624994],[0.264550781250023,9.644726562499997],[0.380859375,10.291845703124991],[-0.08632812499999,10.673046875],[0.009423828125023,11.02099609375],[-0.068603515625,11.115625],[0.49267578125,10.954980468749994],[0.900488281250006,10.993261718749991]]]},"properties":{"name":"Togo","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[98.40908203125005,7.90205078125004],[98.2962890625,7.776074218750054],[98.32207031250007,8.166308593749974],[98.4349609375,8.085644531249969],[98.40908203125005,7.90205078125004]]],[[[100.070703125,9.58603515625002],[99.96240234375003,9.421630859375],[99.93955078125006,9.559960937500037],[100.070703125,9.58603515625002]]],[[[102.42675781250003,11.988720703125026],[102.30195312500004,11.98081054687502],[102.27744140625006,12.151855468750043],[102.42675781250003,11.988720703125026]]],[[[100.12246093750005,20.316650390625057],[100.11494140625004,20.257666015625034],[100.13974609375012,20.245410156250017],[100.31796875000006,20.38588867187505],[100.51953125000003,20.17792968750004],[100.39765625000004,19.756103515625],[100.51357421875005,19.553466796875],[101.21191406249997,19.54833984375003],[101.22080078125006,19.486621093750074],[101.19755859375007,19.327929687500074],[101.2863281250001,18.977148437500006],[101.04697265625012,18.441992187500063],[101.05058593750002,18.407031250000045],[101.1375,18.28686523437497],[101.14394531250005,18.14262695312499],[100.90849609375002,17.583886718750023],[100.95585937500002,17.541113281250006],[101.10517578125004,17.47954101562499],[101.16748046874997,17.49902343749997],[101.41367187500012,17.71875],[101.55507812500005,17.812353515625034],[101.56367187500004,17.82050781250001],[101.6875,17.889404296875],[101.77480468750005,18.03339843750004],[101.81865234375002,18.06464843750001],[101.87548828124997,18.046435546875017],[101.94746093750004,18.081494140624983],[102.03457031250005,18.169824218750023],[102.10146484375,18.210644531249983],[102.14824218750002,18.20385742187503],[102.35185546875002,18.045947265625017],[102.45878906250002,17.984619140625057],[102.55253906250007,17.96508789062497],[102.61679687500006,17.833349609375034],[102.66064453124997,17.817968750000034],[102.680078125,17.824121093750023],[103.05136718750006,18.02851562500001],[103.0912109375,18.13823242187499],[103.14853515625006,18.221728515625045],[103.19970703124997,18.259472656249983],[103.26318359374997,18.27846679687505],[103.27958984375002,18.304980468750017],[103.24892578125,18.338964843750034],[103.25175781250002,18.373486328124955],[103.2882812500001,18.408398437499955],[103.36699218750007,18.42333984374997],[103.48798828125004,18.418164062499983],[103.62968750000002,18.38256835937503],[103.79228515625002,18.316503906249977],[103.89882812500005,18.295312500000023],[103.949609375,18.31899414062505],[104.04873046875005,18.216699218749994],[104.19619140625005,17.988378906250006],[104.32265625,17.815820312500023],[104.428125,17.69897460937503],[104.7396484375,17.461669921875],[104.81601562500012,17.30029296874997],[104.75898437500004,17.0771484375],[104.7435546875,16.884375],[104.75058593750012,16.647558593750063],[104.81933593750003,16.46606445312503],[105.04716796875007,16.160253906249977],[105.14873046875007,16.09355468749999],[105.33066406250006,16.037890625000017],[105.40625,15.987451171875051],[105.39892578124997,15.829882812500017],[105.62207031250003,15.699951171875],[105.641015625,15.656542968750045],[105.6388671875001,15.585937500000057],[105.615625,15.488281250000057],[105.49042968750004,15.256591796875],[105.49042968750004,15.127587890625009],[105.5333984375001,15.041601562499991],[105.54667968750002,14.932470703124963],[105.52304687500012,14.843310546875003],[105.49736328125002,14.590673828124963],[105.47558593750003,14.530126953124977],[105.42265625000007,14.471630859375054],[105.34218750000005,14.416699218750054],[105.24365234375003,14.367871093750054],[105.1833007812501,14.346240234374989],[105.16914062500004,14.336083984374966],[105.12597656250003,14.280957031250011],[105.07412109375005,14.227441406250037],[104.77900390625004,14.427832031250006],[103.19941406250004,14.332617187499977],[102.90927734375006,14.136718750000028],[102.546875,13.585693359375043],[102.33632812500005,13.560302734375014],[102.49960937500012,12.669970703125003],[102.75566406250002,12.42626953125],[102.73662109375007,12.089794921875011],[102.93388671875002,11.706689453125037],[102.594140625,12.203027343749994],[102.54023437500004,12.109228515624977],[101.83574218750002,12.640380859375014],[100.89775390625007,12.653808593749986],[100.96269531250007,13.431982421874991],[100.60292968750005,13.568164062500017],[100.23564453125002,13.48447265625002],[99.99052734375007,13.243457031250031],[100.08994140625006,13.045654296874972],[99.96396484375006,12.690039062500006],[99.98906250000007,12.170800781249994],[99.16503906250003,10.319824218750028],[99.25390625000003,9.265234375000034],[99.83554687500012,9.288378906250031],[99.98955078125007,8.589208984374977],[100.129296875,8.428076171875006],[100.16347656250005,8.508398437500034],[100.27939453125006,8.268505859375011],[100.54521484375002,7.226904296874991],[100.43935546875005,7.280761718750043],[100.38037109375003,7.541503906250043],[100.28378906250006,7.551513671875043],[100.25664062500002,7.774902343749986],[100.16074218750012,7.599267578124994],[100.4235351562501,7.18784179687502],[101.01787109375002,6.860937500000034],[101.49794921875005,6.865283203125031],[102.10107421874997,6.242236328125031],[101.87363281250012,5.825292968749991],[101.67841796875004,5.778808593750028],[101.5560546875,5.907763671875003],[101.1139648437501,5.636767578125045],[100.98164062500004,5.771044921875045],[101.05351562500002,6.242578125],[100.87392578125,6.24541015624996],[100.75449218750012,6.460058593749991],[100.3454101562501,6.549902343750006],[100.26142578125004,6.682714843749963],[100.11914062499997,6.441992187500048],[99.69599609375004,6.87666015625004],[99.72031250000012,7.106201171875],[99.55302734375002,7.218798828125031],[99.59697265625002,7.355615234375009],[99.35859375000004,7.372216796875023],[99.26367187499997,7.619042968750037],[99.07763671874997,7.718066406250045],[99.05107421875002,7.887841796874994],[98.78867187500012,8.059814453125028],[98.703515625,8.256738281250009],[98.57919921875006,8.344287109374989],[98.42099609375006,8.17822265625],[98.30546875000007,8.226220703125009],[98.24179687500006,8.767871093750045],[98.70253906250005,10.19038085937504],[98.7572265625,10.660937499999974],[99.1901367187501,11.105273437499989],[99.61474609374997,11.781201171875026],[99.40507812500002,12.547900390625003],[99.12392578125,13.030761718750043],[99.13681640625006,13.716699218749994],[98.57001953125004,14.359912109375031],[98.20214843749997,14.97592773437502],[98.19101562500012,15.204101562499972],[98.55693359375007,15.367675781249986],[98.59238281250006,16.05068359375005],[98.81796875000012,16.180810546874994],[98.88828125000006,16.351904296875034],[98.83544921875003,16.417578125],[98.66074218750006,16.330419921875006],[98.4388671875,16.975683593750034],[97.7064453125,17.79711914062503],[97.63222656250005,18.290332031250074],[97.37392578125,18.51796875],[97.74589843750002,18.58818359374999],[97.816796875,19.459960937500057],[98.01503906250005,19.74951171874997],[98.37128906250004,19.68916015625004],[98.9166992187501,19.77290039062504],[99.07421875000003,20.09936523437503],[99.48593750000006,20.14985351562501],[99.45888671875005,20.363037109375],[99.72011718750005,20.32543945312497],[99.8903320312501,20.424414062499977],[99.9542968750001,20.415429687500023],[100.0036132812501,20.37958984375001],[100.12246093750005,20.316650390625057]]]]},"properties":{"name":"Thailand","childNum":4}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[70.66416015625,39.85546875],[70.55957031250003,39.790917968749994],[70.48925781250003,39.86303710937503],[70.48281250000005,39.88271484375005],[70.49775390625004,39.88242187499998],[70.56708984375004,39.86660156250005],[70.66416015625,39.85546875]]],[[[70.95800781250003,40.238867187500034],[70.59921875,39.974511718749994],[69.96679687499997,40.202246093750034],[69.46875,40.020751953125],[69.47099609375002,39.990625],[69.43193359375007,39.909765625000034],[69.36542968750004,39.94707031250002],[69.30722656250006,39.968554687500045],[69.27880859374997,39.91777343749999],[69.24472656250006,39.82709960937498],[69.29765625000007,39.52480468750005],[70.50117187500004,39.58735351562501],[70.79931640625003,39.39472656250001],[71.4703125,39.60366210937502],[71.50302734375006,39.58217773437502],[71.51738281250002,39.55385742187502],[71.50585937499997,39.51708984374997],[71.5033203125,39.47880859374999],[71.73222656250002,39.422998046874994],[71.77861328125007,39.27797851562502],[72.04277343750002,39.352148437500034],[72.08417968750004,39.310644531250034],[72.14736328125005,39.26074218749997],[72.22998046874997,39.20751953124997],[72.63994140625002,39.385986328125],[73.10927734375,39.36191406249998],[73.2349609375,39.37456054687499],[73.3361328125001,39.41235351562506],[73.38740234375004,39.442724609375034],[73.4704101562501,39.46059570312502],[73.63164062500007,39.44887695312502],[73.63632812500006,39.396679687499955],[73.60732421875,39.229199218749955],[73.8052734375,38.968652343749994],[73.69609375000007,38.85429687499996],[73.80166015625,38.60688476562501],[74.02558593750004,38.53984375000002],[74.27744140625,38.659765625000034],[74.81230468750002,38.46030273437498],[74.8942382812501,37.60141601562498],[75.11875,37.38569335937498],[74.89130859375004,37.231640624999955],[74.875390625,37.24199218750002],[74.83046875,37.28593750000002],[74.73056640625006,37.35703125],[74.659375,37.39448242187501],[74.34902343750005,37.41875],[74.25966796875005,37.41542968750002],[74.20351562500005,37.37246093750005],[74.16708984375,37.32944335937498],[73.74960937500006,37.23178710937498],[73.6535156250001,37.239355468750034],[73.62753906250006,37.261572265625006],[73.71728515625003,37.32944335937498],[73.7337890625,37.37578125000002],[73.72060546875,37.41875],[73.65712890625005,37.43046875],[73.6046875000001,37.44604492187503],[73.48134765625,37.4716796875],[73.38291015625006,37.462255859375034],[73.21113281250004,37.40849609375002],[72.89550781250003,37.26752929687498],[72.65742187500004,37.029052734375],[71.665625,36.696923828124994],[71.530859375,36.845117187499994],[71.43291015625007,37.12753906249998],[71.5822265625001,37.91010742187498],[71.55195312500004,37.93315429687496],[71.48779296874997,37.93188476562497],[71.38964843750003,37.90629882812502],[71.31992187500006,37.90185546875],[71.27851562500004,37.91840820312498],[71.33271484375004,38.170263671875034],[71.25585937499997,38.306982421875006],[70.7359375,38.42255859375001],[70.41777343750002,38.075439453125],[70.21464843750002,37.92441406250006],[70.19941406250004,37.88603515624996],[70.25498046875006,37.76538085937497],[70.25146484374997,37.66416015625006],[70.18867187500004,37.58247070312501],[70.11982421875004,37.54350585937499],[69.9849609375,37.566162109375],[69.8208984375,37.60957031250004],[69.62578125000002,37.59404296874999],[69.49208984375,37.55307617187498],[69.42011718750004,37.486718749999966],[69.39921875000007,37.39931640625002],[69.42968749999997,37.290869140625034],[69.414453125,37.20776367187497],[69.35380859375007,37.15004882812502],[69.3039062500001,37.11694335937503],[69.26484375000004,37.1083984375],[69.18017578125003,37.158300781250034],[68.96044921875003,37.32504882812498],[68.9118164062501,37.33393554687501],[68.88525390624997,37.32807617187498],[68.85537109375005,37.31684570312501],[68.83847656250006,37.30283203124998],[68.82373046874997,37.27070312500001],[68.78203125000002,37.25800781250001],[68.7232421875,37.26801757812501],[68.6691406250001,37.258398437500006],[68.3869140625001,37.1375],[68.29951171875004,37.08842773437502],[68.28476562500006,37.036328124999955],[68.2609375000001,37.01308593750002],[68.2121093750001,37.02153320312496],[68.0677734375,36.949804687500006],[67.95800781249997,36.972021484375006],[67.83447265624997,37.06420898437506],[67.75898437500004,37.172216796875034],[67.7980468750001,37.244970703125006],[67.81435546875005,37.48701171875004],[68.3502929687501,38.211035156250006],[68.08720703125002,38.47353515625002],[68.13251953125004,38.927636718749966],[67.69443359375006,38.99462890625003],[67.64833984375005,39.13105468750004],[67.3576171875001,39.216699218749994],[67.426171875,39.46557617187497],[67.71904296875007,39.62138671875002],[68.46328125,39.53671874999998],[68.63896484375007,39.8388671875],[68.86875,39.90747070312503],[68.80468750000003,40.05034179687499],[68.9720703125,40.08994140624998],[68.63066406250007,40.16708984374998],[69.27490234374997,40.19809570312498],[69.20625,40.566552734374994],[69.35722656250002,40.76738281249996],[69.71289062500003,40.65698242187503],[70.40195312500006,41.03510742187498],[70.75107421875006,40.721777343750006],[70.37158203125003,40.38413085937506],[70.653125,40.201171875],[70.95800781250003,40.238867187500034]]]]},"properties":{"name":"Tajikistan","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[66.52226562500007,37.34848632812506],[66.471875,37.3447265625],[65.7650390625,37.56914062499996],[65.55498046875002,37.25117187500004],[65.30361328125005,37.24677734375001],[65.08964843750007,37.237939453124994],[64.9515625,37.19355468750001],[64.81630859375005,37.13208007812503],[64.7824218750001,37.05927734375001],[64.60253906250003,36.554541015625034],[64.5658203125,36.427587890625034],[64.51103515625002,36.34067382812498],[64.184375,36.14892578125],[63.8625,36.012353515624994],[63.12998046875006,35.84619140624997],[63.169726562500074,35.678125],[63.05664062500003,35.44580078125003],[62.98027343750002,35.40917968750003],[62.85800781250006,35.34965820312499],[62.688085937500006,35.25532226562504],[62.3078125000001,35.17080078125005],[62.08964843750002,35.3796875],[61.62099609375005,35.43232421875004],[61.34472656249997,35.62949218750006],[61.26201171875002,35.61958007812498],[61.25214843750004,35.86762695312498],[61.15292968750006,35.97675781250001],[61.212011718750006,36.190527343750034],[61.11962890625003,36.64257812500003],[60.34130859375003,36.63764648437501],[60.06279296875002,36.962890625],[59.454980468749994,37.25283203125002],[59.30175781249997,37.51064453125005],[58.81542968750003,37.683496093749994],[58.261621093749994,37.665820312500045],[57.35371093750004,37.97333984374998],[57.1935546875001,38.216406250000034],[56.440625,38.249414062499994],[56.272070312500006,38.080419921875034],[55.38085937500003,38.051123046875034],[54.90009765625004,37.77792968750006],[54.6994140625001,37.47016601562498],[53.91416015625006,37.34355468750002],[53.86865234375003,38.949267578125045],[53.70458984375003,39.209570312500034],[53.33632812500005,39.34082031250006],[53.15664062499999,39.26499023437506],[53.23564453125002,39.608544921874966],[53.603125,39.546972656250034],[53.472265625,39.66879882812498],[53.48730468749997,39.909375],[52.9875,39.98759765625002],[53.03554687500005,39.7744140625],[52.80468749999997,40.054003906250045],[52.73369140625002,40.39873046875002],[52.943457031250006,41.03808593750006],[53.1452148437501,40.82495117187497],[53.61523437500003,40.818505859374994],[53.87001953125005,40.64868164062503],[54.37734375,40.693261718749966],[54.319433593750006,40.83457031249998],[54.68505859375003,40.873046875],[54.70371093750006,41.071142578125034],[54.094824218750006,41.51938476562506],[53.80468749999997,42.11762695312498],[53.16416015625006,42.09379882812502],[52.97001953125002,41.97622070312505],[52.81484375,41.711816406249994],[52.850390625000074,41.20029296875006],[52.4938476562501,41.780371093750034],[53.0558593750001,42.14775390624999],[54.120996093749994,42.335205078125],[54.85380859375002,41.965185546875006],[55.434375,41.296289062499994],[55.97744140625005,41.32221679687504],[57.01796875,41.26347656249996],[57.11884765625004,41.35029296874998],[56.96406250000004,41.856542968750006],[57.290625,42.123779296875],[57.814257812500074,42.18984375000005],[58.02890625,42.48764648437506],[58.474414062500074,42.29936523437496],[58.15156250000004,42.628076171874966],[58.477148437500006,42.66284179687503],[58.5890625000001,42.778466796874966],[59.35429687500002,42.32329101562496],[59.98515625000002,42.21171875],[59.94179687499999,41.97353515625002],[60.20078125000006,41.803125],[60.07558593750005,41.759667968749966],[60.089648437500074,41.39941406250003],[60.454980468749994,41.221630859374955],[61.2423828125001,41.18920898437503],[61.496972656249994,41.276074218749955],[61.90283203124997,41.09370117187501],[62.48320312500002,39.97563476562496],[63.76367187500003,39.16054687499999],[64.3099609375,38.97729492187497],[65.612890625,38.23857421875002],[65.97119140624997,38.244238281250006],[66.60625,37.98671875000005],[66.52558593750004,37.785742187500034],[66.51132812500006,37.59916992187496],[66.51064453125,37.45869140625004],[66.52226562500007,37.34848632812506]]]},"properties":{"name":"Turkmenistan","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[124.0363281250001,-9.341601562500031],[124.44443359375012,-9.190332031250023],[124.28232421875012,-9.427929687500026],[124.0363281250001,-9.341601562500031]]],[[[125.06816406250002,-9.511914062499997],[124.96015625000004,-9.213769531250009],[125.10048828125,-9.189843750000023],[125.14902343750012,-9.042578125000034],[124.93681640625007,-9.053417968750026],[124.92226562500005,-8.942480468749977],[125.17802734375002,-8.647851562499994],[125.38183593749997,-8.575390624999983],[126.61972656250006,-8.459472656249986],[126.96640625000012,-8.315722656250017],[127.29609375000004,-8.424511718749969],[126.91523437500004,-8.715234374999966],[125.40800781250002,-9.275781250000023],[125.06816406250002,-9.511914062499997]]],[[[125.64609375000006,-8.139941406250003],[125.5794921875,-8.311816406250017],[125.50712890625007,-8.275097656249997],[125.64609375000006,-8.139941406250003]]]]},"properties":{"name":"Timor-Leste","childNum":3}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-175.1619140625,-21.169335937500023],[-175.07817382812496,-21.129003906249977],[-175.15659179687495,-21.26367187499997],[-175.36235351562496,-21.106835937499994],[-175.1619140625,-21.169335937500023]]],[[[-173.953515625,-18.63935546875001],[-174.06914062500002,-18.640234375],[-173.96806640624993,-18.565332031250023],[-173.953515625,-18.63935546875001]]]]},"properties":{"name":"Tonga","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[-61.012109374999966,10.134326171874989],[-61.906103515625006,10.069140625000031],[-61.49931640624999,10.268554687499972],[-61.47827148437497,10.603369140624977],[-61.65117187499993,10.718066406249974],[-60.917626953124966,10.84023437499999],[-61.03374023437502,10.669873046875026],[-61.012109374999966,10.134326171874989]]]},"properties":{"name":"Trinidad and Tobago","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[10.957617187500063,33.72207031250005],[10.722070312500051,33.738916015624994],[10.745214843750063,33.88867187500006],[11.017871093749989,33.82333984374998],[10.957617187500063,33.72207031250005]]],[[[11.278027343750068,34.753808593749994],[11.123632812500063,34.68168945312496],[11.254882812500057,34.82031250000006],[11.278027343750068,34.753808593749994]]],[[[10.274609375000011,31.684960937499994],[10.114941406250068,31.46376953125005],[10.216406250000063,30.78320312500003],[10.05976562500004,30.58007812500003],[9.932519531250051,30.42534179687496],[9.895019531250028,30.387304687500034],[9.51875,30.229394531249994],[9.224023437500023,31.373681640624994],[9.160253906250006,31.621337890625],[9.044042968750034,32.072363281250034],[8.333398437500051,32.54360351562502],[8.1125,33.055322265624994],[7.877246093750017,33.172119140625],[7.534375,33.717919921874994],[7.513867187500068,34.080517578124955],[8.24560546875,34.73408203124998],[8.276855468750057,34.97949218749997],[8.312109375000063,35.084619140624994],[8.394238281250011,35.20385742187503],[8.318066406250011,35.654931640624994],[8.348730468750063,36.367968750000045],[8.207617187500006,36.518945312499994],[8.601269531250068,36.83393554687504],[8.576562500000023,36.93720703125001],[9.687988281250057,37.34038085937499],[9.838476562500063,37.30898437499999],[9.830273437499983,37.13535156250006],[9.875585937499977,37.25415039062503],[10.196386718750063,37.205859375000045],[10.293261718750074,36.781494140625],[10.412304687499983,36.73183593750002],[11.053906250000068,37.07250976562506],[11.12666015625004,36.874072265625045],[10.476562500000028,36.175146484375006],[10.590820312500028,35.88725585937499],[11.00429687500008,35.63383789062496],[11.120117187500057,35.24028320312499],[10.69091796875,34.67846679687503],[10.118359375000068,34.280078125000045],[10.049023437500068,34.056298828124994],[10.305273437500034,33.72827148437497],[10.713183593750017,33.68901367187496],[10.722753906250006,33.514404296875],[10.958007812500057,33.62631835937498],[11.257421875000034,33.30883789062506],[11.202636718749972,33.24921874999998],[11.50458984375004,33.181933593750045],[11.502441406250028,33.15556640624999],[11.467187500000051,32.96572265625005],[11.459179687500011,32.897363281249966],[11.453906250000017,32.64257812500003],[11.533789062500034,32.52495117187496],[11.535937500000017,32.47333984375001],[11.504980468750034,32.413671875000034],[11.358007812500006,32.34521484375003],[11.168261718750074,32.25673828125002],[11.005175781250074,32.17270507812506],[10.826367187500068,32.080664062500034],[10.771582031250006,32.02119140625001],[10.60888671875,31.929541015624977],[10.47578125000004,31.736035156249983],[10.274609375000011,31.684960937499994]]]]},"properties":{"name":"Tunisia","childNum":3}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[25.970019531250045,40.136328125],[25.6689453125,40.13588867187502],[25.918359375000023,40.23798828125004],[25.970019531250045,40.136328125]]],[[[43.43339843750002,41.155517578125],[43.43945312500003,41.10712890625001],[43.72265624999997,40.71953124999999],[43.56933593750003,40.48237304687498],[43.66621093750004,40.12636718750002],[44.28925781250004,40.040380859375006],[44.76826171875004,39.70351562500005],[44.81718750000002,39.65043945312496],[44.58710937500004,39.76855468750006],[44.3893554687501,39.422119140625],[44.02324218750002,39.37744140625006],[44.27167968750004,38.83603515625006],[44.2985351562501,38.38627929687499],[44.4499023437501,38.33422851562506],[44.21132812499999,37.908056640625006],[44.589941406250006,37.710351562499966],[44.574023437500074,37.435400390625006],[44.79414062500004,37.290380859375034],[44.76513671875003,37.142431640625006],[44.73095703124997,37.16528320312503],[44.66933593750005,37.17358398437503],[44.60595703124997,37.176025390625],[44.401953125,37.05849609375002],[44.325585937499994,37.0107421875],[44.28183593750006,36.97802734374997],[44.24570312500006,36.983300781249994],[44.20166015624997,37.05180664062502],[44.208398437499994,37.20263671875],[44.19179687499999,37.249853515625034],[44.15625,37.28295898437503],[44.11445312500004,37.30185546875006],[44.01318359375003,37.313525390625045],[43.83642578124997,37.223535156249994],[43.67578125000003,37.227246093749955],[43.09248046875004,37.36738281249998],[42.936621093750006,37.32475585937502],[42.77460937500004,37.371875],[42.74111328125005,37.361914062500034],[42.6354492187501,37.249267578125],[42.45585937500002,37.128710937500045],[42.358984375,37.10859375000004],[42.31289062499999,37.22958984374998],[42.26855468749997,37.276562499999955],[42.24755859375003,37.28222656250006],[42.20273437500006,37.29726562499999],[42.16787109375005,37.28862304687502],[42.059863281250074,37.2060546875],[41.886816406250006,37.156396484374994],[40.70566406250006,37.09770507812502],[40.4503906250001,37.00888671875006],[40.016406250000074,36.82607421875002],[39.68652343749997,36.73862304687506],[39.50146484374997,36.702246093750034],[39.35664062500004,36.68159179687498],[39.10839843749997,36.68056640625005],[38.90644531250004,36.69467773437498],[38.76660156249997,36.69311523437503],[38.19169921875002,36.90156250000004],[37.90664062500005,36.79462890625001],[37.7203125,36.74370117187502],[37.52353515625006,36.678320312500034],[37.436328125000074,36.643310546875],[37.327050781249994,36.64658203125006],[37.18740234375005,36.655908203124994],[37.066210937500074,36.652636718750045],[36.98535156250003,36.70239257812506],[36.94179687499999,36.758398437500006],[36.77656250000004,36.79267578124998],[36.65859375000005,36.80253906250002],[36.62841796875003,36.777685546875034],[36.596875,36.70136718750001],[36.546679687500074,36.50634765625],[36.5375,36.457421874999966],[36.63671874999997,36.233984375],[36.37539062499999,36.171240234375034],[36.347558593749994,36.003515625000034],[36.20195312500002,35.93754882812502],[36.15361328125002,35.83388671875005],[36.12734375,35.831445312499994],[35.967578125000074,35.91005859375002],[35.89267578125006,35.91655273437502],[35.81093750000005,36.30986328125002],[36.18847656250003,36.65898437499999],[36.048925781250006,36.91059570312501],[35.393164062500006,36.57519531249997],[34.70361328125003,36.81679687499999],[33.694726562499994,36.18198242187498],[32.794824218749994,36.03588867187497],[32.37773437500002,36.18364257812496],[32.02197265625003,36.53530273437502],[31.35253906249997,36.80107421874999],[30.64404296874997,36.86567382812501],[30.446093750000074,36.269873046875034],[29.6890625,36.15668945312498],[29.22363281249997,36.32446289062497],[28.96962890625008,36.71533203125003],[28.303710937500057,36.81196289062498],[28.01943359375005,36.63447265624998],[28.083984375000057,36.75146484375],[27.453906250000017,36.712158203125],[28.00537109375003,36.83198242187498],[28.242382812500068,37.029052734375],[27.262988281250045,36.97656250000003],[27.30019531250005,37.12685546875002],[27.53505859375005,37.16386718750002],[27.06796875,37.65791015625004],[27.224414062500074,37.725439453125006],[27.23242187500003,37.978662109374994],[26.29072265625001,38.27719726562498],[26.44130859375005,38.64121093749998],[26.67421875000008,38.33574218750002],[27.14423828125001,38.45195312499996],[26.906835937500034,38.48173828124999],[26.763671875,38.709619140624966],[27.013671875000057,38.88686523437502],[26.814941406250057,38.96098632812502],[26.853613281250034,39.115625],[26.68183593750004,39.292236328125],[26.89921874999999,39.549658203125034],[26.113085937500074,39.46738281249998],[26.101367187500074,39.56894531249998],[26.18134765625004,39.99008789062498],[26.738085937500045,40.40024414062506],[27.28457031250008,40.45561523437496],[27.4755859375,40.319921875000034],[27.72802734375,40.32880859374998],[27.84853515625005,40.38173828125002],[27.73183593750008,40.48149414062499],[27.87490234375008,40.512939453125],[27.989550781250074,40.48945312500001],[27.96259765625001,40.369873046875],[29.00712890624999,40.389746093750034],[28.787890625000017,40.534033203125034],[28.95800781250003,40.63056640624998],[29.849218750000063,40.760107421875006],[29.113867187499977,40.93784179687506],[29.14814453125004,41.221044921875034],[31.25488281249997,41.10761718750001],[31.45800781249997,41.32001953125004],[32.306445312500074,41.72958984374998],[33.38134765625003,42.01757812500003],[34.75048828124997,41.95683593749999],[35.006445312500006,42.06328125000002],[35.15488281250006,42.02753906250001],[35.12207031250003,41.89111328125003],[35.297753906249994,41.72851562500003],[35.558007812499994,41.63403320312506],[36.05175781249997,41.68256835937498],[36.40537109375006,41.27460937500001],[36.77773437499999,41.36347656250001],[37.066210937500074,41.184423828125034],[38.38105468750004,40.92451171875001],[39.426367187500006,41.10644531250003],[40.26523437500006,40.96132812500005],[41.08359375000006,41.26118164062504],[41.41435546875002,41.42363281249999],[41.510058593750074,41.51748046875002],[41.70175781250006,41.471582031249994],[41.77939453125006,41.44052734374998],[41.823535156250074,41.432373046875],[41.92578125000003,41.49565429687502],[42.46640625,41.43984375000002],[42.56738281249997,41.55927734375001],[42.590429687500006,41.57070312500002],[42.60683593750005,41.57880859374998],[42.682421875000074,41.58574218749999],[42.75410156250004,41.57890625000002],[42.787890625000074,41.56372070312503],[42.82167968750005,41.49238281249998],[42.90673828125003,41.46684570312502],[43.05712890625003,41.35283203124996],[43.149023437500006,41.30712890624997],[43.171289062499994,41.28793945312498],[43.14101562499999,41.26484374999998],[43.15283203124997,41.23642578125006],[43.20546875000005,41.19916992187501],[43.43339843750002,41.155517578125]]],[[[27.47480468750001,41.946875],[28.014453125000017,41.96904296874999],[28.197851562500063,41.55449218750002],[29.057226562500006,41.22973632812503],[28.95625,41.00820312499999],[28.172167968750074,41.08071289062502],[27.49941406250005,40.97314453124997],[27.258007812499983,40.687353515625006],[26.772070312500034,40.498046875],[26.202734375000034,40.07539062500004],[26.25380859375005,40.31469726562503],[26.792089843750034,40.626611328124994],[26.10546875000003,40.61132812499997],[26.03896484375008,40.726757812499955],[26.331054687500057,40.954492187499994],[26.330664062499977,41.23876953125],[26.62490234375008,41.401757812499994],[26.581347656250074,41.60126953125004],[26.320898437500034,41.716552734375],[26.3603515625,41.80156249999999],[26.51142578125004,41.82636718749998],[26.549707031250023,41.896728515625],[26.5796875,41.947949218749955],[26.615332031250063,41.964892578125045],[26.884863281250006,41.99184570312502],[26.96875,42.02685546875006],[27.01171875,42.05864257812496],[27.193359375000057,42.07709960937498],[27.24433593750004,42.09326171875],[27.294921875000057,42.079541015624955],[27.47480468750001,41.946875]]]]},"properties":{"name":"Turkey","childNum":3}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[39.71132812499999,-7.977441406250023],[39.602929687499994,-7.936132812499949],[39.907128906249994,-7.649218750000031],[39.71132812499999,-7.977441406250023]]],[[[39.49648437499999,-6.174609375],[39.573046875000074,-6.387402343750011],[39.48095703124997,-6.45371093750002],[39.18232421875004,-6.172558593750026],[39.30898437499999,-5.721972656249974],[39.49648437499999,-6.174609375]]],[[[39.86503906250002,-4.906152343750037],[39.74931640625002,-5.443847656249986],[39.646777343750074,-5.368554687500009],[39.6734375,-4.927050781250031],[39.86503906250002,-4.906152343750037]]],[[[33.90322265625005,-1.002050781250034],[37.643847656250074,-3.045410156250028],[37.608203125000074,-3.497070312500028],[39.221777343750006,-4.692382812500014],[38.80468750000003,-6.070117187500031],[38.87402343750003,-6.33125],[39.5460937500001,-7.024023437500034],[39.288476562499994,-7.517871093750003],[39.28701171875005,-7.787695312500006],[39.4284179687501,-7.81279296874996],[39.441015625,-8.011523437499946],[39.304003906250074,-8.44384765625],[39.451269531250006,-8.94296875],[39.64130859375004,-9.19248046875002],[39.72519531250006,-10.000488281249972],[40.46357421875004,-10.464355468749972],[39.98867187499999,-10.820800781250014],[39.81708984375004,-10.912402343750031],[38.9875,-11.167285156250003],[38.49179687500006,-11.413281250000026],[37.92021484375002,-11.294726562500031],[37.72480468750004,-11.58066406250002],[37.54169921875004,-11.675097656249974],[37.37285156250002,-11.710449218749986],[36.97890625000005,-11.566992187499977],[36.30566406250003,-11.706347656249946],[36.191308593749994,-11.670703124999974],[36.17548828125004,-11.60927734374998],[36.08222656250004,-11.537304687499969],[35.91132812500004,-11.45468750000002],[35.785449218750074,-11.452929687500017],[35.63095703125006,-11.582031250000028],[35.564355468749994,-11.602343749999989],[35.418261718750074,-11.583203125],[35.18261718750003,-11.574804687499977],[34.95947265625003,-11.578125],[34.93701171874997,-11.463476562500034],[34.890625,-11.3935546875],[34.77382812500005,-11.341699218750009],[34.60791015624997,-11.08046875],[34.66708984375006,-10.792480468750028],[34.56992187500006,-10.241113281249966],[34.32089843750006,-9.731542968749977],[33.99560546875003,-9.495410156250003],[33.88886718750004,-9.670117187499983],[32.91992187500003,-9.407421875000026],[32.75664062500002,-9.322265625],[31.94257812500004,-9.05400390624996],[31.91865234375004,-8.942187500000017],[31.886132812499994,-8.921972656249977],[31.81806640625004,-8.902246093749952],[31.673632812500017,-8.908789062499963],[31.55625,-8.80546875],[31.44921874999997,-8.65390625],[31.35058593750003,-8.607031250000034],[31.07636718750004,-8.611914062499963],[30.968359375000063,-8.550976562499983],[30.89199218750005,-8.473730468749963],[30.830664062500063,-8.385546875000031],[30.720898437500097,-8.104394531250037],[30.40673828125003,-7.460644531249983],[30.313183593750097,-7.203710937499949],[30.212695312500017,-7.037890625000017],[30.10625,-6.915039062500028],[29.961816406249994,-6.803125],[29.798144531250017,-6.691894531249957],[29.70966796875004,-6.61689453125004],[29.590625,-6.394433593750023],[29.540820312500017,-6.313867187500037],[29.50625,-6.172070312500011],[29.480078125,-6.025],[29.490820312500063,-5.96542968750002],[29.59638671875004,-5.775976562499963],[29.60703125,-5.722656250000028],[29.59414062500005,-5.650781250000037],[29.542382812499994,-5.499804687500017],[29.34277343749997,-4.983105468749997],[29.32343750000004,-4.898828124999966],[29.32568359374997,-4.835644531249969],[29.404199218749994,-4.49667968750002],[29.40322265625005,-4.449316406249963],[29.71777343750003,-4.45585937499996],[29.94726562499997,-4.307324218749983],[30.4,-3.65390625],[30.790234375000097,-3.274609375000011],[30.811132812500006,-3.116406250000011],[30.78027343750003,-2.984863281249957],[30.70947265624997,-2.977246093749997],[30.604296875000074,-2.935253906249969],[30.515039062499994,-2.917578125],[30.45556640625003,-2.893164062500006],[30.433496093749994,-2.874511718750028],[30.424023437500097,-2.82402343749996],[30.473339843750097,-2.6943359375],[30.42421875000005,-2.641601562500014],[30.441992187500006,-2.613476562499969],[30.53369140624997,-2.426269531250014],[30.55361328125005,-2.400097656250011],[30.593359375000063,-2.39677734374996],[30.65664062500005,-2.373828124999989],[30.71484375000003,-2.363476562500011],[30.7625,-2.371679687499991],[30.828710937500006,-2.338476562499977],[30.85498046874997,-2.265429687500017],[30.8765625,-2.143359375000017],[30.864648437499994,-2.044042968749949],[30.819140625000017,-1.967480468749983],[30.812597656250006,-1.56308593750002],[30.76220703124997,-1.458691406249983],[30.710742187500074,-1.396777343749974],[30.631933593750006,-1.36748046874996],[30.508105468750074,-1.208203125000026],[30.47021484374997,-1.13115234374996],[30.47705078124997,-1.0830078125],[30.509960937500097,-1.067285156249994],[30.51992187499999,-1.0625],[30.67275390625005,-1.051367187499949],[30.741992187500017,-1.007519531249997],[30.809179687500063,-0.994921875],[30.82363281250005,-0.999023437499943],[30.84472656250003,-1.002050781250034],[32.371875,-1.002050781250034],[33.90322265625005,-1.002050781250034]]]]},"properties":{"name":"Tanzania","childNum":4}},{"geometry":{"type":"Polygon","coordinates":[[[30.50996093750001,-1.067285156250009],[30.46992187500001,-1.066015625],[30.41230468750001,-1.063085937500006],[30.360253906250023,-1.074609375],[29.930078125000023,-1.469921875000011],[29.82539062500001,-1.335546875],[29.576953125000017,-1.387890625000011],[29.717675781250023,0.098339843749997],[29.934472656250023,0.4990234375],[29.94287109375,0.819238281249994],[31.252734375000017,2.044580078124994],[31.176367187500006,2.270068359374989],[30.728613281250006,2.455371093749989],[30.8466796875,2.847021484374991],[30.754003906250006,3.041796874999989],[30.90644531250001,3.408935546875],[30.83857421875001,3.49072265625],[31.15234375,3.785595703124997],[31.547167968750017,3.677587890624991],[31.79804687500001,3.802636718749994],[32.13593750000001,3.519726562499997],[32.33574218750002,3.706201171874994],[32.99726562500001,3.880175781249989],[33.489355468750006,3.755078125],[33.568457031250006,3.81171875],[33.74160156250002,3.985253906249994],[33.97607421875,4.22021484375],[34.13203125000001,3.88916015625],[34.18574218750001,3.869775390624994],[34.1650390625,3.81298828125],[34.26708984375,3.733154296875],[34.39287109375002,3.691503906249991],[34.43769531250001,3.650585937499997],[34.44179687500002,3.60625],[34.3994140625,3.412695312499991],[34.4072265625,3.357519531249991],[34.447851562500006,3.163476562499994],[34.90576171875,2.4796875],[34.88300781250001,2.417919921874997],[34.96406250000001,2.062402343749994],[34.9775390625,1.861914062499991],[34.97646484375002,1.719628906249994],[34.79863281250002,1.24453125],[34.48173828125002,1.042138671874994],[34.41083984375001,0.867285156249991],[34.16093750000002,0.605175781249997],[33.94316406250002,0.173779296874997],[33.90322265625002,-1.002050781250006],[32.371875,-1.002050781250006],[30.8447265625,-1.002050781250006],[30.823632812500023,-0.9990234375],[30.809179687500006,-0.994921875],[30.741992187500017,-1.007519531250011],[30.672753906250023,-1.051367187500006],[30.598730468750006,-1.069726562500009],[30.519921875000023,-1.0625],[30.50996093750001,-1.067285156250009]]]},"properties":{"name":"Uganda","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[32.01220703124997,46.20390624999999],[32.15009765625004,46.1546875],[31.56386718750005,46.25776367187504],[31.50878906250003,46.373144531250006],[32.01220703124997,46.20390624999999]]],[[[38.21435546875003,47.091455078124966],[37.54335937499999,47.07456054687498],[36.794824218749994,46.71440429687499],[36.55878906250004,46.76269531250006],[35.82714843749997,46.62431640625002],[35.01455078125005,46.10600585937502],[35.280175781249994,46.27949218750001],[35.23037109375005,46.440625],[34.84960937500003,46.189892578124955],[35.02285156250005,45.70097656250002],[35.45751953124997,45.316308593749994],[36.170507812500006,45.453076171874955],[36.575,45.3935546875],[36.39335937500002,45.06538085937501],[35.87011718750003,45.005322265624955],[35.472558593749994,45.098486328125006],[35.08769531250002,44.802636718749966],[34.46992187500004,44.7216796875],[33.909960937500074,44.387597656249966],[33.45068359374997,44.553662109374955],[33.55517578125003,45.09765625000003],[32.5080078125001,45.40380859375006],[33.664843750000074,45.94707031249996],[33.59414062500005,46.09624023437499],[33.42988281250004,46.05761718750003],[33.20224609375006,46.17573242187501],[32.47675781250004,46.08369140625001],[31.83125,46.28168945312501],[32.00849609375004,46.42998046875002],[31.554882812500097,46.554296875000034],[32.36132812499997,46.474951171875034],[32.578027343749994,46.615625],[32.04433593750005,46.642480468749966],[31.75917968750005,47.21284179687501],[31.872851562500017,46.649755859375034],[31.532128906249994,46.66474609374998],[31.56337890625005,46.77729492187501],[31.402929687500063,46.62880859375002],[30.796289062499994,46.55200195312503],[30.219042968750074,45.866748046875045],[29.62841796875003,45.722460937500045],[29.705859375000074,45.25991210937505],[29.567675781250074,45.37080078124998],[29.40371093750005,45.419677734375],[29.22353515625005,45.402929687500034],[28.894335937500017,45.28994140625002],[28.78173828125,45.30986328125002],[28.76660156250003,45.28623046874998],[28.78828125000001,45.240966796875],[28.451269531250006,45.292187499999955],[28.317675781250045,45.347119140624955],[28.2125,45.45043945312506],[28.26484375000004,45.48388671875003],[28.310351562500074,45.49858398437499],[28.499023437500057,45.517724609374994],[28.513769531250034,45.57241210937502],[28.49160156250005,45.66577148437503],[28.562304687500074,45.73579101562501],[28.667578125,45.79384765625002],[28.729296875000074,45.852001953124955],[28.73876953125003,45.937158203124994],[28.84951171875005,45.97866210937502],[28.94775390624997,46.049951171874966],[28.971875,46.12763671874998],[29.00625,46.17646484374998],[28.94375,46.28842773437506],[28.930566406250023,46.36225585937501],[28.92744140625001,46.42412109374999],[28.958398437500023,46.45849609374997],[29.146289062500017,46.52690429687496],[29.186230468750068,46.52397460937499],[29.20078125,46.504980468750034],[29.20458984374997,46.37934570312501],[29.223828125000097,46.37695312499997],[29.458789062500017,46.453759765624994],[29.83789062499997,46.35053710937501],[29.878027343750063,46.360205078125034],[30.07568359375003,46.377832031249966],[30.131054687500097,46.42309570312506],[29.92431640624997,46.53886718750002],[29.934765625000097,46.625],[29.942480468750063,46.72377929687502],[29.918066406250063,46.78242187499998],[29.877832031249994,46.828906250000045],[29.57197265625004,46.96401367187502],[29.455664062500006,47.292626953124994],[29.134863281250006,47.48969726562501],[29.125390625000023,47.96455078125001],[28.42304687500001,48.146875],[28.34052734375001,48.144433593749994],[27.54921875000008,48.47773437500004],[27.22851562500003,48.37143554687506],[26.90058593750001,48.37192382812506],[26.847070312500023,48.387158203124955],[26.640429687500045,48.29414062500001],[26.618945312500017,48.25986328125006],[26.4423828125,48.22998046875],[26.162695312500063,47.992529296875034],[25.90869140625,47.96757812500002],[25.689257812500045,47.93247070312506],[25.46425781250005,47.910791015624994],[24.979101562500063,47.72412109374997],[24.578906250000074,47.93105468750005],[23.628710937500017,47.995849609375],[23.40820312500003,47.98999023437506],[23.20263671875,48.084521484375045],[23.13945312499999,48.08740234375],[22.87666015625001,47.94726562500006],[22.769140625000063,48.109619140625],[22.582421875000023,48.134033203125],[22.253710937500017,48.407373046874994],[22.131835937500057,48.40532226562502],[22.142871093750017,48.568505859374966],[22.295214843750045,48.68583984374999],[22.389453125000045,48.87348632812501],[22.52412109375004,49.03139648437502],[22.538671875,49.07270507812501],[22.847070312500023,49.08125],[22.705664062500006,49.17119140624999],[22.6494140625,49.53901367187498],[22.706152343750006,49.60620117187497],[23.03632812500004,49.899072265624966],[23.711718750000045,50.377343749999966],[23.97265625,50.410058593749966],[24.089941406250006,50.53046874999998],[24.0947265625,50.617041015625034],[23.9970703125,50.809375],[24.095800781250063,50.87275390625001],[23.664453125000023,51.31005859375],[23.61376953125,51.525390625],[23.706835937500045,51.64130859374998],[23.79169921875001,51.63710937500002],[23.864257812500057,51.62397460937501],[23.951171875,51.58505859374998],[23.978320312500017,51.59130859375003],[24.12685546875008,51.664648437500034],[24.280078125000017,51.77470703124999],[24.361914062500006,51.86752929687498],[25.785742187500006,51.923828125],[26.77343750000003,51.77070312499998],[26.952832031249983,51.754003906250034],[27.074121093750023,51.760839843750006],[27.14199218750008,51.75205078124998],[27.29628906250008,51.59741210937503],[27.689746093750017,51.572412109374994],[27.7,51.47797851562501],[27.85859375000004,51.59238281250006],[28.532031250000017,51.56245117187501],[28.59902343750008,51.54262695312505],[28.647753906250074,51.45654296875],[28.690234375000017,51.43886718750005],[28.73125,51.43339843749999],[28.84951171875005,51.540185546874994],[28.927539062500045,51.56215820312502],[28.97773437500004,51.57177734375003],[29.01308593750005,51.59892578124996],[29.06074218750001,51.625439453124955],[29.102050781250057,51.627539062500034],[29.346484375000017,51.38256835937503],[30.160742187500006,51.477880859375006],[30.449511718750017,51.274316406249994],[30.63251953125004,51.35541992187501],[30.61171875000005,51.406347656250006],[30.602343750000017,51.47124023437499],[30.56074218750004,51.531494140625],[30.533007812500017,51.596337890624966],[30.583886718749994,51.68896484375003],[30.667285156250017,51.81411132812502],[30.755273437499994,51.89516601562502],[30.84570312500003,51.95307617187501],[30.980664062500097,52.04619140624996],[31.217968750000097,52.05024414062498],[31.345996093750074,52.10537109375002],[31.57373046875003,52.108105468749955],[31.763378906250097,52.10107421875003],[32.12226562500004,52.05058593749996],[32.435449218749994,52.307226562500034],[33.735253906249994,52.344775390625045],[34.397851562499994,51.780419921874994],[34.12109375000003,51.67915039062498],[34.21386718750003,51.25537109375006],[35.0640625,51.203417968750045],[35.31191406250005,51.043896484374955],[35.59111328125002,50.36875],[36.1164062500001,50.408544921875006],[36.619433593750074,50.209228515625],[37.42285156249997,50.411474609375006],[38.046875,49.92001953125006],[38.258593750000074,50.05234375],[38.91835937499999,49.82470703125],[39.17480468750003,49.85595703124997],[39.780566406250074,49.57202148437503],[40.080664062500006,49.576855468749955],[40.10878906250005,49.251562500000034],[39.68652343749997,49.007910156250034],[40.00361328125004,48.82207031250002],[39.792871093749994,48.807714843750034],[39.6447265625001,48.591210937499966],[39.8356445312501,48.54277343749996],[39.95791015625005,48.268896484375034],[39.77871093750005,47.88754882812506],[38.90029296875005,47.85512695312502],[38.36884765625004,47.609960937500006],[38.21435546875003,47.091455078124966]]]]},"properties":{"name":"Ukraine","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[-57.81059570312499,-30.85859375000001],[-57.872509765625,-30.59101562500001],[-57.831201171874994,-30.495214843750006],[-57.71269531249999,-30.38447265625001],[-57.65087890625,-30.295019531250006],[-57.645751953125,-30.226953125],[-57.60888671875,-30.187792968750003],[-57.55229492187499,-30.26123046875],[-57.21445312499999,-30.28339843750001],[-57.186914062499994,-30.26484375000001],[-57.120507812499994,-30.14443359375001],[-56.83271484375,-30.107226562500003],[-56.4072265625,-30.44746093750001],[-55.998974609375,-30.837207031250003],[-56.018457031249994,-30.99189453125001],[-56.00468749999999,-31.079199218750006],[-55.873681640624994,-31.069628906250003],[-55.6271484375,-30.85810546875001],[-55.60302734375,-30.85078125000001],[-55.55732421875,-30.8759765625],[-55.17353515625,-31.279589843750003],[-55.09116210937499,-31.31396484375],[-55.036035156249994,-31.27900390625001],[-54.587646484375,-31.48515625],[-54.22055664062499,-31.85517578125001],[-53.76171875,-32.05683593750001],[-53.601708984374994,-32.40302734375001],[-53.12558593749999,-32.73671875],[-53.2140625,-32.82109375],[-53.31010742187499,-32.92705078125],[-53.39521484375,-33.010351562500006],[-53.482861328125,-33.06855468750001],[-53.511865234374994,-33.10869140625],[-53.53134765624999,-33.1708984375],[-53.53134765624999,-33.65546875000001],[-53.37060546875,-33.7421875],[-53.419580078124994,-33.77919921875001],[-53.47246093749999,-33.84931640625001],[-53.53452148437499,-34.01748046875001],[-53.742919921875,-34.24951171875],[-53.785302734374994,-34.38037109375],[-54.16855468749999,-34.670703125],[-54.902294921875,-34.93281250000001],[-55.67314453124999,-34.77568359375],[-56.249951171875,-34.90126953125001],[-57.17070312499999,-34.45234375000001],[-57.8291015625,-34.47734375],[-58.40019531249999,-33.91240234375],[-58.363525390625,-33.18232421875001],[-58.08232421874999,-32.893652343750006],[-58.12958984375,-32.75722656250001],[-58.16220703124999,-32.566503906250006],[-58.201171875,-32.4716796875],[-58.123046875,-32.321875],[-58.11972656249999,-32.24892578125001],[-58.164794921875,-32.18486328125],[-58.177001953125,-32.11904296875001],[-58.15634765624999,-32.0515625],[-58.160400390625,-31.98652343750001],[-58.18901367187499,-31.92421875],[-58.16748046875,-31.87265625],[-58.04233398437499,-31.76923828125001],[-58.006982421874994,-31.68496093750001],[-58.053857421874994,-31.494921875],[-58.0333984375,-31.416601562500006],[-57.89335937499999,-31.1953125],[-57.868408203125,-31.10439453125001],[-57.88632812499999,-30.93740234375001],[-57.81059570312499,-30.85859375000001]]]},"properties":{"name":"Uruguay","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-155.58134765624996,19.012011718750017],[-155.88129882812495,19.07050781250001],[-156.04868164062498,19.749951171874983],[-155.82031249999997,20.01416015624997],[-155.83164062499998,20.27583007812501],[-155.198779296875,19.99438476562503],[-154.80419921875,19.524462890625045],[-155.58134765624996,19.012011718750017]]],[[[-156.84960937499997,20.772656249999955],[-156.97338867187497,20.757519531249983],[-157.0505859375,20.912451171875034],[-156.88056640624995,20.904833984375074],[-156.84960937499997,20.772656249999955]]],[[[-156.48681640624994,20.93256835937504],[-156.27753906250004,20.951269531250034],[-155.98984374999998,20.75712890624999],[-156.40878906249998,20.60517578125004],[-156.480078125,20.80122070312501],[-156.69775390625003,20.949072265625034],[-156.58540039062495,21.034326171874994],[-156.48681640624994,20.93256835937504]]],[[[-157.21362304687497,21.215380859375017],[-156.71215820312506,21.155078125000074],[-156.85986328125,21.05634765625004],[-157.29033203124996,21.112597656250017],[-157.21362304687497,21.215380859375017]]],[[[-157.79936523437502,21.456640625000034],[-157.63540039062502,21.30761718749997],[-158.11035156249994,21.318603515625],[-158.27314453125,21.585253906250045],[-157.9625,21.701367187499983],[-157.79936523437502,21.456640625000034]]],[[[-159.37275390625,21.93237304687497],[-159.60883789062495,21.909521484375034],[-159.78916015625003,22.041796875000074],[-159.57919921874998,22.22314453124997],[-159.35205078124997,22.219580078125034],[-159.37275390625,21.93237304687497]]],[[[-81.04418945312503,24.716796875000057],[-81.137353515625,24.710498046875017],[-80.93046875,24.75947265625004],[-81.04418945312503,24.716796875000057]]],[[[-80.3818359375,25.142285156249955],[-80.58056640624997,24.954248046875023],[-80.25708007812497,25.34760742187504],[-80.3818359375,25.142285156249955]]],[[[-97.17070312499996,26.159375],[-97.40209960937494,26.820507812499983],[-97.38598632812494,27.19648437500004],[-97.17070312499996,26.159375]]],[[[-80.18676757812497,27.278417968750034],[-80.17050781250003,27.20478515625004],[-80.43691406249994,27.850537109374955],[-80.18676757812497,27.278417968750034]]],[[[-91.793701171875,29.50073242187497],[-92.00664062499996,29.61030273437501],[-91.875244140625,29.640966796875034],[-91.793701171875,29.50073242187497]]],[[[-84.90791015624998,29.642626953125017],[-85.11674804687499,29.63281249999997],[-84.737158203125,29.732421875],[-84.90791015624998,29.642626953125017]]],[[[-89.22397460937498,30.084082031249977],[-89.34199218749995,30.062841796875006],[-89.18466796874995,30.168652343749983],[-89.22397460937498,30.084082031249977]]],[[[-118.34794921875002,33.3857421875],[-118.29746093750003,33.312109375],[-118.44628906249997,33.317089843749955],[-118.56943359375002,33.46416015624999],[-118.34794921875002,33.3857421875]]],[[[-120.04355468749995,33.918847656249994],[-120.25190429687494,34.01386718749998],[-120.07182617187493,34.026513671874966],[-120.04355468749995,33.918847656249994]]],[[[-119.88237304687497,34.07968749999998],[-119.54926757812497,34.02817382812506],[-119.80957031249997,33.9677734375],[-119.88237304687497,34.07968749999998]]],[[[-75.54414062499995,35.240087890625034],[-75.69008789062502,35.221582031249994],[-75.53637695312497,35.27861328124999],[-75.50351562500003,35.769140625],[-75.46474609374994,35.448632812499966],[-75.54414062499995,35.240087890625034]]],[[[-74.13320312500002,39.680761718750034],[-74.25048828125,39.529394531250006],[-74.10673828124996,39.74643554687498],[-74.13320312500002,39.680761718750034]]],[[[-72.50976562500003,40.98603515625001],[-72.58085937499996,40.92133789062498],[-71.90322265625,41.06069335937505],[-73.19428710937495,40.654199218749994],[-74.01489257812497,40.581201171874966],[-73.87924804687498,40.79165039062502],[-73.573828125,40.91962890624998],[-72.62509765624998,40.99184570312505],[-72.27412109374998,41.15302734375001],[-72.50976562500003,40.98603515625001]]],[[[-69.9779296875,41.26557617187504],[-70.23305664062502,41.28632812500001],[-70.04121093750001,41.3974609375],[-69.9779296875,41.26557617187504]]],[[[-70.50991210937502,41.376318359375034],[-70.82919921874995,41.35898437500006],[-70.61601562499996,41.45722656250001],[-70.50991210937502,41.376318359375034]]],[[[-71.24140625000001,41.49194335937497],[-71.34624023437496,41.469384765624994],[-71.23203124999995,41.654296875],[-71.24140625000001,41.49194335937497]]],[[[-68.18725585937497,44.33247070312501],[-68.41171875000003,44.294335937499966],[-68.29941406249998,44.456494140624955],[-68.18725585937497,44.33247070312501]]],[[[-122.394140625,47.39526367187503],[-122.50991210937497,47.358007812500006],[-122.486474609375,47.48876953125],[-122.394140625,47.39526367187503]]],[[[-122.57275390624999,48.15664062499999],[-122.38315429687499,47.923193359375034],[-122.74150390624999,48.22529296875004],[-122.62861328125,48.38422851562498],[-122.54243164062503,48.29399414062499],[-122.69702148437499,48.228662109374994],[-122.57275390624999,48.15664062499999]]],[[[-94.80346679687497,49.0029296875],[-94.71279296874997,48.863427734374994],[-94.62089843749999,48.74262695312501],[-93.85161132812496,48.607275390625034],[-93.70771484374995,48.52543945312499],[-93.37788085937498,48.61655273437498],[-93.25795898437497,48.62885742187501],[-92.83671875,48.567773437499994],[-92.50058593749995,48.43535156250002],[-92.41459960937493,48.276611328125],[-92.3484375,48.276611328125],[-92.00517578125002,48.301855468750006],[-91.38720703124997,48.05854492187498],[-91.04345703125003,48.19370117187498],[-90.84033203125003,48.20053710937506],[-90.79731445312495,48.13105468750001],[-89.4556640625,47.996240234374994],[-88.37817382812497,48.30307617187498],[-87.74389648437497,48.06054687500003],[-87.20800781249997,47.848486328125006],[-86.67216796874996,47.636425781249955],[-85.65224609375,47.21997070312503],[-85.07006835937497,46.97993164062498],[-84.87597656249994,46.89990234375003],[-84.66577148437503,46.54326171875002],[-84.44047851562496,46.49814453125006],[-84.12319335937497,46.50292968749997],[-83.97778320312503,46.08491210937498],[-83.61596679687503,46.116845703124994],[-83.46948242187503,45.99467773437499],[-83.59267578125,45.81713867187506],[-82.91933593749994,45.51796875000002],[-82.55107421874996,45.34736328125001],[-82.48505859374993,45.08374023437503],[-82.137841796875,43.570898437500034],[-82.19038085937495,43.47407226562501],[-82.54531249999997,42.62470703124998],[-83.10952148437497,42.25068359375001],[-83.141943359375,41.97587890624996],[-82.69003906249995,41.675195312499994],[-82.43906249999998,41.67485351562502],[-81.97416992187496,41.88872070312499],[-81.50732421874997,42.10346679687504],[-81.02822265624997,42.247167968750006],[-80.24755859375,42.36601562499996],[-79.17373046875,42.74853515625],[-78.91508789062496,42.90913085937504],[-78.98076171874993,42.98061523437502],[-79.02617187499996,43.01733398437506],[-79.066064453125,43.10610351562502],[-79.171875,43.466552734375],[-79.00249023437502,43.52714843749999],[-78.845556640625,43.58334960937498],[-78.72041015625001,43.62495117187501],[-78.45825195312497,43.63149414062502],[-77.596533203125,43.62861328124998],[-76.819970703125,43.62880859375002],[-76.18579101562503,44.24223632812502],[-75.81933593749997,44.468017578125],[-75.40126953124997,44.77226562499999],[-74.99614257812496,44.970117187499966],[-74.76245117187494,44.99907226562502],[-74.663232421875,45.00390625000003],[-71.51752929687495,45.00756835937497],[-71.327294921875,45.29008789062496],[-70.86503906249999,45.27070312500001],[-70.296240234375,45.90610351562506],[-70.00771484375002,46.70893554687501],[-69.24287109374998,47.46298828124998],[-69.0501953125,47.426611328125034],[-68.93720703124998,47.21123046875002],[-68.23549804687502,47.34594726562503],[-67.806787109375,47.08281249999999],[-67.80224609374994,45.7275390625],[-67.43266601562496,45.603125],[-67.366943359375,45.17377929687498],[-67.12485351562498,45.16943359375],[-66.98701171874995,44.82768554687502],[-67.191259765625,44.67558593750002],[-67.83906249999998,44.576269531250034],[-68.056640625,44.38432617187502],[-68.15205078124998,44.50200195312499],[-68.45058593749997,44.50761718749999],[-68.53251953124996,44.25864257812498],[-68.81191406249994,44.33935546875],[-68.76269531249994,44.57075195312498],[-69.22607421875003,43.98647460937505],[-69.52075195312503,43.89736328125002],[-69.55668945312496,43.982763671875006],[-69.62392578125,43.88061523437497],[-69.65288085937493,43.99389648437506],[-69.808349609375,43.772314453125034],[-69.965234375,43.855078125],[-70.17880859374998,43.76635742187506],[-70.73310546875001,43.07001953125004],[-70.82905273437493,42.82534179687502],[-70.61293945312497,42.623242187499955],[-71.04619140624993,42.331103515625045],[-70.73828125,42.228857421875006],[-70.42666015625002,41.75727539062501],[-70.00141601562498,41.82617187500003],[-70.24106445312495,42.09121093750002],[-70.10893554687496,42.07832031249998],[-69.97788085937498,41.961279296875006],[-69.94863281249997,41.67714843750005],[-70.65712890625,41.53422851562496],[-70.70112304687498,41.71484375],[-71.1685546875,41.489404296874994],[-71.14873046874996,41.74570312499998],[-71.27109375,41.68125],[-71.39013671875003,41.79531250000005],[-71.52285156249997,41.378955078125045],[-72.92470703125002,41.28515625000003],[-73.98710937499999,40.751367187499994],[-73.87197265625,41.05517578124997],[-73.96992187499995,41.24970703125001],[-73.92719726562495,40.914257812499955],[-74.26420898437496,40.52861328124999],[-73.972265625,40.40034179687498],[-74.079931640625,39.78813476562496],[-74.06459960937497,39.99311523437498],[-74.79448242187499,39.00190429687501],[-74.95429687499995,38.949951171875],[-74.89702148437502,39.14545898437504],[-75.52421874999999,39.49018554687501],[-75.421875,39.78969726562502],[-75.07416992187495,39.98349609375006],[-75.40063476562503,39.83159179687502],[-75.58759765625001,39.64077148437505],[-75.3921875,39.09277343750006],[-75.08867187499999,38.777539062499955],[-75.18710937499995,38.59111328124999],[-75.03876953124993,38.426367187500006],[-75.934375,37.15190429687496],[-75.97504882812498,37.3984375],[-75.65927734374995,37.953955078125034],[-75.850830078125,37.971582031249994],[-75.85869140624999,38.36206054687503],[-76.05122070312495,38.27954101562503],[-76.2646484375,38.436425781249994],[-76.26416015625,38.599951171875006],[-76.016943359375,38.62509765624998],[-76.21298828124998,38.75830078125003],[-76.34116210937498,38.70966796874998],[-76.16816406249998,38.85273437499998],[-76.32958984375,38.95278320312505],[-76.13520507812493,39.082128906250006],[-76.23569335937498,39.19160156250001],[-76.153125,39.315039062500034],[-75.87597656249997,39.3759765625],[-76.003125,39.41083984375001],[-75.87294921874997,39.510888671874966],[-75.95893554687498,39.58505859374998],[-76.2763671875,39.32275390625],[-76.330810546875,39.40390625],[-76.42089843749997,39.225],[-76.57041015624995,39.26933593749996],[-76.42758789062498,39.12602539062499],[-76.55854492187493,39.065234375000045],[-76.39409179687502,38.368994140625034],[-76.67734374999998,38.611962890624966],[-76.66855468749998,38.5375],[-76.34116210937498,38.08701171875006],[-76.86811523437495,38.39028320312502],[-76.88974609375,38.292089843750006],[-77.00117187499995,38.44526367187504],[-77.23251953125,38.40771484375003],[-77.03037109374995,38.88925781249998],[-77.26040039062502,38.6],[-77.27324218749996,38.35175781249998],[-77.04677734375002,38.356689453125],[-76.26425781250003,37.89355468749997],[-76.34414062499997,37.675683593749994],[-76.49248046874999,37.682226562500006],[-77.11108398437497,38.165673828124994],[-76.54946289062494,37.66914062500001],[-76.30556640625,37.57148437500001],[-76.26347656249996,37.35703125],[-76.40097656249998,37.386132812499994],[-76.45390624999993,37.27353515625006],[-76.75771484375002,37.50541992187496],[-76.28330078125,37.05268554687501],[-76.40087890624997,36.991308593750034],[-76.63090820312493,37.22172851562499],[-77.25087890624994,37.329199218750034],[-76.671875,37.172949218750006],[-76.48784179687502,36.89702148437499],[-75.99941406249997,36.91264648437499],[-75.53417968749997,35.81909179687506],[-75.94648437499995,36.65908203125002],[-75.99277343749995,36.47377929687502],[-75.82006835937494,36.11284179687502],[-76.14785156250002,36.279296875],[-76.15,36.14575195312497],[-76.27060546874998,36.18989257812501],[-76.22739257812498,36.11601562499996],[-76.559375,36.015332031249955],[-76.733642578125,36.229150390624994],[-76.726220703125,35.957617187500034],[-76.06977539062501,35.970312500000034],[-76.08359374999998,35.69052734375006],[-75.85390625,35.96015625000001],[-75.75883789062499,35.84326171875],[-75.77392578124997,35.64697265624997],[-76.17382812499997,35.354150390624994],[-76.489501953125,35.397021484375045],[-76.57719726562502,35.53232421874998],[-76.74140624999998,35.431494140625034],[-77.03999023437495,35.527392578125045],[-76.51293945312497,35.270410156249994],[-76.77915039062503,34.990332031250034],[-77.07026367187501,35.154638671875034],[-76.97495117187503,35.025195312500045],[-76.74497070312498,34.94096679687502],[-76.45673828124998,34.989355468750034],[-76.36220703125,34.9365234375],[-76.43979492187498,34.84291992187502],[-77.29624023437503,34.602929687499994],[-77.41225585937497,34.730810546875034],[-77.37978515625,34.526611328125],[-77.750732421875,34.28496093749996],[-77.92783203125,33.93974609374999],[-77.95327148437494,34.16899414062496],[-78.01333007812502,33.91181640624998],[-78.40585937499995,33.91757812499998],[-78.84145507812497,33.72407226562501],[-79.19379882812498,33.24414062500003],[-79.22646484375,33.40488281249998],[-79.27602539062497,33.135400390624966],[-79.80498046874999,32.78740234374996],[-79.93310546874997,32.81005859375006],[-79.94072265625002,32.667138671874966],[-80.36284179687496,32.500732421875],[-80.6341796875,32.51171875000003],[-80.474267578125,32.42275390625002],[-80.579345703125,32.28730468750004],[-80.80253906249999,32.44804687500002],[-80.69423828124997,32.21572265625002],[-81.11328124999997,31.87861328125001],[-81.06611328124995,31.787988281250023],[-81.259375,31.538916015624977],[-81.17543945312494,31.531298828125017],[-81.38095703124998,31.353271484375],[-81.28847656249997,31.263916015625],[-81.441748046875,31.19970703124997],[-81.5162109375,30.801806640625017],[-81.24951171875003,29.793798828125006],[-80.52412109374995,28.48608398437503],[-80.5849609375,28.271582031250034],[-80.456884765625,27.90068359374996],[-80.61000976562494,28.177587890624977],[-80.60693359375003,28.522900390624983],[-80.693505859375,28.34497070312497],[-80.68847656250003,28.578515625000023],[-80.83818359374999,28.757666015625034],[-80.74863281250003,28.381005859375023],[-80.050048828125,26.807714843750063],[-80.1263671875,25.83349609375],[-80.48466796874999,25.229833984375034],[-81.11049804687494,25.138037109374977],[-81.13603515624999,25.309667968750034],[-80.94042968750003,25.264208984375017],[-81.11333007812499,25.367236328125045],[-81.36494140625001,25.83105468750003],[-81.715478515625,25.98315429687503],[-81.95893554687495,26.489941406249983],[-81.82866210937496,26.68706054687499],[-82.03959960937496,26.552050781250017],[-82.01328125,26.96157226562505],[-82.24287109374998,26.848876953125],[-82.44135742187501,27.059667968750034],[-82.71459960937497,27.499609375000063],[-82.40576171874994,27.862890624999977],[-82.67519531249994,27.963769531250023],[-82.61098632812502,27.77724609375005],[-82.74287109374995,27.709375],[-82.84350585937494,27.845996093750017],[-82.65146484375,28.8875],[-83.69438476562502,29.92597656250001],[-84.04423828124996,30.10380859374999],[-84.30966796874995,30.064746093750045],[-84.38281250000003,29.90737304687505],[-85.31894531249995,29.680224609375045],[-85.413818359375,29.76757812499997],[-85.413818359375,29.842480468749955],[-85.31489257812493,29.758105468750017],[-85.35361328125,29.875732421875],[-85.67578125,30.121923828125063],[-85.60351562500003,30.286767578124966],[-85.75581054687495,30.1669921875],[-86.454443359375,30.39912109375004],[-86.12382812499999,30.40581054687499],[-86.25737304687502,30.493017578124977],[-87.201171875,30.339257812499994],[-86.98579101562498,30.43085937500001],[-86.99755859375,30.5703125],[-87.17060546874998,30.538769531249983],[-87.28105468750002,30.339257812499994],[-87.47578124999998,30.294287109375006],[-87.44829101562499,30.394140625],[-87.62226562499998,30.264746093750006],[-88.00595703124998,30.230908203124955],[-87.79028320312503,30.291796875000017],[-88.011328125,30.694189453125006],[-88.13544921874998,30.366601562499994],[-88.90522460937495,30.415136718750006],[-89.32055664062503,30.3453125],[-89.58847656249998,30.165966796874955],[-90.12597656249997,30.369091796874955],[-90.33198242187493,30.277587890625057],[-90.41303710937501,30.140332031249983],[-90.17534179687499,30.02910156249996],[-89.73745117187497,30.171972656250034],[-89.66503906249994,30.117041015625034],[-89.81518554687497,30.007275390624955],[-89.631689453125,29.90380859375003],[-89.400732421875,30.04604492187505],[-89.35444335937501,29.82021484375005],[-89.72089843749995,29.619287109374966],[-89.01572265625,29.202880859375057],[-89.15551757812497,29.01660156250003],[-89.23608398437494,29.081103515625017],[-89.37612304687497,28.981347656250023],[-89.44316406249996,29.194140625000045],[-90.15908203124997,29.537158203125017],[-90.05278320312499,29.336816406249966],[-90.21279296875,29.104931640624983],[-90.37919921874996,29.29511718750001],[-90.75102539062496,29.13085937500003],[-91.29013671875,29.288964843749994],[-91.15078124999994,29.317919921875045],[-91.24882812499993,29.56420898437503],[-91.51420898437499,29.55537109375001],[-91.8931640625,29.836035156249977],[-92.135498046875,29.699462890625057],[-92.08403320312499,29.59282226562499],[-92.26083984374995,29.55683593750004],[-93.17568359375,29.778955078124994],[-93.82646484374999,29.725146484375045],[-93.84145507812502,29.97973632812503],[-93.89047851562495,29.689355468750023],[-94.759619140625,29.384277343750057],[-94.52626953125,29.547949218750006],[-94.77827148437498,29.54785156249997],[-94.74194335937497,29.75],[-95.0228515625,29.70234375000001],[-94.88828125000003,29.37055664062501],[-95.27348632812499,28.96386718750003],[-96.23452148437502,28.488964843749983],[-96.01103515624996,28.631933593749977],[-96.44873046874997,28.594482421875],[-96.64003906249994,28.708789062500017],[-96.42109374999993,28.457324218750045],[-96.67636718749998,28.34130859375003],[-96.77353515624998,28.421630859375057],[-96.839501953125,28.194384765625017],[-97.156494140625,28.144335937500045],[-97.141259765625,28.060742187499983],[-97.034326171875,28.093847656250063],[-97.07309570312498,27.98608398437503],[-97.43149414062498,27.83720703124999],[-97.28872070312494,27.670605468749983],[-97.43911132812502,27.328271484374966],[-97.76845703124997,27.45751953125],[-97.69238281250003,27.287158203125017],[-97.48510742187497,27.237402343750006],[-97.55468749999994,26.96733398437496],[-97.43505859375,26.48583984375003],[-97.14624023437494,25.961474609375045],[-97.37563476562497,25.871826171875],[-99.10776367187498,26.446923828124994],[-99.45654296874999,27.05668945312496],[-99.50532226562497,27.54833984375003],[-100.29604492187495,28.32768554687499],[-100.75458984375001,29.182519531249994],[-101.44038085937503,29.77685546875],[-102.26894531249998,29.871191406250034],[-102.61494140624994,29.75234375],[-102.8919921875,29.216406250000034],[-103.16831054687498,28.998193359374994],[-104.110595703125,29.386132812499994],[-104.50400390624995,29.677685546874955],[-104.97880859374996,30.645947265624955],[-106.14804687499995,31.450927734375],[-106.44541015624996,31.768408203125006],[-108.21181640625002,31.779345703125017],[-108.21445312499993,31.329443359375034],[-111.0419921875,31.32421875000003],[-114.83593749999994,32.50830078125003],[-114.72475585937495,32.71533203125003],[-117.12827148437495,32.533349609374994],[-117.46743164062495,33.295507812500006],[-118.08051757812497,33.72216796874997],[-118.41044921874996,33.74394531249996],[-118.506201171875,34.01738281249999],[-119.14375,34.11201171874998],[-119.60605468749999,34.41801757812499],[-120.48120117187503,34.47163085937498],[-120.64467773437502,34.57998046875002],[-120.65908203124994,35.122412109375034],[-120.85737304687501,35.209667968749955],[-120.899609375,35.42509765624999],[-121.28383789062494,35.67631835937499],[-121.87739257812498,36.33105468749997],[-121.80742187499995,36.851220703124994],[-122.394921875,37.20751953125003],[-122.49921875000001,37.542626953124994],[-122.44560546875002,37.797998046874966],[-122.07050781249998,37.47827148437503],[-122.38544921875001,37.960595703124966],[-122.31425781249999,38.00732421874997],[-121.52534179687503,38.05590820312503],[-122.39335937499995,38.14482421875002],[-122.52133789062499,37.82641601562497],[-122.93198242187498,38.05546875000002],[-122.998779296875,37.98862304687498],[-122.90815429687501,38.19658203124999],[-123.701123046875,38.90727539062502],[-123.83291015624994,39.775488281250034],[-124.35654296875003,40.37109374999997],[-124.07192382812497,41.45952148437502],[-124.53964843750003,42.812890624999966],[-124.14873046874997,43.691748046875034],[-123.92934570312495,45.57695312499996],[-123.989306640625,46.21938476562502],[-123.22060546874998,46.153613281250045],[-123.46484375,46.27109374999998],[-124.07275390624996,46.279443359374994],[-124.04433593750002,46.605078125],[-123.946142578125,46.43256835937501],[-123.88916015625003,46.660009765625006],[-124.11254882812497,46.862695312499994],[-123.84287109375002,46.963183593750045],[-124.11171875,47.03520507812496],[-124.1392578125,46.95468749999998],[-124.376025390625,47.658642578124955],[-124.66308593749996,47.97412109375003],[-124.7099609375,48.38037109375],[-123.97578125,48.16845703125],[-122.97387695312499,48.07329101562496],[-122.77861328125,48.13759765625002],[-122.65664062500002,47.88115234374999],[-122.77841796874996,47.738427734374966],[-122.82138671875,47.79316406250001],[-123.1390625,47.386083984375034],[-122.92216796874993,47.40766601562498],[-123.066796875,47.39965820312506],[-123.04863281249995,47.479345703125034],[-122.53281250000002,47.919726562500045],[-122.67548828124995,47.612353515625045],[-122.57788085937496,47.29316406250001],[-122.76777343750001,47.21835937500006],[-122.82846679687503,47.336572265624994],[-123.02758789062501,47.13891601562503],[-122.70195312500002,47.11088867187502],[-122.35380859374996,47.37158203125],[-122.40180664062497,47.78427734374998],[-122.24199218750002,48.01074218750003],[-122.5169921875,48.15966796874997],[-122.40854492187502,48.29389648437498],[-122.66899414062496,48.465234374999966],[-122.49677734374995,48.50556640625001],[-122.51274414062502,48.66943359375],[-122.56201171875001,48.777978515624994],[-122.68593749999995,48.794287109375034],[-122.72246093750002,48.85302734375003],[-122.78876953125003,48.993017578125034],[-121.40722656249994,48.993017578125034],[-119.70170898437495,48.993017578125034],[-119.27534179687494,48.99306640625005],[-118.84892578124993,48.99306640625005],[-117.99619140625002,48.99306640625005],[-116.71704101562501,48.99306640625005],[-110.74765625,48.99306640625005],[-104.77832031249997,48.993115234374955],[-98.80898437499995,48.99316406249997],[-97.52983398437493,48.99316406249997],[-96.67705078124993,48.99316406249997],[-96.25068359374993,48.99316406249997],[-95.39790039062493,48.99316406249997],[-95.16206054687493,48.991748046875045],[-95.15527343749997,49.36967773437502],[-94.85434570312495,49.304589843749994],[-94.86040039062493,49.258593750000045],[-94.80346679687497,49.0029296875]]],[[[-176.28671874999998,51.79199218750006],[-176.34965820312502,51.733300781249994],[-176.41372070312502,51.840576171875],[-176.28671874999998,51.79199218750006]]],[[[-177.87905273437502,51.64970703125002],[-178.05888671875,51.67260742187497],[-177.98637695312493,51.76425781249998],[-178.16826171874996,51.90302734375001],[-177.644482421875,51.826269531250006],[-177.87905273437502,51.64970703125002]]],[[[-177.14819335937497,51.71674804687498],[-177.67021484375002,51.701074218749994],[-177.11005859375,51.92875976562502],[-177.14819335937497,51.71674804687498]]],[[[-176.593310546875,51.86669921875],[-176.45234374999995,51.735693359375034],[-176.96162109374998,51.60366210937505],[-176.69833984374998,51.986035156249955],[-176.593310546875,51.86669921875]]],[[[179.72773437500015,51.905419921874966],[179.50390625000003,51.97958984374998],[179.6271484375001,52.03041992187502],[179.72773437500015,51.905419921874966]]],[[[177.4154296875,51.88281249999997],[177.25029296875013,51.902929687500006],[177.6696289062501,52.10302734375],[177.4154296875,51.88281249999997]]],[[[-173.5533203125,52.13627929687502],[-173.02290039062504,52.07915039062502],[-173.83579101562498,52.048193359375006],[-173.99248046874993,52.12333984374996],[-173.5533203125,52.13627929687502]]],[[[-172.464794921875,52.27226562500002],[-172.61982421874998,52.27285156250005],[-172.47041015625,52.38803710937506],[-172.31362304687497,52.32958984375006],[-172.464794921875,52.27226562500002]]],[[[-174.67739257812502,52.035009765625006],[-175.29555664062502,52.022167968749955],[-174.30615234375,52.216162109375034],[-174.43554687499997,52.317236328125034],[-174.168896484375,52.42016601562503],[-174.04560546875,52.36723632812499],[-174.12065429687493,52.13520507812498],[-174.67739257812502,52.035009765625006]]],[[[173.72275390625018,52.35957031250004],[173.40234375000009,52.40478515625],[173.77607421875004,52.49511718750003],[173.72275390625018,52.35957031250004]]],[[[172.81181640625002,53.01298828125002],[173.43603515625003,52.85205078125],[172.93515625000012,52.752099609374966],[172.49482421875004,52.93789062499999],[172.81181640625002,53.01298828125002]]],[[[-167.96435546875003,53.345117187499994],[-169.088916015625,52.83203125],[-168.68984375000002,53.227246093749955],[-168.38041992187496,53.28344726562506],[-168.28769531249998,53.500146484374966],[-167.82807617187495,53.50795898437505],[-167.96435546875003,53.345117187499994]]],[[[-166.61533203124998,53.90092773437499],[-166.37231445312494,53.99897460937498],[-166.230859375,53.93261718750006],[-166.54560546875,53.726464843749966],[-166.354541015625,53.67353515625004],[-166.85097656249997,53.45288085937503],[-167.78085937500003,53.30024414062501],[-167.13608398437503,53.526464843750006],[-167.01572265625003,53.69838867187502],[-166.80898437500002,53.64614257812505],[-166.741259765625,53.71293945312496],[-167.10561523437497,53.813378906249994],[-167.03808593749997,53.9421875],[-166.67329101562498,54.00595703124998],[-166.61533203124998,53.90092773437499]]],[[[-165.841552734375,54.070654296875006],[-166.05664062500003,54.054345703124994],[-166.08774414062498,54.16914062500001],[-165.89287109375,54.20698242187498],[-165.69287109375,54.09990234375002],[-165.841552734375,54.070654296875006]]],[[[-165.56113281249998,54.13671874999997],[-165.55063476562498,54.28452148437498],[-165.40786132812502,54.19682617187496],[-165.56113281249998,54.13671874999997]]],[[[-162.29814453124993,54.847021484375006],[-162.43388671875,54.931542968749994],[-162.26459960937504,54.983496093750006],[-162.29814453124993,54.847021484375006]]],[[[-163.476025390625,54.98071289062497],[-163.37895507812496,54.81552734374998],[-163.083251953125,54.66899414062496],[-163.35810546874995,54.73569335937506],[-164.82343749999998,54.41909179687505],[-164.887646484375,54.60781250000002],[-164.47861328124998,54.906835937500006],[-163.80712890624997,55.04907226562503],[-163.476025390625,54.98071289062497]]],[[[-159.51513671875,55.15185546875003],[-159.617724609375,55.05732421875004],[-159.54506835937497,55.22597656250002],[-159.51513671875,55.15185546875003]]],[[[-131.33974609375002,55.079833984375],[-131.32954101562498,54.887744140625045],[-131.592236328125,55.02568359374999],[-131.5654296875,55.26411132812498],[-131.33974609375002,55.079833984375]]],[[[-159.87299804687495,55.128759765625034],[-160.22705078124997,54.92270507812506],[-160.17207031249995,55.123046875],[-159.88735351562497,55.27299804687502],[-159.87299804687495,55.128759765625034]]],[[[-132.86225585937504,54.894433593749966],[-132.61723632812493,54.892431640625006],[-132.70581054687497,54.684179687500034],[-133.42905273437498,55.30380859374998],[-133.097412109375,55.213720703125006],[-132.86225585937504,54.894433593749966]]],[[[-160.329296875,55.337695312500045],[-160.34331054687493,55.25878906250006],[-160.51748046875,55.33383789062506],[-160.329296875,55.337695312500045]]],[[[-160.68491210937498,55.314794921875006],[-160.552783203125,55.38076171875002],[-160.48754882812503,55.18486328124999],[-160.79506835937497,55.14521484375001],[-160.72392578124993,55.404638671875006],[-160.68491210937498,55.314794921875006]]],[[[-133.30507812500002,55.54375],[-133.6501953125,55.26928710937506],[-133.73710937500002,55.49692382812498],[-133.30507812500002,55.54375]]],[[[-155.56601562500003,55.82119140625005],[-155.73735351562493,55.82978515625001],[-155.59394531250004,55.92431640625],[-155.56601562500003,55.82119140625005]]],[[[-130.97915039062502,55.489160156249994],[-131.187890625,55.206298828125],[-131.44755859374996,55.40878906250006],[-131.7625,55.16582031250002],[-131.84609374999997,55.41625976562497],[-131.62495117187504,55.831689453124966],[-131.26923828125004,55.95537109375002],[-130.997802734375,55.727636718750006],[-130.97915039062502,55.489160156249994]]],[[[-133.56611328125,56.33920898437498],[-133.202978515625,56.31982421875003],[-133.096630859375,56.09003906250001],[-132.59760742187504,55.89501953125],[-132.17270507812498,55.48061523437502],[-132.51127929687493,55.59394531250001],[-132.63129882812495,55.47319335937502],[-132.41787109375002,55.48291015625006],[-132.20668945312497,55.22441406249996],[-131.97641601562498,55.208593750000034],[-132.06474609375002,54.713134765625],[-133.11855468750002,55.32763671875003],[-132.95888671875002,55.39555664062502],[-133.0333984375,55.589697265625034],[-133.68017578124994,55.78515625],[-133.24150390624993,55.920800781249994],[-133.371240234375,56.035888671875],[-133.74252929687498,55.96484375],[-133.530859375,56.145654296874966],[-133.56611328125,56.33920898437498]]],[[[-132.77988281249998,56.24726562499998],[-133.03500976562498,56.34091796875006],[-132.90205078124998,56.45375976562505],[-132.62910156249995,56.411914062500045],[-132.77988281249998,56.24726562499998]]],[[[-132.11235351562493,56.109375],[-132.13295898437497,55.94326171875005],[-132.28730468749995,55.92939453124998],[-132.65991210937503,56.07817382812499],[-132.379833984375,56.49877929687497],[-132.06689453125,56.24423828124998],[-132.11235351562493,56.109375]]],[[[-154.208642578125,56.51489257812497],[-154.32221679687504,56.570605468750045],[-154.11040039062496,56.602929687499966],[-154.208642578125,56.51489257812497]]],[[[-169.755224609375,56.63505859375002],[-169.47431640624998,56.59404296875002],[-169.6326171875,56.545703125000045],[-169.755224609375,56.63505859375002]]],[[[-132.746875,56.525683593750045],[-132.94804687500002,56.56723632812498],[-132.842529296875,56.79477539062506],[-132.56796875000003,56.57583007812505],[-132.746875,56.525683593750045]]],[[[-133.98959960937503,56.84497070312497],[-133.73837890625,56.65043945312496],[-133.94970703125,56.12773437499996],[-134.18959960937502,56.07695312500002],[-134.084375,56.456347656250045],[-134.37368164062502,56.838671875000045],[-134.14326171874998,56.93232421875001],[-133.98959960937503,56.84497070312497]]],[[[-133.36621093750006,57.003515625000034],[-132.99624023437497,56.93041992187497],[-132.95917968749998,56.67705078124996],[-133.03491210937494,56.62075195312505],[-133.32895507812498,56.83007812499997],[-133.158154296875,56.495166015625045],[-133.4841796875,56.45175781249998],[-133.979443359375,57.009570312500045],[-133.36621093750006,57.003515625000034]]],[[[-153.007080078125,57.12485351562498],[-153.37460937499998,57.05190429687505],[-153.285205078125,57.18505859375],[-152.90839843750004,57.152441406250006],[-153.007080078125,57.12485351562498]]],[[[-134.96977539062496,57.351416015625034],[-134.62070312499998,56.71831054687502],[-134.68188476562503,56.216162109375034],[-134.98056640625003,56.518945312499994],[-134.88344726562497,56.679052734375034],[-135.33061523437505,56.821875],[-135.19960937499997,57.02734375],[-135.45493164062503,57.24941406250005],[-135.81230468750002,57.00952148437503],[-135.82275390625,57.280419921874966],[-135.448681640625,57.534375],[-134.96977539062496,57.351416015625034]]],[[[-152.89804687499998,57.82392578125004],[-152.42875976562493,57.82568359375003],[-152.48261718749998,57.70332031249998],[-152.21621093749997,57.577001953125006],[-152.41220703125003,57.454785156249955],[-152.94077148437498,57.49809570312499],[-152.67905273437503,57.345117187499994],[-153.274365234375,57.22636718749996],[-153.732568359375,57.052343750000034],[-153.643310546875,56.960742187500045],[-154.02734375,56.77797851562502],[-153.793212890625,56.98950195312503],[-154.24375,57.143017578124955],[-154.33896484374998,56.9208984375],[-154.67319335937498,57.44609375],[-154.11616210937498,57.651220703125006],[-153.6876953125,57.30512695312504],[-153.841552734375,57.86284179687496],[-153.48793945312497,57.73095703125],[-153.21748046875004,57.79575195312506],[-153.16044921875,57.97197265624999],[-152.85039062499993,57.896777343750045],[-152.89804687499998,57.82392578125004]]],[[[-135.73037109375002,58.244238281250034],[-135.61323242187507,57.99184570312505],[-135.346630859375,58.12412109374998],[-134.9546875,58.01533203125004],[-134.97065429687495,57.817236328125006],[-135.33847656250003,57.768652343750034],[-134.97885742187503,57.724365234375],[-134.93149414062498,57.48115234375001],[-135.564208984375,57.66640625],[-135.691943359375,57.41992187500006],[-135.91079101562502,57.44658203124999],[-136.568603515625,57.97216796875003],[-136.32197265625,58.21889648437502],[-136.14375,58.098486328125006],[-136.09438476562502,58.198144531249966],[-135.73037109375002,58.244238281250034]]],[[[-134.68027343749998,58.16166992187499],[-134.24008789062498,58.143994140624955],[-133.82275390624997,57.62866210937503],[-134.29233398437498,58.044726562500074],[-133.91113281250003,57.3525390625],[-134.51601562499997,57.042578125],[-134.48676757812495,57.48203125],[-134.92348632812497,58.354638671874966],[-134.68027343749998,58.16166992187499]]],[[[-152.416943359375,58.360205078125034],[-151.974365234375,58.30986328124999],[-152.068896484375,58.17792968750001],[-152.26835937499993,58.25170898437506],[-152.30922851562502,58.133886718750034],[-152.5982421875,58.16259765625],[-152.92841796875004,57.99370117187499],[-153.38134765625003,58.08720703125002],[-152.976123046875,58.29702148437505],[-152.771875,58.278564453125],[-152.84111328125002,58.41640625000002],[-152.416943359375,58.360205078125034]]],[[[-152.486083984375,58.485009765624966],[-152.63662109375002,58.54169921874998],[-152.3955078125,58.619384765625],[-152.486083984375,58.485009765624966]]],[[[-160.918994140625,58.57709960937498],[-161.13149414062502,58.668212890625],[-160.71513671875005,58.79521484375002],[-160.918994140625,58.57709960937498]]],[[[-148.02177734375,60.06533203125005],[-148.271875,60.05327148437499],[-148.07958984375003,60.151660156250045],[-148.02177734375,60.06533203125005]]],[[[-147.735888671875,59.81323242187503],[-147.76806640625,59.94375],[-147.180859375,60.358251953125034],[-147.01987304687498,60.33222656249998],[-147.735888671875,59.81323242187503]]],[[[-166.13544921875,60.38354492187503],[-165.72968750000004,60.31420898437503],[-165.591796875,59.913134765625045],[-166.14873046874996,59.764111328124955],[-167.13886718749998,60.00854492187503],[-167.43642578125002,60.20664062500006],[-166.836328125,60.21699218750004],[-166.47568359374998,60.382763671874955],[-166.13544921875,60.38354492187503]]],[[[-146.3939453125,60.44965820312501],[-146.10224609374998,60.41118164062499],[-146.61831054687497,60.27368164062503],[-146.70253906249997,60.40854492187498],[-146.3939453125,60.44965820312501]]],[[[-147.658251953125,60.45048828124999],[-147.787841796875,60.17792968749998],[-147.89145507812498,60.299414062500034],[-147.658251953125,60.45048828124999]]],[[[-172.74223632812496,60.45737304687498],[-172.23208007812494,60.299121093750074],[-172.63574218750003,60.328857421875],[-173.04765625000002,60.56831054687501],[-172.74223632812496,60.45737304687498]]],[[[-171.46303710937494,63.640039062499994],[-171.03486328125,63.58549804687499],[-170.29936523437502,63.68061523437501],[-169.55454101562498,63.373486328124955],[-168.71601562500004,63.310595703125045],[-168.76132812500003,63.21376953125002],[-169.364697265625,63.17114257812506],[-169.67636718750003,62.95610351562502],[-169.81860351562494,63.122363281250045],[-170.84838867187494,63.44438476562502],[-171.63183593749997,63.351220703124966],[-171.74638671874993,63.703076171874955],[-171.46303710937494,63.640039062499994]]],[[[-141.00214843750004,68.77416992187506],[-141.00214843750004,67.89755859374998],[-141.00214843750004,66.43652343750006],[-141.00214843750004,65.55991210937498],[-141.00214843750004,64.09887695312506],[-141.00214843750004,63.22226562499998],[-141.00214843750004,61.761279296875045],[-141.00214843750004,60.884667968749994],[-141.00214843750004,60.30024414062504],[-140.76274414062505,60.259130859375006],[-140.525439453125,60.218359375000034],[-140.45283203125004,60.29970703125002],[-139.97329101562497,60.183154296875074],[-139.67631835937505,60.32832031249998],[-139.23476562499997,60.339746093749994],[-139.07924804687497,60.34370117187501],[-139.07924804687497,60.279443359374966],[-139.136962890625,60.17270507812498],[-139.18515624999998,60.083593750000034],[-138.86875,59.94575195312501],[-138.317626953125,59.611132812500074],[-137.59331054687493,59.22626953124998],[-137.52089843750002,58.91538085937498],[-137.43857421875003,58.903125],[-137.2775390625,58.988183593749994],[-137.126220703125,59.04096679687498],[-136.81328125000002,59.150048828124994],[-136.57875976562502,59.15224609375002],[-136.46635742187493,59.459082031250006],[-136.27797851562502,59.48032226562506],[-136.321826171875,59.604833984375034],[-135.70258789062504,59.72875976562506],[-135.36787109374998,59.743310546874994],[-135.051025390625,59.57866210937502],[-134.94375,59.28828125000001],[-134.67724609374997,59.19926757812499],[-134.39306640625,59.009179687499994],[-134.32963867187505,58.93969726562506],[-134.21850585937503,58.849902343750045],[-133.54638671874997,58.50346679687499],[-133.27529296875,58.22285156250004],[-133.00141601562495,57.948974609375],[-132.55048828125,57.499902343749994],[-132.44248046874998,57.40673828125003],[-132.30166015624997,57.27631835937501],[-132.232177734375,57.19853515624999],[-132.27939453124998,57.14536132812498],[-132.33798828124998,57.07944335937506],[-132.15703125,57.048193359375006],[-132.03154296875,57.02656250000004],[-132.062890625,56.95336914062503],[-132.104296875,56.856787109375006],[-131.86616210937495,56.792822265625006],[-131.82426757812496,56.589990234374994],[-131.471875,56.55673828125006],[-130.649072265625,56.26367187500003],[-130.47709960937496,56.230566406250034],[-130.413134765625,56.12250976562498],[-130.09785156249995,56.10927734375002],[-130.01406249999997,55.950537109375006],[-130.2140625,55.02587890625003],[-130.57534179687497,54.769677734374966],[-130.849609375,54.80761718750006],[-131.04785156249997,55.157666015624955],[-130.74819335937502,55.31801757812502],[-131.127685546875,55.96015625000001],[-131.032763671875,56.08808593749998],[-131.78417968749997,55.876562500000034],[-131.98339843749994,55.535009765625006],[-132.15541992187502,55.59956054687501],[-132.20751953124997,55.75341796875],[-131.84384765625003,56.16010742187498],[-131.55136718749998,56.206787109375],[-131.88789062500004,56.24165039062498],[-132.18203125000002,56.42065429687506],[-132.82460937500002,57.05581054687505],[-133.465869140625,57.17216796875002],[-133.64873046874993,57.64228515624998],[-133.11704101562498,57.56621093750002],[-133.535205078125,57.83295898437501],[-133.1943359375,57.87768554687506],[-133.559375,57.924462890624994],[-133.72231445312502,57.84423828125],[-134.03110351562498,58.072167968749966],[-133.87675781249996,58.51816406249998],[-134.20883789062503,58.232958984375045],[-134.77612304687506,58.45385742187503],[-135.36367187500002,59.41943359375],[-135.50234375000002,59.202294921874994],[-135.090234375,58.245849609375],[-135.57177734374994,58.41206054687504],[-135.89755859374998,58.40019531250002],[-136.04311523437497,58.82163085937498],[-135.82636718750004,58.89794921874997],[-136.0166015625,58.87397460937498],[-136.150048828125,59.04809570312503],[-136.22583007812497,58.765478515625006],[-136.98901367187503,59.03447265624999],[-137.05903320312498,58.87373046875001],[-136.613916015625,58.809277343749955],[-136.48374023437503,58.61767578125],[-136.224609375,58.602246093749955],[-136.06147460937495,58.45273437500006],[-136.607421875,58.24399414062498],[-137.54399414062502,58.58120117187502],[-138.51489257812503,59.16591796875005],[-139.77329101562498,59.52729492187504],[-139.51303710937498,59.698095703125006],[-139.5123046875,59.95356445312501],[-139.28671874999998,59.610937500000034],[-139.22080078125003,59.819873046875045],[-138.9880859375,59.83500976562502],[-139.43144531249996,60.012255859375074],[-140.41982421874997,59.71074218750002],[-141.40830078125,59.90278320312498],[-141.408740234375,60.11767578125006],[-141.67016601562497,59.969873046874966],[-142.94565429687503,60.09697265625002],[-144.14721679687494,60.01640625000002],[-144.185498046875,60.150732421875034],[-144.901318359375,60.335156249999955],[-144.69111328125,60.66909179687502],[-145.248291015625,60.38012695312506],[-145.898876953125,60.47817382812505],[-145.67490234374998,60.65112304687503],[-146.57045898437497,60.72915039062502],[-146.39199218749997,60.810839843750045],[-146.63842773437497,60.89731445312498],[-146.59912109374994,61.05351562500002],[-146.284912109375,61.11264648437498],[-147.89111328125,60.889892578125],[-148.00512695312494,60.96855468750002],[-147.75185546874997,61.218945312499955],[-148.34189453125,61.060400390625006],[-148.34443359374998,60.853564453125045],[-148.55615234374994,60.82700195312506],[-148.25673828124997,60.67529296874997],[-148.64013671875,60.48945312500004],[-148.11918945312502,60.57514648437498],[-147.96411132812494,60.48486328124997],[-148.430712890625,59.98911132812498],[-149.2666015625,59.99829101562497],[-149.395263671875,60.10576171875002],[-149.59804687500002,59.77045898437501],[-149.7138671875,59.91958007812502],[-149.80126953124994,59.737939453124966],[-150.00532226562507,59.78442382812503],[-150.19804687499996,59.56655273437505],[-150.60737304687504,59.56337890625002],[-150.934521484375,59.249121093750034],[-151.18276367187502,59.30078124999997],[-151.73818359375002,59.18852539062502],[-151.94951171875,59.26508789062498],[-151.88461914062503,59.386328125],[-151.39960937499995,59.51630859375001],[-151.04648437499998,59.771826171875034],[-151.45009765624997,59.65039062499997],[-151.85322265625,59.78208007812498],[-151.39599609375006,60.27446289062502],[-151.35644531249997,60.72294921874999],[-150.44125976562503,61.02358398437505],[-149.07509765624997,60.87641601562498],[-150.05327148437496,61.17109374999998],[-149.433544921875,61.50078125000002],[-149.97568359374998,61.27934570312502],[-150.61225585937495,61.301123046875006],[-151.59350585937494,60.979638671874966],[-152.54091796874997,60.265429687500045],[-153.025,60.29565429687497],[-152.660107421875,59.99721679687502],[-153.21123046875002,59.84272460937498],[-153.09360351562503,59.70913085937505],[-153.65253906250004,59.64702148437499],[-154.17832031250003,59.155566406250074],[-153.41826171875,58.9599609375],[-153.43759765625003,58.754833984374955],[-154.289013671875,58.30434570312502],[-154.247021484375,58.15942382812497],[-155.006884765625,58.01606445312501],[-155.77797851562497,57.56821289062498],[-156.43588867187498,57.359960937500006],[-156.62900390624998,57.00996093750001],[-158.41440429687498,56.435839843750045],[-158.5521484375,56.31269531249998],[-158.27563476562497,56.19624023437498],[-158.5046875,56.062109375],[-158.59116210937503,56.18452148437498],[-158.78984375000002,55.98691406250006],[-159.52324218749993,55.81000976562498],[-159.65966796875003,55.625927734374955],[-159.77138671874997,55.84111328125002],[-160.49931640625002,55.53730468750004],[-161.38193359374998,55.371289062499955],[-161.44379882812495,55.513281250000034],[-161.202099609375,55.54355468750006],[-161.51694335937503,55.61840820312503],[-162.073974609375,55.13930664062505],[-162.38637695312497,55.05234375],[-162.63037109375003,55.24667968749998],[-162.67436523437505,54.99658203125],[-162.86503906249996,54.954541015624955],[-163.11962890624997,55.06469726562503],[-163.131103515625,54.916552734375045],[-163.33530273437503,54.83916015624999],[-163.27880859374997,55.12182617187503],[-162.906591796875,55.19555664062503],[-161.69731445312502,55.9072265625],[-161.215625,56.02143554687498],[-160.8986328125,55.99365234375],[-161.00537109375,55.88715820312498],[-160.80283203125003,55.754443359375045],[-160.70634765625002,55.870458984375034],[-160.29169921875,55.80507812500005],[-160.53906250000006,56.00629882812501],[-160.30205078125,56.31411132812502],[-158.91801757812502,56.882177734375006],[-158.675146484375,56.79487304687498],[-158.66079101562502,57.03940429687498],[-158.32094726562497,57.29790039062499],[-157.84575195312496,57.52807617187497],[-157.4619140625,57.506201171875034],[-157.697216796875,57.679443359375],[-157.610888671875,58.050830078125074],[-157.19370117187498,58.19418945312506],[-157.48837890624998,58.25371093750002],[-157.52363281249998,58.421337890624955],[-156.97465820312496,58.736328125],[-156.80888671875005,59.13427734375],[-157.14204101562504,58.87763671875001],[-158.19091796875003,58.6142578125],[-158.50317382812494,58.85034179687497],[-158.42563476562498,58.99931640625002],[-158.080517578125,58.97744140625002],[-158.422802734375,59.08984375],[-158.67827148437502,58.92939453124998],[-158.80947265625002,58.973876953125],[-158.78862304687493,58.440966796875045],[-158.95068359375,58.404541015625],[-159.67026367187498,58.9111328125],[-159.92021484375,58.819873046875074],[-160.36313476562498,59.05117187500002],[-161.246826171875,58.799462890624994],[-161.36132812499994,58.66953124999998],[-162.144921875,58.64423828124998],[-161.724365234375,58.794287109375006],[-161.64438476562498,59.109667968750045],[-161.9810546875,59.14614257812502],[-161.82871093749998,59.588623046875],[-162.421337890625,60.28398437500002],[-161.96201171875003,60.695361328125045],[-162.68496093749997,60.268945312499966],[-162.57075195312495,59.98974609375],[-163.68037109374998,59.80151367187503],[-164.14282226562497,59.89677734374999],[-165.02651367187497,60.500634765624994],[-165.35380859375002,60.54121093750001],[-164.80517578125,60.89204101562498],[-164.31850585937497,60.77128906249999],[-164.37236328125002,60.59184570312502],[-163.999560546875,60.76606445312498],[-163.72998046874997,60.589990234374994],[-163.420947265625,60.757421875],[-163.90654296874996,60.85380859375002],[-163.58691406249994,60.902978515624994],[-163.74902343750003,60.9697265625],[-163.99462890624997,60.86469726562501],[-165.11484375,60.93281250000004],[-164.86899414062503,61.11176757812498],[-165.27978515624994,61.169628906249955],[-165.27363281250004,61.27485351562498],[-165.56586914062498,61.10234375000002],[-165.86396484375004,61.33569335937503],[-165.84531249999998,61.536230468750034],[-166.152734375,61.545947265625074],[-166.16811523437502,61.65083007812501],[-165.80893554687503,61.69609375000002],[-166.07880859375,61.803125],[-165.61279296875003,61.86928710937502],[-165.707275390625,62.10043945312506],[-165.19453125,62.47353515625002],[-164.75786132812493,62.496728515624966],[-164.589453125,62.709375],[-164.79267578125,62.623193359374966],[-164.79965820312503,62.918066406250006],[-164.384228515625,63.03046874999998],[-164.40903320312503,63.21503906250001],[-163.94287109375,63.247216796874994],[-163.61630859374998,63.125146484374994],[-163.73784179687496,63.016406250000045],[-163.504345703125,63.105859374999966],[-163.28784179687494,63.046435546875045],[-162.621484375,63.26582031249998],[-162.28281250000003,63.529199218749994],[-161.97397460937498,63.45292968749999],[-161.09970703125003,63.557910156250045],[-160.778564453125,63.818945312500034],[-160.987548828125,64.25126953125002],[-161.49072265625003,64.43378906249998],[-160.93193359374996,64.5791015625],[-160.855908203125,64.755615234375],[-161.13017578125005,64.92543945312505],[-161.759375,64.816259765625],[-162.80703124999997,64.37421875000001],[-163.20390625,64.65200195312502],[-163.14433593750002,64.423828125],[-163.71308593749998,64.588232421875],[-164.978759765625,64.45366210937502],[-166.1427734375,64.58276367187503],[-166.48139648437498,64.72807617187507],[-166.415234375,64.926513671875],[-166.92841796875,65.15708007812498],[-166.15703125,65.28583984375001],[-167.40400390625,65.42211914062497],[-168.08837890624997,65.65776367187502],[-166.39873046875002,66.14443359375005],[-165.62993164062496,66.131201171875],[-165.77617187500002,66.31904296875001],[-164.46049804687502,66.58842773437499],[-163.63823242187502,66.57465820312504],[-163.89394531249997,66.57587890625001],[-164.03374023437493,66.21552734374995],[-163.69536132812502,66.08383789062503],[-161.93369140625003,66.04287109374997],[-161.45541992187503,66.28139648437497],[-161.03427734375003,66.18881835937503],[-161.12031249999995,66.334326171875],[-161.91689453124997,66.41181640624998],[-162.54365234375004,66.80512695312501],[-162.36162109375,66.94731445312502],[-161.591015625,66.45952148437502],[-160.23168945312503,66.420263671875],[-160.360888671875,66.6125],[-160.864013671875,66.67084960937501],[-161.39804687499998,66.55185546875],[-161.85668945312497,66.70034179687497],[-161.719921875,67.02055664062502],[-163.5318359375,67.10258789062502],[-164.1251953125,67.60673828125007],[-166.786279296875,68.35961914062497],[-166.38051757812502,68.425146484375],[-166.20908203125,68.88535156250003],[-165.04394531249994,68.882470703125],[-163.867919921875,69.03666992187505],[-161.88095703125003,70.33173828125001],[-162.073876953125,70.16196289062498],[-160.9962890625,70.30458984375],[-160.11713867187495,70.59121093750002],[-159.86567382812498,70.27885742187499],[-159.81499023437496,70.49707031250003],[-159.38676757812493,70.52451171875003],[-160.081591796875,70.63486328125003],[-159.680908203125,70.786767578125],[-159.31450195312496,70.87851562500003],[-159.251171875,70.7484375],[-157.909375,70.860107421875],[-156.47021484374994,71.40766601562501],[-156.469970703125,71.29155273437507],[-155.57944335937503,71.12109374999997],[-156.14658203125,70.92783203125003],[-155.97353515625002,70.84199218749995],[-155.16684570312498,71.09921875000006],[-154.19521484375002,70.80112304687498],[-153.23291015625,70.93256835937504],[-152.49121093749994,70.88095703125],[-152.23291015625,70.81035156249999],[-152.39921875,70.62045898437503],[-151.76904296875,70.56015625],[-151.94467773437498,70.45209960937501],[-149.26943359374997,70.50078124999999],[-147.70537109375,70.21723632812495],[-145.82314453124997,70.16005859375002],[-145.19736328125003,70.00869140625002],[-143.218310546875,70.11625976562499],[-142.70786132812498,70.03378906249998],[-141.40791015625,69.65336914062502],[-141.00214843750004,69.65078125000002],[-141.00214843750004,68.77416992187506]]]]},"properties":{"name":"United States","childNum":76}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[71.20615234375006,39.892578125],[71.15625,39.88344726562502],[71.06425781250002,39.88491210937505],[71.01171874999997,39.895117187500006],[71.04365234375004,39.97631835937503],[71.04482421875005,39.992529296875034],[70.96064453125004,40.087988281250034],[71.00546875,40.15229492187498],[71.0241210937501,40.14916992187497],[71.08037109375007,40.07988281249999],[71.2287109375001,40.04814453124999],[71.20615234375006,39.892578125]]],[[[70.94677734374997,42.24868164062505],[70.97900390625003,42.26655273437504],[71.03603515625,42.28466796875],[71.12998046875006,42.25],[71.21269531250002,42.20644531250005],[71.23232421875005,42.18627929687503],[71.22851562499997,42.16289062499996],[70.18095703125007,41.571435546874994],[70.734375,41.400537109374994],[70.86044921875006,41.22490234375002],[71.11074218750005,41.152636718750045],[71.29882812500003,41.152490234374994],[71.39306640625003,41.123388671875034],[71.40839843750004,41.13603515625002],[71.42089843750003,41.341894531250034],[71.60625,41.367431640625],[71.66494140625,41.54121093749998],[71.70068359374997,41.454003906249966],[71.75771484375005,41.42802734375002],[71.79248046875003,41.41313476562499],[71.85800781250006,41.311376953125034],[71.8786132812501,41.195019531249955],[71.95849609375003,41.18706054687502],[72.05244140625004,41.16474609375001],[72.1154296875001,41.18657226562502],[72.1642578125001,41.173730468749966],[72.18095703125002,41.11845703124999],[72.18730468750002,41.02592773437499],[72.2130859375001,41.014257812500006],[72.36406250000002,41.04345703125],[72.65830078125,40.86992187499999],[73.13212890625002,40.82851562499999],[72.6041015625,40.52543945312499],[72.40205078125004,40.578076171874955],[72.3892578125,40.427392578124994],[72.13125,40.438623046874966],[71.69248046875,40.15234375],[71.30468749999997,40.28691406249996],[70.990625,40.2548828125],[70.95800781250003,40.238867187500034],[70.653125,40.201171875],[70.37158203125003,40.38413085937506],[70.75107421875006,40.721777343750006],[70.40195312500006,41.03510742187498],[69.71289062500003,40.65698242187503],[69.35722656250002,40.76738281249996],[69.20625,40.566552734374994],[69.27490234374997,40.19809570312498],[68.63066406250007,40.16708984374998],[68.9720703125,40.08994140624998],[68.80468750000003,40.05034179687499],[68.86875,39.90747070312503],[68.63896484375007,39.8388671875],[68.46328125,39.53671874999998],[67.71904296875007,39.62138671875002],[67.426171875,39.46557617187497],[67.3576171875001,39.216699218749994],[67.64833984375005,39.13105468750004],[67.69443359375006,38.99462890625003],[68.13251953125004,38.927636718749966],[68.08720703125002,38.47353515625002],[68.3502929687501,38.211035156250006],[67.81435546875005,37.48701171875004],[67.7980468750001,37.244970703125006],[67.75898437500004,37.172216796875034],[67.75292968749997,37.199804687500034],[67.7,37.227246093749955],[67.60742187499997,37.22250976562506],[67.5172851562501,37.26665039062499],[67.44169921875007,37.25800781250001],[67.3197265625,37.209570312500006],[67.1955078125001,37.23520507812498],[67.06884765624997,37.334814453125006],[66.82773437500006,37.37128906249998],[66.52226562500007,37.34848632812506],[66.51064453125,37.45869140625004],[66.51132812500006,37.59916992187496],[66.52558593750004,37.785742187500034],[66.60625,37.98671875000005],[65.97119140624997,38.244238281250006],[65.612890625,38.23857421875002],[64.3099609375,38.97729492187497],[63.76367187500003,39.16054687499999],[62.48320312500002,39.97563476562496],[61.90283203124997,41.09370117187501],[61.496972656249994,41.276074218749955],[61.2423828125001,41.18920898437503],[60.454980468749994,41.221630859374955],[60.089648437500074,41.39941406250003],[60.07558593750005,41.759667968749966],[60.20078125000006,41.803125],[59.94179687499999,41.97353515625002],[59.98515625000002,42.21171875],[59.35429687500002,42.32329101562496],[58.5890625000001,42.778466796874966],[58.477148437500006,42.66284179687503],[58.15156250000004,42.628076171874966],[58.474414062500074,42.29936523437496],[58.02890625,42.48764648437506],[57.814257812500074,42.18984375000005],[57.290625,42.123779296875],[56.96406250000004,41.856542968750006],[57.11884765625004,41.35029296874998],[57.01796875,41.26347656249996],[55.97744140625005,41.32221679687504],[55.97568359375006,44.99492187499996],[58.555273437500006,45.55537109375001],[61.007910156250006,44.39379882812497],[61.99023437500003,43.492138671874955],[63.20703125000003,43.62797851562502],[64.44316406250007,43.55117187499999],[64.9054687500001,43.714697265625006],[65.49619140625,43.310546875],[65.80302734375002,42.87695312500006],[66.1002929687501,42.99082031249998],[66.00957031250007,42.00488281250003],[66.49863281250006,41.99487304687503],[66.70966796875004,41.17915039062501],[67.9357421875001,41.19658203125002],[68.11308593750007,41.02861328124999],[68.04765625000007,40.80927734374998],[68.29189453125,40.656103515625034],[68.57265625,40.62265624999998],[68.58408203125,40.876269531250045],[69.15361328125002,41.42524414062498],[70.94677734374997,42.24868164062505]]]]},"properties":{"name":"Uzbekistan","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[-61.17451171875001,13.158105468749966],[-61.268457031249966,13.287695312499991],[-61.13896484374996,13.358740234374991],[-61.17451171875001,13.158105468749966]]]},"properties":{"name":"St. Vin. and Gren.","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-60.99790039062498,8.867333984374966],[-61.069189453125034,8.947314453125003],[-60.91582031249996,9.070312500000014],[-60.86142578124998,8.949609375000037],[-60.99790039062498,8.867333984374966]]],[[[-60.821191406249966,9.138378906250026],[-60.94140625000003,9.105566406250006],[-60.73583984374997,9.203320312500026],[-60.821191406249966,9.138378906250026]]],[[[-63.84936523437494,11.131005859374994],[-63.917626953124994,10.887548828125048],[-64.40234375,10.981591796875023],[-64.21367187500002,11.086132812499997],[-64.0283203125,11.00185546874998],[-63.84936523437494,11.131005859374994]]],[[[-60.742138671874926,5.202050781250037],[-60.71196289062499,5.191552734375023],[-60.671972656250034,5.164355468749989],[-60.603857421875006,4.94936523437498],[-61.00283203125002,4.535253906249991],[-61.28007812500002,4.516894531249974],[-61.82084960937496,4.197021484375],[-62.153125,4.098388671874986],[-62.41064453124994,4.156738281249972],[-62.71210937499998,4.01791992187502],[-62.85698242187502,3.593457031249969],[-63.33867187500002,3.943896484375045],[-64.02148437500003,3.929101562500051],[-64.19248046874995,4.126855468750009],[-64.57636718750001,4.139892578125],[-64.788671875,4.276025390625023],[-64.66899414062496,4.01181640625002],[-64.22109375000002,3.587402343749972],[-64.04658203124998,2.502392578124997],[-63.389257812500006,2.411914062500045],[-63.43251953124994,2.155566406250045],[-64.00849609374995,1.931591796874969],[-64.20502929687493,1.52949218750004],[-65.10375976562497,1.108105468749983],[-65.47338867187497,0.691259765624977],[-65.55605468750002,0.687988281250014],[-65.52299804687493,0.843408203124966],[-65.68144531249999,0.983447265624989],[-66.06005859375003,0.78535156250004],[-66.34711914062498,0.7671875],[-66.87602539062499,1.223046875000037],[-67.21083984375,2.390136718750043],[-67.61870117187496,2.793603515624994],[-67.85908203124998,2.793603515624994],[-67.3111328125,3.41586914062502],[-67.66162109375,3.864257812499986],[-67.85527343750002,4.506884765624989],[-67.82490234374995,5.270458984375026],[-67.47387695312503,5.929980468750003],[-67.48198242187499,6.18027343750002],[-67.85917968749999,6.289892578124963],[-68.47177734375,6.156542968749974],[-69.42714843749997,6.123974609374997],[-70.12919921874999,6.95361328125],[-70.73715820312503,7.090039062499997],[-71.12861328124993,6.98671875],[-72.00664062499993,7.032617187500023],[-72.20771484374995,7.37026367187498],[-72.47197265624996,7.524267578124991],[-72.39033203124995,8.287060546874969],[-72.66542968749994,8.62758789062498],[-72.79638671874997,9.10898437499999],[-73.05839843749999,9.259570312500031],[-73.36621093749997,9.194140625000017],[-73.00654296874998,9.789160156250006],[-72.86933593750001,10.49125976562496],[-72.690087890625,10.835839843749994],[-72.24848632812501,11.196435546875009],[-71.95810546875,11.66640625],[-71.31972656249997,11.861914062500048],[-71.95693359375002,11.569921874999977],[-71.835107421875,11.190332031250009],[-71.6416015625,11.013525390625048],[-71.73090820312498,10.994677734375017],[-71.59433593749995,10.657373046875051],[-72.11284179687499,9.815576171874966],[-71.61953124999994,9.047949218749991],[-71.24140625000001,9.160449218750003],[-71.08583984375002,9.348242187499977],[-71.05268554687501,9.705810546874986],[-71.49423828125,10.533203124999972],[-71.46953124999993,10.964160156250017],[-70.23251953124998,11.372998046874997],[-70.09711914062493,11.519775390624972],[-69.80478515624998,11.47421875000002],[-69.81733398437495,11.672070312499997],[-70.19257812499993,11.62460937500002],[-70.28652343749997,11.886035156249989],[-70.20278320312497,12.098388671874986],[-70.00395507812496,12.177880859375023],[-69.63159179687494,11.479931640625026],[-68.827978515625,11.431738281249977],[-68.39863281249995,11.160986328124977],[-68.29628906249997,10.689355468749994],[-68.13994140624999,10.492724609374989],[-66.24721679687497,10.632226562499994],[-65.85175781249995,10.257763671874997],[-65.12910156249998,10.070068359375043],[-64.85048828125,10.098095703124969],[-64.188330078125,10.457812499999989],[-63.73188476562501,10.503417968750043],[-64.24750976562498,10.54257812500002],[-64.298193359375,10.635156249999966],[-61.879492187500006,10.741015625000031],[-62.379980468750006,10.546875],[-62.91357421875,10.531494140624986],[-62.68583984374996,10.289794921875043],[-62.740576171875006,10.056152343750043],[-62.55034179687499,10.200439453125043],[-62.320410156250034,9.783056640625006],[-62.22114257812498,9.882568359375028],[-62.15336914062493,9.821777343749986],[-62.15532226562499,9.979248046875014],[-62.077099609374926,9.97504882812504],[-61.73593749999998,9.631201171874977],[-61.76591796874996,9.813818359374963],[-61.58886718749994,9.894531249999986],[-60.79248046874997,9.360742187500037],[-61.02314453124998,9.15458984374996],[-61.24726562499998,8.600341796875014],[-61.61870117187499,8.59746093749996],[-61.30400390624999,8.410400390625043],[-60.800976562499926,8.592138671875034],[-60.16748046875,8.616992187500031],[-60.01752929687501,8.549316406250014],[-59.83164062499998,8.305957031250003],[-59.84907226562498,8.248681640624966],[-59.96484375000003,8.191601562499969],[-59.99072265624997,8.16201171874998],[-60.032421874999926,8.053564453125006],[-60.51362304687501,7.813183593749969],[-60.71865234374994,7.535937499999974],[-60.606542968750006,7.320849609375031],[-60.63330078124997,7.211083984374966],[-60.58320312499998,7.156201171874969],[-60.523193359375,7.143701171875009],[-60.464941406250034,7.166552734375045],[-60.39238281249999,7.164550781249986],[-60.34506835937495,7.15],[-60.32548828124996,7.133984374999983],[-60.32207031249996,7.092041015625043],[-60.35209960937496,7.002880859374997],[-60.39501953125,6.945361328125003],[-60.717919921874966,6.768310546875],[-61.14560546874998,6.694531249999983],[-61.20361328124997,6.588378906250028],[-61.181591796874926,6.513378906250026],[-61.15102539062502,6.446533203124986],[-61.15229492187501,6.385107421875006],[-61.12871093749999,6.214306640625026],[-61.15947265624996,6.174414062499977],[-61.22495117187498,6.129199218750003],[-61.303125,6.049511718750026],[-61.39082031250001,5.938769531250017],[-61.376806640625006,5.906982421875028],[-61.167187499999926,5.674218750000037],[-60.95400390625002,5.437402343750023],[-60.742138671874926,5.202050781250037]]]]},"properties":{"name":"Venezuela","childNum":4}},{"geometry":{"type":"Polygon","coordinates":[[[-64.765625,17.794335937499994],[-64.58046874999994,17.750195312499983],[-64.88911132812495,17.701708984375045],[-64.765625,17.794335937499994]]]},"properties":{"name":"U.S. Virgin Is.","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[104.06396484375003,10.390820312500011],[104.01845703125,10.029199218749966],[103.84951171875005,10.371093749999986],[104.06396484375003,10.390820312500011]]],[[[107.52128906250007,20.926611328124977],[107.39921875000007,20.903466796874966],[107.55126953125003,21.034033203125006],[107.52128906250007,20.926611328124977]]],[[[107.60273437500004,21.21679687500003],[107.40351562500004,21.093652343749994],[107.47626953125004,21.268945312499994],[107.60273437500004,21.21679687500003]]],[[[107.97265624999997,21.507958984375023],[107.40996093750002,21.284814453125023],[107.35429687500007,21.055175781250057],[107.1647460937501,20.94873046875003],[106.68339843750007,21.000292968750074],[106.75341796875003,20.73505859375004],[106.55078124999997,20.52656250000001],[106.57285156250012,20.392187499999977],[105.98408203125004,19.939062500000034],[105.62177734375004,18.96630859375003],[105.88828125000006,18.502490234375045],[106.49902343749997,17.946435546874994],[106.47890625000005,17.719580078125063],[106.3705078125,17.746875],[107.83378906250002,16.322460937499983],[108.02939453125012,16.331103515625074],[108.82128906249997,15.377929687500028],[109.30332031250012,13.856445312500043],[109.271875,13.279345703124974],[109.42392578125006,12.955957031249994],[109.44492187500006,12.599609375000057],[109.33554687500012,12.751904296874997],[109.21894531250004,12.64580078124996],[109.30468750000003,12.391162109375045],[109.20683593750007,12.415380859375006],[109.1986328125,11.724853515625014],[109.03964843750012,11.592675781249994],[108.98671875,11.336376953124997],[108.09492187500004,10.897265624999989],[108.0013671875,10.720361328125009],[107.26152343750007,10.39838867187504],[107.00664062500002,10.66054687499998],[106.94746093750004,10.400341796874997],[106.72734375000007,10.535644531250028],[106.605859375,10.46494140625002],[106.74121093750003,10.444384765625003],[106.75742187500006,10.295800781250023],[106.46406250000004,10.298291015624997],[106.78525390625012,10.116455078124986],[106.59560546875005,9.859863281250028],[106.1364257812501,10.221679687500014],[106.56435546875005,9.715625],[106.48408203125004,9.559423828125006],[105.83095703125005,10.000732421875028],[106.15859375,9.59414062499998],[106.16835937500005,9.396728515625],[105.50097656249997,9.093212890624983],[105.11435546875006,8.629199218750031],[104.77041015625,8.59765625],[104.89628906250007,8.746630859374974],[104.81855468750004,8.801855468750034],[104.84521484375003,9.606152343750026],[105.08447265625003,9.99570312499999],[104.8019531250001,10.202734374999977],[104.66347656250005,10.169921875000043],[104.42636718750006,10.411230468749991],[104.85058593749997,10.534472656249974],[105.04638671874997,10.701660156250014],[105.04570312500002,10.911376953125014],[105.3146484375001,10.845166015625026],[105.40576171875003,10.95161132812504],[105.75507812500004,10.989990234375043],[105.85332031250007,10.86357421874996],[106.16396484375005,10.794921875],[106.16093750000002,11.037109375000057],[105.85605468750006,11.294287109375048],[105.85146484375005,11.635009765625],[106.0060546875001,11.758007812500011],[106.39921875000007,11.687011718750028],[106.41386718750002,11.9484375],[106.70009765625,11.979296874999974],[107.21210937500004,12.30400390624996],[107.39335937500002,12.260498046874972],[107.50644531250006,12.364550781250031],[107.47539062500002,13.030371093749963],[107.60546874999997,13.437792968750017],[107.3314453125,14.126611328125009],[107.51943359375005,14.705078125],[107.51376953125012,14.817382812500057],[107.52451171875012,14.871826171875043],[107.50468750000007,14.915917968749966],[107.48037109375,14.979882812500037],[107.55527343750006,15.057031250000023],[107.58964843750002,15.118457031250017],[107.63369140625005,15.18984375],[107.653125,15.255224609374991],[107.62167968750006,15.309863281250017],[107.56425781250002,15.391601562499972],[107.45957031250012,15.4658203125],[107.33876953125,15.560498046875011],[107.27939453125006,15.618701171875045],[107.16591796875005,15.802490234375028],[107.1888671875,15.838623046875],[107.36064453125002,15.921728515624977],[107.3919921875,15.951660156250028],[107.39638671875,16.04301757812499],[106.93066406249997,16.353125],[106.8927734375001,16.396533203125074],[106.85107421875003,16.515625],[106.83242187500005,16.526269531250023],[106.79160156250006,16.490332031250006],[106.73955078125007,16.452539062500023],[106.6564453125001,16.49262695312501],[106.54619140625002,16.650732421874977],[106.53369140625003,16.821044921875057],[106.52597656250006,16.876611328124994],[106.50224609375002,16.95410156249997],[106.26953125000003,17.21679687500003],[106.00625,17.415283203125057],[105.69140625000003,17.737841796875045],[105.58847656250012,17.983691406250045],[105.51855468749997,18.077441406250045],[105.45820312500004,18.15429687499997],[105.11455078125002,18.40527343750003],[105.08701171875006,18.496240234374994],[105.14541015625,18.616796875000063],[105.14648437500003,18.650976562500006],[103.89160156250003,19.304980468750017],[103.89638671875,19.339990234375023],[103.93203125,19.366064453125006],[104.0275390625001,19.42045898437499],[104.062890625,19.48256835937505],[104.05156250000007,19.564160156249955],[104.01347656250007,19.64648437500003],[104.03203125000002,19.675146484375006],[104.06279296875007,19.678417968749983],[104.25986328125006,19.685498046874983],[104.5462890625,19.61054687500001],[104.58789062500003,19.61875],[104.74316406250003,19.754736328124977],[104.80175781249997,19.83613281250004],[104.81513671875004,19.90400390625001],[104.9279296875001,20.01811523437499],[104.92919921875003,20.082812500000017],[104.88867187500003,20.169091796875023],[104.84785156250004,20.202441406250045],[104.69873046875003,20.20532226562503],[104.67695312500004,20.224707031249977],[104.66191406250007,20.28901367187501],[104.65644531250004,20.32851562499999],[104.6188476562501,20.37451171875003],[104.49619140625006,20.413671875],[104.39218750000012,20.424755859374955],[104.36777343750012,20.44140624999997],[104.40781250000012,20.48574218750005],[104.47861328125006,20.529589843750017],[104.53271484374997,20.55488281250001],[104.58320312500004,20.646679687499955],[104.34960937499997,20.821093750000074],[104.19531249999997,20.913964843749966],[104.10136718750002,20.94550781250001],[103.63505859375007,20.697070312500017],[103.46357421875004,20.779833984375017],[103.21074218750002,20.840625],[103.10449218749997,20.891650390625045],[102.88378906250003,21.202587890624983],[102.85117187500006,21.26591796874999],[102.94960937500005,21.681347656249983],[102.84521484374997,21.73476562500005],[102.81591796874997,21.807373046875],[102.7982421875,21.797949218750034],[102.77109375000006,21.709667968749983],[102.73857421875002,21.67792968750001],[102.66201171875005,21.67602539062497],[102.58251953125003,21.90429687500003],[102.12744140624997,22.379199218750045],[102.1759765625001,22.414648437500006],[102.2370117187501,22.466015624999983],[102.40644531250004,22.70800781249997],[102.47089843750004,22.75092773437501],[102.98193359374997,22.4482421875],[103.32666015625003,22.769775390625057],[103.49296875000007,22.587988281250034],[103.62021484375006,22.782031250000045],[103.94150390625006,22.540087890625045],[104.14306640624997,22.800146484375006],[104.37177734375004,22.704052734374983],[104.68730468750002,22.822216796874983],[104.86474609375003,23.136376953125023],[105.27539062500003,23.34521484375003],[105.8429687500001,22.922802734374955],[106.14843749999997,22.970068359375006],[106.2790039062501,22.857470703125045],[106.54179687500007,22.908349609375023],[106.78027343749997,22.778906250000034],[106.55039062500006,22.501367187499994],[106.66357421875003,21.97890625000005],[106.97099609375002,21.923925781250034],[107.35117187500012,21.60888671874997],[107.75927734374997,21.655029296875057],[107.97265624999997,21.507958984375023]]]]},"properties":{"name":"Vietnam","childNum":4}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[169.49130859375006,-19.54013671875002],[169.34726562500006,-19.623535156249957],[169.2174804687501,-19.476367187500003],[169.24746093750005,-19.3447265625],[169.49130859375006,-19.54013671875002]]],[[[169.334375,-18.940234375000017],[168.98691406250006,-18.87128906250001],[169.01582031250004,-18.64375],[169.14384765625002,-18.63105468750001],[169.334375,-18.940234375000017]]],[[[168.44580078124997,-17.54218750000004],[168.58496093750003,-17.695898437500006],[168.52460937500004,-17.798046875000026],[168.15820312500003,-17.710546874999963],[168.2731445312501,-17.552246093749957],[168.44580078124997,-17.54218750000004]]],[[[168.44677734375003,-16.778808593749957],[168.18144531250002,-16.804003906250017],[168.13535156250006,-16.636914062499997],[168.44677734375003,-16.778808593749957]]],[[[168.29667968750007,-16.33652343749999],[167.92900390625002,-16.22871093749997],[168.16386718750002,-16.081640625000034],[168.29667968750007,-16.33652343749999]]],[[[167.4125,-16.095898437499997],[167.83662109375004,-16.449707031249957],[167.44931640625012,-16.554980468750003],[167.34921875000006,-16.15449218750004],[167.15146484375006,-16.080468749999966],[167.19951171875002,-15.885058593750031],[167.33574218750007,-15.916699218749997],[167.4125,-16.095898437499997]]],[[[167.9113281250001,-15.435937500000023],[167.67421875,-15.4515625],[168.00253906250012,-15.283203124999986],[167.9113281250001,-15.435937500000023]]],[[[166.74580078125004,-14.826855468750011],[166.81015625000012,-15.15742187500004],[167.0755859375,-14.935644531249977],[167.20078125000012,-15.443066406249969],[167.0939453125001,-15.580859374999974],[166.75830078125003,-15.631152343750003],[166.63105468750004,-15.406054687499974],[166.56738281250003,-14.641796874999969],[166.74580078125004,-14.826855468750011]]],[[[167.58486328125,-14.260937500000011],[167.43027343750012,-14.294921875],[167.41074218750006,-14.19746093750004],[167.50644531250012,-14.142187499999977],[167.58486328125,-14.260937500000011]]],[[[167.48886718750006,-13.907226562499972],[167.3917968750001,-13.788378906250017],[167.48105468750006,-13.709472656250014],[167.48886718750006,-13.907226562499972]]]]},"properties":{"name":"Vanuatu","childNum":10}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-171.4541015625,-14.04648437500002],[-171.9119140625,-14.001660156250026],[-172.04589843750003,-13.857128906249983],[-171.60390624999997,-13.879199218750045],[-171.4541015625,-14.04648437500002]]],[[[-172.33349609375,-13.46523437499999],[-172.17685546874998,-13.68466796875002],[-172.224951171875,-13.804296874999963],[-172.535693359375,-13.791699218749983],[-172.77851562499998,-13.516796875000011],[-172.33349609375,-13.46523437499999]]]]},"properties":{"name":"Samoa","childNum":2}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[53.76318359374997,12.636816406249991],[54.18740234375005,12.664013671875026],[54.511132812499994,12.552783203125017],[54.12949218750006,12.360644531250045],[53.71884765625006,12.318994140624994],[53.31582031250005,12.533154296875011],[53.53496093750002,12.715771484374997],[53.76318359374997,12.636816406249991]]],[[[42.75585937500003,13.70429687500004],[42.689746093750074,13.673632812500017],[42.7941406250001,13.766113281250028],[42.75585937500003,13.70429687500004]]],[[[42.787402343750074,13.971484375000031],[42.69404296875004,14.007910156249991],[42.76210937500005,14.067480468750048],[42.787402343750074,13.971484375000031]]],[[[53.08564453125004,16.648388671874955],[52.327734375,16.293554687500063],[52.17402343750004,15.956835937500017],[52.2174804687501,15.655517578125],[51.3224609375001,15.22626953125004],[49.34990234375002,14.637792968749977],[48.66835937499999,14.050146484374977],[47.9899414062501,14.048095703125],[47.40771484374997,13.661621093750057],[46.78886718750002,13.465576171874986],[45.65732421875006,13.338720703124991],[45.03867187500006,12.815869140624969],[44.617773437500006,12.817236328124977],[44.00585937499997,12.607666015625],[43.634375,12.744482421874991],[43.487597656250074,12.69882812500002],[43.23193359375003,13.267089843750057],[43.2824218750001,13.692529296875037],[43.08906250000004,14.010986328125],[42.93642578125005,14.938574218749963],[42.85566406250004,15.132958984375037],[42.65781250000006,15.232812500000051],[42.79902343750004,15.326269531249991],[42.71718750000005,15.654638671875006],[42.83964843750002,16.032031250000074],[42.79931640624997,16.37177734375001],[43.16503906249997,16.689404296874955],[43.19091796875003,17.359375],[43.41796875000003,17.516259765625023],[43.91699218749997,17.32470703124997],[45.14804687500006,17.427441406249955],[45.5353515625001,17.30205078124999],[46.72763671875006,17.26557617187501],[46.97568359375006,16.953466796875034],[47.14355468749997,16.946679687499966],[47.44179687499999,17.111865234375045],[47.57958984374997,17.448339843750034],[48.17216796875002,18.156933593749983],[49.04199218750003,18.58178710937503],[51.977636718750006,18.996142578125074],[53.08564453125004,16.648388671874955]]]]},"properties":{"name":"Yemen","childNum":4}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[37.85693359375003,-46.94423828124998],[37.5900390625001,-46.90800781250006],[37.78955078124997,-46.8375],[37.85693359375003,-46.94423828124998]]],[[[31.799609375000017,-23.8921875],[31.98583984374997,-24.460644531249983],[31.921679687500017,-25.96875],[31.335156250000097,-25.755566406249997],[31.207324218750074,-25.843359375000034],[31.08808593750004,-25.980664062500026],[30.803320312500006,-26.41347656250001],[30.806738281250006,-26.78525390624999],[30.88330078124997,-26.792382812500023],[30.938085937500006,-26.91582031250003],[31.06337890625005,-27.1123046875],[31.274023437500063,-27.23837890625002],[31.469531250000017,-27.29550781250002],[31.74257812500005,-27.309960937500037],[31.95839843750005,-27.305859375],[31.946093750000017,-27.173632812499974],[31.96718750000005,-26.96064453125001],[31.994726562500006,-26.817480468749977],[32.024804687499994,-26.81113281250002],[32.112890625,-26.83945312500002],[32.19960937499999,-26.833496093749957],[32.35351562499997,-26.861621093750003],[32.7765625000001,-26.850976562499966],[32.88613281250005,-26.849316406249983],[32.53476562500006,-28.19970703125003],[32.285742187500006,-28.62148437499998],[31.335156250000097,-29.378125],[29.97119140625003,-31.322070312500017],[28.449414062500068,-32.62460937499999],[27.077441406250074,-33.52119140625004],[26.429492187500045,-33.75957031250002],[25.80585937500001,-33.737109374999974],[25.574218750000057,-34.03535156249998],[25.00292968750003,-33.97363281250003],[24.8271484375,-34.16894531250003],[24.595507812500074,-34.17451171875],[23.697851562500063,-33.99277343750002],[23.268164062500006,-34.08115234374999],[22.553808593750063,-34.01005859374999],[22.24550781250005,-34.06914062500003],[21.788964843750023,-34.37265624999996],[20.529882812500034,-34.4630859375],[20.020605468750006,-34.785742187500006],[19.298242187500023,-34.61503906249996],[19.330761718750068,-34.49238281250001],[19.098339843750068,-34.350097656249986],[18.831347656250017,-34.36406249999999],[18.75214843750004,-34.08261718750002],[18.50039062499999,-34.10927734375004],[18.46162109375001,-34.346875],[18.35205078124997,-34.1884765625],[18.43300781250005,-33.71728515625003],[17.851074218750057,-32.82744140625002],[17.96523437500005,-32.70859374999996],[18.125,-32.74912109374996],[18.325292968750034,-32.50498046874996],[18.21083984375008,-31.74248046874996],[17.34707031250005,-30.44482421875],[16.95,-29.40341796875002],[16.739453124999983,-29.009375],[16.447558593750045,-28.61757812499998],[16.755761718750023,-28.45214843750003],[16.7875,-28.39472656249997],[16.81015625,-28.264550781249994],[16.841210937500023,-28.21894531250004],[16.875292968750045,-28.12792968749997],[16.93330078125004,-28.06962890624999],[17.05625,-28.03105468750003],[17.1884765625,-28.13251953125001],[17.358691406250017,-28.269433593750023],[17.44794921875001,-28.698144531249966],[18.310839843750017,-28.88623046875],[19.16171875,-28.93876953124996],[19.245800781250068,-28.90166015625003],[19.31269531250004,-28.733300781250023],[19.539843750000017,-28.574609375000023],[19.98046875,-28.45126953125002],[19.98046875,-28.310351562500003],[19.98046875,-24.77675781249998],[20.430664062500057,-25.14707031250002],[20.79316406250001,-25.915625],[20.641406250000017,-26.7421875],[20.739843749999977,-26.84882812499997],[21.694726562500023,-26.840917968749963],[21.738085937500045,-26.806835937500026],[21.788281250000068,-26.710058593750034],[22.01093750000004,-26.635839843750006],[22.090917968749977,-26.580175781250034],[22.217578125000045,-26.38886718749997],[22.47089843750004,-26.219042968750003],[22.548632812500074,-26.178417968749997],[22.59765625000003,-26.13271484375001],[22.878808593750023,-25.457910156250023],[23.148730468750017,-25.288671875],[23.389257812500006,-25.291406250000023],[23.89375,-25.600878906250017],[23.96953124999999,-25.62607421874999],[24.192968750000034,-25.632910156249963],[24.33056640625,-25.742871093749983],[25.21337890625,-25.75625],[25.518164062500006,-25.66279296875001],[25.91210937499997,-24.747460937499966],[26.031835937500034,-24.70244140625003],[26.130859375000057,-24.671484375000034],[26.39716796875004,-24.61357421874996],[26.451757812500063,-24.582714843749983],[26.835058593750063,-24.240820312499963],[27.085546875000034,-23.577929687500003],[27.7685546875,-23.14892578125],[27.812597656250006,-23.108007812500006],[28.210156249999983,-22.693652343749974],[28.83984375000003,-22.480859374999966],[28.94580078125003,-22.39511718749999],[29.013476562500045,-22.27841796875002],[29.129882812500057,-22.21328125],[29.364843750000063,-22.19394531250005],[29.37744140625003,-22.19277343749998],[29.66308593749997,-22.146289062500017],[29.90234375000003,-22.184179687500006],[30.19042968750003,-22.291113281250034],[30.460156250000097,-22.329003906250023],[30.71162109375004,-22.297851562499986],[31.07343750000004,-22.30781249999997],[31.19726562499997,-22.344921874999983],[31.287890625000074,-22.402050781249983],[31.54560546875004,-23.48232421874998],[31.799609375000017,-23.8921875]],[[27.19355468750001,-29.94130859375001],[27.364062500000017,-30.27919921875001],[27.753125,-30.6],[28.05683593750001,-30.63105468750001],[28.128710937500017,-30.52509765625001],[28.39208984375003,-30.14755859375002],[28.646875,-30.1265625],[29.09804687500005,-29.919042968750006],[29.142187500000063,-29.70097656249999],[29.293554687500006,-29.56689453125003],[29.348828125000097,-29.441992187499977],[29.38671874999997,-29.319726562500023],[29.301367187500006,-29.08984375],[28.625781250000017,-28.581738281250054],[28.583398437499994,-28.59414062499999],[28.471875,-28.615820312499977],[28.23261718750004,-28.701269531249977],[28.084375,-28.779980468750026],[27.95986328125008,-28.87333984375003],[27.73554687500004,-28.940039062500034],[27.294531250000063,-29.519335937500017],[27.056933593750074,-29.62558593749999],[27.19355468750001,-29.94130859375001]]]]},"properties":{"name":"South Africa","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[33.148046875,-9.603515625],[33.25,-9.759570312500003],[33.35097656250002,-9.862207031250009],[33.33710937500001,-9.954003906250009],[33.3115234375,-10.037988281250009],[33.52890625,-10.234667968750003],[33.53759765625,-10.3515625],[33.5537109375,-10.391308593750011],[33.66152343750002,-10.553125],[33.29277343750002,-10.85234375],[33.37978515625002,-11.157910156250011],[33.26835937500002,-11.40390625],[33.23271484375002,-11.417675781250011],[33.22636718750002,-11.534863281250011],[33.30390625000001,-11.690820312500009],[33.25234375000002,-12.112597656250003],[33.34013671875002,-12.308300781250011],[33.512304687500006,-12.347753906250006],[32.975195312500006,-12.701367187500011],[32.96757812500002,-13.225],[32.67041015625,-13.590429687500006],[32.797460937500006,-13.6884765625],[32.98125,-14.009375],[33.148046875,-13.94091796875],[33.201757812500006,-14.013378906250011],[30.231835937500023,-14.990332031250006],[30.39609375,-15.64306640625],[29.4873046875,-15.69677734375],[28.9130859375,-15.98779296875],[28.760546875000017,-16.53212890625001],[27.932226562500006,-16.89619140625001],[27.020800781250017,-17.95839843750001],[26.779882812500006,-18.04150390625],[26.333398437500023,-17.929296875],[25.995898437500017,-17.969824218750006],[25.2587890625,-17.793554687500006],[25.001757812500017,-17.56855468750001],[24.73291015625,-17.51777343750001],[24.27490234375,-17.481054687500006],[23.380664062500017,-17.640625],[22.193945312500006,-16.628125],[21.979785156250017,-15.95556640625],[21.979394531250023,-14.440527343750006],[21.979296875000017,-14.11962890625],[21.979101562500006,-13.798730468750009],[21.978906250000023,-13.0009765625],[22.209570312500006,-13.0009765625],[23.843164062500023,-13.0009765625],[23.962988281250006,-12.988476562500011],[23.882421875,-12.799023437500011],[23.886523437500017,-12.743261718750006],[23.909375,-12.636132812500009],[23.98388671875,-11.725],[23.96650390625001,-10.871777343750011],[24.36572265625,-11.1298828125],[24.3779296875,-11.417089843750006],[25.28876953125001,-11.21240234375],[25.349414062500017,-11.623046875],[26.025976562500006,-11.89013671875],[26.824023437500017,-11.965234375],[27.1591796875,-11.579199218750006],[27.573828125,-12.22705078125],[28.412890625000017,-12.51806640625],[28.550878906250006,-12.836132812500011],[28.730078125,-12.925488281250011],[29.014257812500006,-13.368847656250011],[29.20185546875001,-13.398339843750009],[29.55419921875,-13.248925781250009],[29.775195312500017,-13.438085937500006],[29.79511718750001,-12.155468750000011],[29.508203125000023,-12.228222656250011],[29.48554687500001,-12.41845703125],[29.064355468750023,-12.348828125000011],[28.482519531250006,-11.812109375],[28.383398437500006,-11.566699218750003],[28.6455078125,-10.550195312500009],[28.60419921875001,-9.678808593750006],[28.400683593750017,-9.224804687500011],[28.869531250000023,-8.785839843750011],[28.89814453125001,-8.485449218750006],[30.75117187500001,-8.193652343750003],[30.830664062500006,-8.385546875],[30.891992187500023,-8.473730468750006],[30.968359375,-8.550976562500011],[31.07636718750001,-8.611914062500006],[31.3505859375,-8.60703125],[31.44921875,-8.65390625],[31.53486328125001,-8.71328125],[31.55625,-8.80546875],[31.673632812500017,-8.908789062500006],[31.91865234375001,-8.9421875],[31.921875,-9.019433593750009],[31.94257812500001,-9.054003906250003],[32.75664062500002,-9.322265625],[32.919921875,-9.407421875000011],[32.99599609375002,-9.622851562500003],[33.148046875,-9.603515625]]]},"properties":{"name":"Zambia","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[31.287890625000017,-22.40205078125001],[31.07343750000001,-22.30781250000001],[30.71162109375001,-22.2978515625],[30.46015625000001,-22.32900390625001],[30.1904296875,-22.291113281250006],[29.90234375,-22.184179687500006],[29.6630859375,-22.146289062500003],[29.37744140625,-22.19277343750001],[29.36484375,-22.193945312500006],[29.315234375000017,-22.15771484375],[29.237207031250023,-22.07949218750001],[29.042382812500023,-22.018359375],[29.02558593750001,-21.796875],[28.014062500000023,-21.55419921875],[27.66943359375,-21.064257812500003],[27.679296875,-20.503027343750006],[27.28076171875,-20.47871093750001],[27.17822265625,-20.10097656250001],[26.168066406250006,-19.53828125000001],[25.939355468750023,-18.93867187500001],[25.242285156250006,-17.969042968750003],[25.2587890625,-17.793554687500006],[25.995898437500017,-17.969824218750006],[26.333398437500023,-17.929296875],[26.779882812500006,-18.04150390625],[27.020800781250017,-17.95839843750001],[27.932226562500006,-16.89619140625001],[28.760546875000017,-16.53212890625001],[28.9130859375,-15.98779296875],[29.4873046875,-15.69677734375],[30.39609375,-15.64306640625],[30.437792968750017,-15.995312500000011],[31.236230468750023,-16.02363281250001],[31.939843750000023,-16.428808593750006],[32.94804687500002,-16.71230468750001],[32.87626953125002,-16.88359375],[32.99306640625002,-18.35957031250001],[32.69970703125,-18.94091796875],[32.84980468750001,-19.10439453125001],[32.77763671875002,-19.388769531250006],[32.992773437500006,-19.98486328125],[32.49238281250001,-20.659765625],[32.353613281250006,-21.136523437500003],[32.429785156250006,-21.29707031250001],[31.429492187500017,-22.298828125],[31.287890625000017,-22.40205078125001]]]},"properties":{"name":"Zimbabwe","childNum":1}}]});
}));
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/src/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/src/

Statements: 5.26% (1 / 19)      Branches: 0% (0 / 2)      Functions: 0% (0 / 4)      Lines: 5.26% (1 / 19)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/src/
File Statements Branches Functions Lines
helper.js 5.26% (1 / 19) 0% (0 / 2) 0% (0 / 4) 5.26% (1 / 19)
Code coverage report for node-npmtest-echarts/node_modules/echarts/src/helper.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/src/helper.js

Statements: 5.26% (1 / 19)      Branches: 0% (0 / 2)      Functions: 0% (0 / 4)      Lines: 5.26% (1 / 19)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 812                                                                                                                                                                
define(function (require) {
 
    var createListFromArray = require('./chart/helper/createListFromArray');
    var symbolUtil = require('./util/symbol');
    var axisHelper = require('./coord/axisHelper');
    var axisModelCommonMixin = require('./coord/axisModelCommonMixin');
    var Model = require('./model/Model');
    var util = require('zrender/core/util');
 
    return {
        /**
         * Create a muti dimension List structure from seriesModel.
         * @param  {module:echarts/model/Model} seriesModel
         * @return {module:echarts/data/List} list
         */
        createList: function (seriesModel) {
            var data = seriesModel.get('data');
            return createListFromArray(data, seriesModel, seriesModel.ecModel);
        },
 
        /**
         * Complete the dimensions array guessed from the data structure.
         * @param  {Array.<string>} dimensions Necessary dimensions, like ['x', 'y']
         * @param  {Array} data Data list. [[1, 2, 3], [2, 3, 4]]
         * @param  {Object} [opt]
         * @param  {Array.<string>} [opt.defaultNames] Default names to fill not necessary dimensions, like ['value']
         * @param  {string} [opt.extraPrefix] Prefix of name when filling the left dimensions.
         * @param  {number} [opt.dimCount] If not specified, guess by the first data item.
         * @return {Array.<string>}
         */
        completeDimensions: require('./data/helper/completeDimensions'),
 
        /**
         * Create a symbol element with given symbol configuration: shape, x, y, width, height, color
         * @see http://echarts.baidu.com/option.html#series-scatter.symbol
         * @param {string} symbolDesc
         * @param {number} x
         * @param {number} y
         * @param {number} w
         * @param {number} h
         * @param {string} color
         */
        createSymbol: symbolUtil.createSymbol,
 
        /**
         * Create scale
         * @param {Array.<number>} dataExtent
         * @param {Object|module:echarts/Model} option
         */
        createScale: function (dataExtent, option) {
            var axisModel = option;
            if (!(option instanceof Model)) {
                axisModel = new Model(option);
                util.mixin(axisModel, axisModelCommonMixin);
            }
 
            var scale = axisHelper.createScaleByModel(axisModel);
            scale.setExtent(dataExtent[0], dataExtent[1]);
 
            axisHelper.niceScaleExtent(scale, axisModel);
            return scale;
        },
 
        /**
         * Mixin common methods to axis model,
         *
         * Inlcude methods
         * `getFormattedLabels() => Array.<string>`
         * `getCategories() => Array.<string>`
         * `getMin(origin: boolean) => number`
         * `getMax(origin: boolean) => number`
         * `getNeedCrossZero() => boolean`
         * `setRange(start: number, end: number)`
         * `resetRange()`
         */
        mixinAxisModelCommonMethods: function (Model) {
            util.mixin(Model, axisModelCommonMixin);
        }
    };
});
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/src/coord/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/src/coord/

Statements: 2.9% (2 / 69)      Branches: 0% (0 / 24)      Functions: 0% (0 / 15)      Lines: 2.9% (2 / 69)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/src/coord/
File Statements Branches Functions Lines
Axis.js 2.9% (2 / 69) 0% (0 / 24) 0% (0 / 15) 2.9% (2 / 69)
Code coverage report for node-npmtest-echarts/node_modules/echarts/src/coord/Axis.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/src/coord/Axis.js

Statements: 2.9% (2 / 69)      Branches: 0% (0 / 24)      Functions: 0% (0 / 15)      Lines: 2.9% (2 / 69)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 2332           1                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
define(function (require) {
 
    var numberUtil = require('../util/number');
    var linearMap = numberUtil.linearMap;
    var zrUtil = require('zrender/core/util');
 
    function fixExtentWithBands(extent, nTick) {
        var size = extent[1] - extent[0];
        var len = nTick;
        var margin = size / len / 2;
        extent[0] += margin;
        extent[1] -= margin;
    }
 
    var normalizedExtent = [0, 1];
    /**
     * @name module:echarts/coord/CartesianAxis
     * @constructor
     */
    var Axis = function (dim, scale, extent) {
 
        /**
         * Axis dimension. Such as 'x', 'y', 'z', 'angle', 'radius'
         * @type {string}
         */
        this.dim = dim;
 
        /**
         * Axis scale
         * @type {module:echarts/coord/scale/*}
         */
        this.scale = scale;
 
        /**
         * @type {Array.<number>}
         * @private
         */
        this._extent = extent || [0, 0];
 
        /**
         * @type {boolean}
         */
        this.inverse = false;
 
        /**
         * Usually true when axis has a ordinal scale
         * @type {boolean}
         */
        this.onBand = false;
    };
 
    Axis.prototype = {
 
        constructor: Axis,
 
        /**
         * If axis extent contain given coord
         * @param {number} coord
         * @return {boolean}
         */
        contain: function (coord) {
            var extent = this._extent;
            var min = Math.min(extent[0], extent[1]);
            var max = Math.max(extent[0], extent[1]);
            return coord >= min && coord <= max;
        },
 
        /**
         * If axis extent contain given data
         * @param {number} data
         * @return {boolean}
         */
        containData: function (data) {
            return this.contain(this.dataToCoord(data));
        },
 
        /**
         * Get coord extent.
         * @return {Array.<number>}
         */
        getExtent: function () {
            var ret = this._extent.slice();
            return ret;
        },
 
        /**
         * Get precision used for formatting
         * @param {Array.<number>} [dataExtent]
         * @return {number}
         */
        getPixelPrecision: function (dataExtent) {
            return numberUtil.getPixelPrecision(
                dataExtent || this.scale.getExtent(),
                this._extent
            );
        },
 
        /**
         * Set coord extent
         * @param {number} start
         * @param {number} end
         */
        setExtent: function (start, end) {
            var extent = this._extent;
            extent[0] = start;
            extent[1] = end;
        },
 
        /**
         * Convert data to coord. Data is the rank if it has a ordinal scale
         * @param {number} data
         * @param  {boolean} clamp
         * @return {number}
         */
        dataToCoord: function (data, clamp) {
            var extent = this._extent;
            var scale = this.scale;
            data = scale.normalize(data);
 
            if (this.onBand && scale.type === 'ordinal') {
                extent = extent.slice();
                fixExtentWithBands(extent, scale.count());
            }
 
            return linearMap(data, normalizedExtent, extent, clamp);
        },
 
        /**
         * Convert coord to data. Data is the rank if it has a ordinal scale
         * @param {number} coord
         * @param  {boolean} clamp
         * @return {number}
         */
        coordToData: function (coord, clamp) {
            var extent = this._extent;
            var scale = this.scale;
 
            if (this.onBand && scale.type === 'ordinal') {
                extent = extent.slice();
                fixExtentWithBands(extent, scale.count());
            }
 
            var t = linearMap(coord, extent, normalizedExtent, clamp);
 
            return this.scale.scale(t);
        },
 
        /**
         * Convert pixel point to data in axis
         * @param {Array.<number>} point
         * @param  {boolean} clamp
         * @return {number} data
         */
        pointToData: function (point, clamp) {
            // Should be implemented in derived class if necessary.
        },
 
        /**
         * @return {Array.<number>}
         */
        getTicksCoords: function (alignWithLabel) {
            if (this.onBand && !alignWithLabel) {
                var bands = this.getBands();
                var coords = [];
                for (var i = 0; i < bands.length; i++) {
                    coords.push(bands[i][0]);
                }
                if (bands[i - 1]) {
                    coords.push(bands[i - 1][1]);
                }
                return coords;
            }
            else {
                return zrUtil.map(this.scale.getTicks(), this.dataToCoord, this);
            }
        },
 
        /**
         * Coords of labels are on the ticks or on the middle of bands
         * @return {Array.<number>}
         */
        getLabelsCoords: function () {
            return zrUtil.map(this.scale.getTicks(), this.dataToCoord, this);
        },
 
        /**
         * Get bands.
         *
         * If axis has labels [1, 2, 3, 4]. Bands on the axis are
         * |---1---|---2---|---3---|---4---|.
         *
         * @return {Array}
         */
         // FIXME Situation when labels is on ticks
        getBands: function () {
            var extent = this.getExtent();
            var bands = [];
            var len = this.scale.count();
            var start = extent[0];
            var end = extent[1];
            var span = end - start;
 
            for (var i = 0; i < len; i++) {
                bands.push([
                    span * i / len + start,
                    span * (i + 1) / len + start
                ]);
            }
            return bands;
        },
 
        /**
         * Get width of band
         * @return {number}
         */
        getBandWidth: function () {
            var axisExtent = this._extent;
            var dataExtent = this.scale.getExtent();
 
            var len = dataExtent[1] - dataExtent[0] + (this.onBand ? 1 : 0);
            // Fix #2728, avoid NaN when only one data.
            len === 0 && (len = 1);
 
            var size = Math.abs(axisExtent[1] - axisExtent[0]);
 
            return Math.abs(size) / len;
        }
 
    };
 
    return Axis;
});
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/src/data/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/src/data/

Statements: 0.67% (3 / 447)      Branches: 0% (0 / 222)      Functions: 0% (0 / 53)      Lines: 0.67% (3 / 447)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/src/data/
File Statements Branches Functions Lines
List.js 0.67% (3 / 447) 0% (0 / 222) 0% (0 / 53) 0.67% (3 / 447)
Code coverage report for node-npmtest-echarts/node_modules/echarts/src/data/List.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/src/data/List.js

Statements: 0.67% (3 / 447)      Branches: 0% (0 / 222)      Functions: 0% (0 / 53)      Lines: 0.67% (3 / 447)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147        2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   1                                                                                                                                                                                                                                                                             1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
/**
 * List for data storage
 * @module echarts/data/List
 */
define(function (require) {
 
    var UNDEFINED = 'undefined';
    var globalObj = typeof window === 'undefined' ? global : window;
    var Float64Array = typeof globalObj.Float64Array === UNDEFINED
        ? Array : globalObj.Float64Array;
    var Int32Array = typeof globalObj.Int32Array === UNDEFINED
        ? Array : globalObj.Int32Array;
 
    var dataCtors = {
        'float': Float64Array,
        'int': Int32Array,
        // Ordinal data type can be string or int
        'ordinal': Array,
        'number': Array,
        'time': Array
    };
 
    var Model = require('../model/Model');
    var DataDiffer = require('./DataDiffer');
 
    var zrUtil = require('zrender/core/util');
    var modelUtil = require('../util/model');
    var isObject = zrUtil.isObject;
 
    var TRANSFERABLE_PROPERTIES = [
        'stackedOn', 'hasItemOption', '_nameList', '_idList', '_rawData'
    ];
 
    var transferProperties = function (a, b) {
        zrUtil.each(TRANSFERABLE_PROPERTIES.concat(b.__wrappedMethods || []), function (propName) {
            if (b.hasOwnProperty(propName)) {
                a[propName] = b[propName];
            }
        });
 
        a.__wrappedMethods = b.__wrappedMethods;
    };
 
    /**
     * @constructor
     * @alias module:echarts/data/List
     *
     * @param {Array.<string|Object>} dimensions
     *      For example, ['someDimName', {name: 'someDimName', type: 'someDimType'}, ...].
     *      Dimensions should be concrete names like x, y, z, lng, lat, angle, radius
     * @param {module:echarts/model/Model} hostModel
     */
    var List = function (dimensions, hostModel) {
 
        dimensions = dimensions || ['x', 'y'];
 
        var dimensionInfos = {};
        var dimensionNames = [];
        for (var i = 0; i < dimensions.length; i++) {
            var dimensionName;
            var dimensionInfo = {};
            if (typeof dimensions[i] === 'string') {
                dimensionName = dimensions[i];
                dimensionInfo = {
                    name: dimensionName,
                    stackable: false,
                    // Type can be 'float', 'int', 'number'
                    // Default is number, Precision of float may not enough
                    type: 'number'
                };
            }
            else {
                dimensionInfo = dimensions[i];
                dimensionName = dimensionInfo.name;
                dimensionInfo.type = dimensionInfo.type || 'number';
            }
            dimensionNames.push(dimensionName);
            dimensionInfos[dimensionName] = dimensionInfo;
        }
        /**
         * @readOnly
         * @type {Array.<string>}
         */
        this.dimensions = dimensionNames;
 
        /**
         * Infomation of each data dimension, like data type.
         * @type {Object}
         */
        this._dimensionInfos = dimensionInfos;
 
        /**
         * @type {module:echarts/model/Model}
         */
        this.hostModel = hostModel;
 
        /**
         * @type {module:echarts/model/Model}
         */
        this.dataType;
 
        /**
         * Indices stores the indices of data subset after filtered.
         * This data subset will be used in chart.
         * @type {Array.<number>}
         * @readOnly
         */
        this.indices = [];
 
        /**
         * Data storage
         * @type {Object.<key, TypedArray|Array>}
         * @private
         */
        this._storage = {};
 
        /**
         * @type {Array.<string>}
         */
        this._nameList = [];
        /**
         * @type {Array.<string>}
         */
        this._idList = [];
        /**
         * Models of data option is stored sparse for optimizing memory cost
         * @type {Array.<module:echarts/model/Model>}
         * @private
         */
        this._optionModels = [];
 
        /**
         * @param {module:echarts/data/List}
         */
        this.stackedOn = null;
 
        /**
         * Global visual properties after visual coding
         * @type {Object}
         * @private
         */
        this._visual = {};
 
        /**
         * Globel layout properties.
         * @type {Object}
         * @private
         */
        this._layout = {};
 
        /**
         * Item visual properties after visual coding
         * @type {Array.<Object>}
         * @private
         */
        this._itemVisuals = [];
 
        /**
         * Item layout properties after layout
         * @type {Array.<Object>}
         * @private
         */
        this._itemLayouts = [];
 
        /**
         * Graphic elemnents
         * @type {Array.<module:zrender/Element>}
         * @private
         */
        this._graphicEls = [];
 
        /**
         * @type {Array.<Array|Object>}
         * @private
         */
        this._rawData;
 
        /**
         * @type {Object}
         * @private
         */
        this._extent;
    };
 
    var listProto = List.prototype;
 
    listProto.type = 'list';
    /**
     * If each data item has it's own option
     * @type {boolean}
     */
    listProto.hasItemOption = true;
 
    /**
     * Get dimension name
     * @param {string|number} dim
     *        Dimension can be concrete names like x, y, z, lng, lat, angle, radius
     *        Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius'
     * @return {string} Concrete dim name.
     */
    listProto.getDimension = function (dim) {
        if (!isNaN(dim)) {
            dim = this.dimensions[dim] || dim;
        }
        return dim;
    };
    /**
     * Get type and stackable info of particular dimension
     * @param {string|number} dim
     *        Dimension can be concrete names like x, y, z, lng, lat, angle, radius
     *        Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius'
     */
    listProto.getDimensionInfo = function (dim) {
        return zrUtil.clone(this._dimensionInfos[this.getDimension(dim)]);
    };
 
    /**
     * Initialize from data
     * @param {Array.<Object|number|Array>} data
     * @param {Array.<string>} [nameList]
     * @param {Function} [dimValueGetter] (dataItem, dimName, dataIndex, dimIndex) => number
     */
    listProto.initData = function (data, nameList, dimValueGetter) {
        data = data || [];
 
        if (__DEV__) {
            if (!zrUtil.isArray(data)) {
                throw new Error('Invalid data.');
            }
        }
 
        this._rawData = data;
 
        // Clear
        var storage = this._storage = {};
        var indices = this.indices = [];
 
        var dimensions = this.dimensions;
        var size = data.length;
        var dimensionInfoMap = this._dimensionInfos;
 
        var idList = [];
        var nameRepeatCount = {};
 
        nameList = nameList || [];
 
        // Init storage
        for (var i = 0; i < dimensions.length; i++) {
            var dimInfo = dimensionInfoMap[dimensions[i]];
            var DataCtor = dataCtors[dimInfo.type];
            storage[dimensions[i]] = new DataCtor(size);
        }
 
        var self = this;
        if (!dimValueGetter) {
            self.hasItemOption = false;
        }
        // Default dim value getter
        dimValueGetter = dimValueGetter || function (dataItem, dimName, dataIndex, dimIndex) {
            var value = modelUtil.getDataItemValue(dataItem);
            // If any dataItem is like { value: 10 }
            if (modelUtil.isDataItemOption(dataItem)) {
                self.hasItemOption = true;
            }
            return modelUtil.converDataValue(
                (value instanceof Array)
                    ? value[dimIndex]
                    // If value is a single number or something else not array.
                    : value,
                dimensionInfoMap[dimName]
            );
        };
 
        for (var idx = 0; idx < data.length; idx++) {
            var dataItem = data[idx];
            // Each data item is value
            // [1, 2]
            // 2
            // Bar chart, line chart which uses category axis
            // only gives the 'y' value. 'x' value is the indices of cateogry
            // Use a tempValue to normalize the value to be a (x, y) value
 
            // Store the data by dimensions
            for (var k = 0; k < dimensions.length; k++) {
                var dim = dimensions[k];
                var dimStorage = storage[dim];
                // PENDING NULL is empty or zero
                dimStorage[idx] = dimValueGetter(dataItem, dim, idx, k);
            }
 
            indices.push(idx);
        }
 
        // Use the name in option and create id
        for (var i = 0; i < data.length; i++) {
            if (!nameList[i]) {
                if (data[i] && data[i].name != null) {
                    nameList[i] = data[i].name;
                }
            }
            var name = nameList[i] || '';
            // Try using the id in option
            var id = data[i] && data[i].id;
 
            if (!id && name) {
                // Use name as id and add counter to avoid same name
                nameRepeatCount[name] = nameRepeatCount[name] || 0;
                id = name;
                if (nameRepeatCount[name] > 0) {
                    id += '__ec__' + nameRepeatCount[name];
                }
                nameRepeatCount[name]++;
            }
            id && (idList[i] = id);
        }
 
        this._nameList = nameList;
        this._idList = idList;
    };
 
    /**
     * @return {number}
     */
    listProto.count = function () {
        return this.indices.length;
    };
 
    /**
     * Get value. Return NaN if idx is out of range.
     * @param {string} dim Dim must be concrete name.
     * @param {number} idx
     * @param {boolean} stack
     * @return {number}
     */
    listProto.get = function (dim, idx, stack) {
        var storage = this._storage;
        var dataIndex = this.indices[idx];
 
        // If value not exists
        if (dataIndex == null) {
            return NaN;
        }
 
        var value = storage[dim] && storage[dim][dataIndex];
        // FIXME ordinal data type is not stackable
        if (stack) {
            var dimensionInfo = this._dimensionInfos[dim];
            if (dimensionInfo && dimensionInfo.stackable) {
                var stackedOn = this.stackedOn;
                while (stackedOn) {
                    // Get no stacked data of stacked on
                    var stackedValue = stackedOn.get(dim, idx);
                    // Considering positive stack, negative stack and empty data
                    if ((value >= 0 && stackedValue > 0)  // Positive stack
                        || (value <= 0 && stackedValue < 0) // Negative stack
                    ) {
                        value += stackedValue;
                    }
                    stackedOn = stackedOn.stackedOn;
                }
            }
        }
        return value;
    };
 
    /**
     * Get value for multi dimensions.
     * @param {Array.<string>} [dimensions] If ignored, using all dimensions.
     * @param {number} idx
     * @param {boolean} stack
     * @return {number}
     */
    listProto.getValues = function (dimensions, idx, stack) {
        var values = [];
 
        if (!zrUtil.isArray(dimensions)) {
            stack = idx;
            idx = dimensions;
            dimensions = this.dimensions;
        }
 
        for (var i = 0, len = dimensions.length; i < len; i++) {
            values.push(this.get(dimensions[i], idx, stack));
        }
 
        return values;
    };
 
    /**
     * If value is NaN. Inlcuding '-'
     * @param {string} dim
     * @param {number} idx
     * @return {number}
     */
    listProto.hasValue = function (idx) {
        var dimensions = this.dimensions;
        var dimensionInfos = this._dimensionInfos;
        for (var i = 0, len = dimensions.length; i < len; i++) {
            if (
                // Ordinal type can be string or number
                dimensionInfos[dimensions[i]].type !== 'ordinal'
                && isNaN(this.get(dimensions[i], idx))
            ) {
                return false;
            }
        }
        return true;
    };
 
    /**
     * Get extent of data in one dimension
     * @param {string} dim
     * @param {boolean} stack
     * @param {Function} filter
     */
    listProto.getDataExtent = function (dim, stack, filter) {
        dim = this.getDimension(dim);
        var dimData = this._storage[dim];
        var dimInfo = this.getDimensionInfo(dim);
        stack = (dimInfo && dimInfo.stackable) && stack;
        var dimExtent = (this._extent || (this._extent = {}))[dim + (!!stack)];
        var value;
        if (dimExtent) {
            return dimExtent;
        }
        // var dimInfo = this._dimensionInfos[dim];
        if (dimData) {
            var min = Infinity;
            var max = -Infinity;
            // var isOrdinal = dimInfo.type === 'ordinal';
            for (var i = 0, len = this.count(); i < len; i++) {
                value = this.get(dim, i, stack);
                // FIXME
                // if (isOrdinal && typeof value === 'string') {
                //     value = zrUtil.indexOf(dimData, value);
                // }
                if (!filter || filter(value, dim, i)) {
                    value < min && (min = value);
                    value > max && (max = value);
                }
            }
            return (this._extent[dim + !!stack] = [min, max]);
        }
        else {
            return [Infinity, -Infinity];
        }
    };
 
    /**
     * Get sum of data in one dimension
     * @param {string} dim
     * @param {boolean} stack
     */
    listProto.getSum = function (dim, stack) {
        var dimData = this._storage[dim];
        var sum = 0;
        if (dimData) {
            for (var i = 0, len = this.count(); i < len; i++) {
                var value = this.get(dim, i, stack);
                if (!isNaN(value)) {
                    sum += value;
                }
            }
        }
        return sum;
    };
 
    /**
     * Retreive the index with given value
     * @param {number} idx
     * @param {number} value
     * @return {number}
     */
    // FIXME Precision of float value
    listProto.indexOf = function (dim, value) {
        var storage = this._storage;
        var dimData = storage[dim];
        var indices = this.indices;
 
        if (dimData) {
            for (var i = 0, len = indices.length; i < len; i++) {
                var rawIndex = indices[i];
                if (dimData[rawIndex] === value) {
                    return i;
                }
            }
        }
        return -1;
    };
 
    /**
     * Retreive the index with given name
     * @param {number} idx
     * @param {number} name
     * @return {number}
     */
    listProto.indexOfName = function (name) {
        var indices = this.indices;
        var nameList = this._nameList;
 
        for (var i = 0, len = indices.length; i < len; i++) {
            var rawIndex = indices[i];
            if (nameList[rawIndex] === name) {
                return i;
            }
        }
 
        return -1;
    };
 
    /**
     * Retreive the index with given raw data index
     * @param {number} idx
     * @param {number} name
     * @return {number}
     */
    listProto.indexOfRawIndex = function (rawIndex) {
        // Indices are ascending
        var indices = this.indices;
 
        // If rawIndex === dataIndex
        var rawDataIndex = indices[rawIndex];
        if (rawDataIndex != null && rawDataIndex === rawIndex) {
            return rawIndex;
        }
 
        var left = 0;
        var right = indices.length - 1;
        while (left <= right) {
            var mid = (left + right) / 2 | 0;
            if (indices[mid] < rawIndex) {
                left = mid + 1;
            }
            else if (indices[mid] > rawIndex) {
                right = mid - 1;
            }
            else {
                return mid;
            }
        }
        return -1;
    };
 
    /**
     * Retreive the index of nearest value
     * @param {string} dim
     * @param {number} value
     * @param {boolean} stack If given value is after stacked
     * @param {number} [maxDistance=Infinity]
     * @return {Array.<number>} Considere multiple points has the same value.
     */
    listProto.indicesOfNearest = function (dim, value, stack, maxDistance) {
        var storage = this._storage;
        var dimData = storage[dim];
        var nearestIndices = [];
 
        if (!dimData) {
            return nearestIndices;
        }
 
        if (maxDistance == null) {
            maxDistance = Infinity;
        }
 
        var minDist = Number.MAX_VALUE;
        var minDiff = -1;
        for (var i = 0, len = this.count(); i < len; i++) {
            var diff = value - this.get(dim, i, stack);
            var dist = Math.abs(diff);
            if (diff <= maxDistance && dist <= minDist) {
                // For the case of two data are same on xAxis, which has sequence data.
                // Show the nearest index
                // https://github.com/ecomfe/echarts/issues/2869
                if (dist < minDist || (diff >= 0 && minDiff < 0)) {
                    minDist = dist;
                    minDiff = diff;
                    nearestIndices.length = 0;
                }
                nearestIndices.push(i);
            }
        }
        return nearestIndices;
    };
 
    /**
     * Get raw data index
     * @param {number} idx
     * @return {number}
     */
    listProto.getRawIndex = function (idx) {
        var rawIdx = this.indices[idx];
        return rawIdx == null ? -1 : rawIdx;
    };
 
    /**
     * Get raw data item
     * @param {number} idx
     * @return {number}
     */
    listProto.getRawDataItem = function (idx) {
        return this._rawData[this.getRawIndex(idx)];
    };
 
    /**
     * @param {number} idx
     * @param {boolean} [notDefaultIdx=false]
     * @return {string}
     */
    listProto.getName = function (idx) {
        return this._nameList[this.indices[idx]] || '';
    };
 
    /**
     * @param {number} idx
     * @param {boolean} [notDefaultIdx=false]
     * @return {string}
     */
    listProto.getId = function (idx) {
        return this._idList[this.indices[idx]] || (this.getRawIndex(idx) + '');
    };
 
 
    function normalizeDimensions(dimensions) {
        if (!zrUtil.isArray(dimensions)) {
            dimensions = [dimensions];
        }
        return dimensions;
    }
 
    /**
     * Data iteration
     * @param {string|Array.<string>}
     * @param {Function} cb
     * @param {boolean} [stack=false]
     * @param {*} [context=this]
     *
     * @example
     *  list.each('x', function (x, idx) {});
     *  list.each(['x', 'y'], function (x, y, idx) {});
     *  list.each(function (idx) {})
     */
    listProto.each = function (dims, cb, stack, context) {
        if (typeof dims === 'function') {
            context = stack;
            stack = cb;
            cb = dims;
            dims = [];
        }
 
        dims = zrUtil.map(normalizeDimensions(dims), this.getDimension, this);
 
        var value = [];
        var dimSize = dims.length;
        var indices = this.indices;
 
        context = context || this;
 
        for (var i = 0; i < indices.length; i++) {
            // Simple optimization
            switch (dimSize) {
                case 0:
                    cb.call(context, i);
                    break;
                case 1:
                    cb.call(context, this.get(dims[0], i, stack), i);
                    break;
                case 2:
                    cb.call(context, this.get(dims[0], i, stack), this.get(dims[1], i, stack), i);
                    break;
                default:
                    for (var k = 0; k < dimSize; k++) {
                        value[k] = this.get(dims[k], i, stack);
                    }
                    // Index
                    value[k] = i;
                    cb.apply(context, value);
            }
        }
    };
 
    /**
     * Data filter
     * @param {string|Array.<string>}
     * @param {Function} cb
     * @param {boolean} [stack=false]
     * @param {*} [context=this]
     */
    listProto.filterSelf = function (dimensions, cb, stack, context) {
        if (typeof dimensions === 'function') {
            context = stack;
            stack = cb;
            cb = dimensions;
            dimensions = [];
        }
 
        dimensions = zrUtil.map(
            normalizeDimensions(dimensions), this.getDimension, this
        );
 
        var newIndices = [];
        var value = [];
        var dimSize = dimensions.length;
        var indices = this.indices;
 
        context = context || this;
 
        for (var i = 0; i < indices.length; i++) {
            var keep;
            // Simple optimization
            if (dimSize === 1) {
                keep = cb.call(
                    context, this.get(dimensions[0], i, stack), i
                );
            }
            else {
                for (var k = 0; k < dimSize; k++) {
                    value[k] = this.get(dimensions[k], i, stack);
                }
                value[k] = i;
                keep = cb.apply(context, value);
            }
            if (keep) {
                newIndices.push(indices[i]);
            }
        }
 
        this.indices = newIndices;
 
        // Reset data extent
        this._extent = {};
 
        return this;
    };
 
    /**
     * Data mapping to a plain array
     * @param {string|Array.<string>} [dimensions]
     * @param {Function} cb
     * @param {boolean} [stack=false]
     * @param {*} [context=this]
     * @return {Array}
     */
    listProto.mapArray = function (dimensions, cb, stack, context) {
        if (typeof dimensions === 'function') {
            context = stack;
            stack = cb;
            cb = dimensions;
            dimensions = [];
        }
 
        var result = [];
        this.each(dimensions, function () {
            result.push(cb && cb.apply(this, arguments));
        }, stack, context);
        return result;
    };
 
    function cloneListForMapAndSample(original, excludeDimensions) {
        var allDimensions = original.dimensions;
        var list = new List(
            zrUtil.map(allDimensions, original.getDimensionInfo, original),
            original.hostModel
        );
        // FIXME If needs stackedOn, value may already been stacked
        transferProperties(list, original);
 
        var storage = list._storage = {};
        var originalStorage = original._storage;
        // Init storage
        for (var i = 0; i < allDimensions.length; i++) {
            var dim = allDimensions[i];
            var dimStore = originalStorage[dim];
            if (zrUtil.indexOf(excludeDimensions, dim) >= 0) {
                storage[dim] = new dimStore.constructor(
                    originalStorage[dim].length
                );
            }
            else {
                // Direct reference for other dimensions
                storage[dim] = originalStorage[dim];
            }
        }
        return list;
    }
 
    /**
     * Data mapping to a new List with given dimensions
     * @param {string|Array.<string>} dimensions
     * @param {Function} cb
     * @param {boolean} [stack=false]
     * @param {*} [context=this]
     * @return {Array}
     */
    listProto.map = function (dimensions, cb, stack, context) {
        dimensions = zrUtil.map(
            normalizeDimensions(dimensions), this.getDimension, this
        );
 
        var list = cloneListForMapAndSample(this, dimensions);
        // Following properties are all immutable.
        // So we can reference to the same value
        var indices = list.indices = this.indices;
 
        var storage = list._storage;
 
        var tmpRetValue = [];
        this.each(dimensions, function () {
            var idx = arguments[arguments.length - 1];
            var retValue = cb && cb.apply(this, arguments);
            if (retValue != null) {
                // a number
                if (typeof retValue === 'number') {
                    tmpRetValue[0] = retValue;
                    retValue = tmpRetValue;
                }
                for (var i = 0; i < retValue.length; i++) {
                    var dim = dimensions[i];
                    var dimStore = storage[dim];
                    var rawIdx = indices[idx];
                    if (dimStore) {
                        dimStore[rawIdx] = retValue[i];
                    }
                }
            }
        }, stack, context);
 
        return list;
    };
 
    /**
     * Large data down sampling on given dimension
     * @param {string} dimension
     * @param {number} rate
     * @param {Function} sampleValue
     * @param {Function} sampleIndex Sample index for name and id
     */
    listProto.downSample = function (dimension, rate, sampleValue, sampleIndex) {
        var list = cloneListForMapAndSample(this, [dimension]);
        var storage = this._storage;
        var targetStorage = list._storage;
 
        var originalIndices = this.indices;
        var indices = list.indices = [];
 
        var frameValues = [];
        var frameIndices = [];
        var frameSize = Math.floor(1 / rate);
 
        var dimStore = targetStorage[dimension];
        var len = this.count();
        // Copy data from original data
        for (var i = 0; i < storage[dimension].length; i++) {
            targetStorage[dimension][i] = storage[dimension][i];
        }
        for (var i = 0; i < len; i += frameSize) {
            // Last frame
            if (frameSize > len - i) {
                frameSize = len - i;
                frameValues.length = frameSize;
            }
            for (var k = 0; k < frameSize; k++) {
                var idx = originalIndices[i + k];
                frameValues[k] = dimStore[idx];
                frameIndices[k] = idx;
            }
            var value = sampleValue(frameValues);
            var idx = frameIndices[sampleIndex(frameValues, value) || 0];
            // Only write value on the filtered data
            dimStore[idx] = value;
            indices.push(idx);
        }
 
        return list;
    };
 
    /**
     * Get model of one data item.
     *
     * @param {number} idx
     */
    // FIXME Model proxy ?
    listProto.getItemModel = function (idx) {
        var hostModel = this.hostModel;
        idx = this.indices[idx];
        return new Model(this._rawData[idx], hostModel, hostModel && hostModel.ecModel);
    };
 
    /**
     * Create a data differ
     * @param {module:echarts/data/List} otherList
     * @return {module:echarts/data/DataDiffer}
     */
    listProto.diff = function (otherList) {
        var idList = this._idList;
        var otherIdList = otherList && otherList._idList;
        var val;
        // Use prefix to avoid index to be the same as otherIdList[idx],
        // which will cause weird udpate animation.
        var prefix = 'e\0\0';
 
        return new DataDiffer(
            otherList ? otherList.indices : [],
            this.indices,
            function (idx) {
                return (val = otherIdList[idx]) != null ? val : prefix + idx;
            },
            function (idx) {
                return (val = idList[idx]) != null ? val : prefix + idx;
            }
        );
    };
    /**
     * Get visual property.
     * @param {string} key
     */
    listProto.getVisual = function (key) {
        var visual = this._visual;
        return visual && visual[key];
    };
 
    /**
     * Set visual property
     * @param {string|Object} key
     * @param {*} [value]
     *
     * @example
     *  setVisual('color', color);
     *  setVisual({
     *      'color': color
     *  });
     */
    listProto.setVisual = function (key, val) {
        if (isObject(key)) {
            for (var name in key) {
                if (key.hasOwnProperty(name)) {
                    this.setVisual(name, key[name]);
                }
            }
            return;
        }
        this._visual = this._visual || {};
        this._visual[key] = val;
    };
 
    /**
     * Set layout property.
     * @param {string} key
     * @param {*} [val]
     */
    listProto.setLayout = function (key, val) {
        if (isObject(key)) {
            for (var name in key) {
                if (key.hasOwnProperty(name)) {
                    this.setLayout(name, key[name]);
                }
            }
            return;
        }
        this._layout[key] = val;
    };
 
    /**
     * Get layout property.
     * @param  {string} key.
     * @return {*}
     */
    listProto.getLayout = function (key) {
        return this._layout[key];
    };
 
    /**
     * Get layout of single data item
     * @param {number} idx
     */
    listProto.getItemLayout = function (idx) {
        return this._itemLayouts[idx];
    };
 
    /**
     * Set layout of single data item
     * @param {number} idx
     * @param {Object} layout
     * @param {boolean=} [merge=false]
     */
    listProto.setItemLayout = function (idx, layout, merge) {
        this._itemLayouts[idx] = merge
            ? zrUtil.extend(this._itemLayouts[idx] || {}, layout)
            : layout;
    };
 
    /**
     * Clear all layout of single data item
     */
    listProto.clearItemLayouts = function () {
        this._itemLayouts.length = 0;
    };
 
    /**
     * Get visual property of single data item
     * @param {number} idx
     * @param {string} key
     * @param {boolean} ignoreParent
     */
    listProto.getItemVisual = function (idx, key, ignoreParent) {
        var itemVisual = this._itemVisuals[idx];
        var val = itemVisual && itemVisual[key];
        if (val == null && !ignoreParent) {
            // Use global visual property
            return this.getVisual(key);
        }
        return val;
    };
 
    /**
     * Set visual property of single data item
     *
     * @param {number} idx
     * @param {string|Object} key
     * @param {*} [value]
     *
     * @example
     *  setItemVisual(0, 'color', color);
     *  setItemVisual(0, {
     *      'color': color
     *  });
     */
    listProto.setItemVisual = function (idx, key, value) {
        var itemVisual = this._itemVisuals[idx] || {};
        this._itemVisuals[idx] = itemVisual;
 
        if (isObject(key)) {
            for (var name in key) {
                if (key.hasOwnProperty(name)) {
                    itemVisual[name] = key[name];
                }
            }
            return;
        }
        itemVisual[key] = value;
    };
 
    /**
     * Clear itemVisuals and list visual.
     */
    listProto.clearAllVisual = function () {
        this._visual = {};
        this._itemVisuals = [];
    };
 
    var setItemDataAndSeriesIndex = function (child) {
        child.seriesIndex = this.seriesIndex;
        child.dataIndex = this.dataIndex;
        child.dataType = this.dataType;
    };
    /**
     * Set graphic element relative to data. It can be set as null
     * @param {number} idx
     * @param {module:zrender/Element} [el]
     */
    listProto.setItemGraphicEl = function (idx, el) {
        var hostModel = this.hostModel;
 
        if (el) {
            // Add data index and series index for indexing the data by element
            // Useful in tooltip
            el.dataIndex = idx;
            el.dataType = this.dataType;
            el.seriesIndex = hostModel && hostModel.seriesIndex;
            if (el.type === 'group') {
                el.traverse(setItemDataAndSeriesIndex, el);
            }
        }
 
        this._graphicEls[idx] = el;
    };
 
    /**
     * @param {number} idx
     * @return {module:zrender/Element}
     */
    listProto.getItemGraphicEl = function (idx) {
        return this._graphicEls[idx];
    };
 
    /**
     * @param {Function} cb
     * @param {*} context
     */
    listProto.eachItemGraphicEl = function (cb, context) {
        zrUtil.each(this._graphicEls, function (el, idx) {
            if (el) {
                cb && cb.call(context, el, idx);
            }
        });
    };
 
    /**
     * Shallow clone a new list except visual and layout properties, and graph elements.
     * New list only change the indices.
     */
    listProto.cloneShallow = function () {
        var dimensionInfoList = zrUtil.map(this.dimensions, this.getDimensionInfo, this);
        var list = new List(dimensionInfoList, this.hostModel);
 
        // FIXME
        list._storage = this._storage;
 
        transferProperties(list, this);
 
 
        // Clone will not change the data extent and indices
        list.indices = this.indices.slice();
 
        if (this._extent) {
            list._extent = zrUtil.extend({}, this._extent);
        }
 
        return list;
    };
 
    /**
     * Wrap some method to add more feature
     * @param {string} methodName
     * @param {Function} injectFunction
     */
    listProto.wrapMethod = function (methodName, injectFunction) {
        var originalMethod = this[methodName];
        if (typeof originalMethod !== 'function') {
            return;
        }
        this.__wrappedMethods = this.__wrappedMethods || [];
        this.__wrappedMethods.push(methodName);
        this[methodName] = function () {
            var res = originalMethod.apply(this, arguments);
            return injectFunction.apply(this, [res].concat(zrUtil.slice(arguments)));
        };
    };
 
    // Methods that create a new list based on this list should be listed here.
    // Notice that those method should `RETURN` the new list.
    listProto.TRANSFERABLE_METHODS = ['cloneShallow', 'downSample', 'map'];
    // Methods that change indices of this list should be listed here.
    listProto.CHANGABLE_METHODS = ['filterSelf'];
 
    return List;
});
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/src/model/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/src/model/

Statements: 7.14% (4 / 56)      Branches: 0% (0 / 39)      Functions: 0% (0 / 15)      Lines: 7.14% (4 / 56)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/src/model/
File Statements Branches Functions Lines
Model.js 7.14% (4 / 56) 0% (0 / 39) 0% (0 / 15) 7.14% (4 / 56)
Code coverage report for node-npmtest-echarts/node_modules/echarts/src/model/Model.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/src/model/Model.js

Statements: 7.14% (4 / 56)      Branches: 0% (0 / 39)      Functions: 0% (0 / 15)      Lines: 7.14% (4 / 56)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198      2                         1                                                                                                                                                                                                                                                                                                     1                                   1                                
/**
 * @module echarts/model/Model
 */
define(function (require) {
 
    var zrUtil = require('zrender/core/util');
    var clazzUtil = require('../util/clazz');
    var env = require('zrender/core/env');
 
    /**
     * @alias module:echarts/model/Model
     * @constructor
     * @param {Object} option
     * @param {module:echarts/model/Model} [parentModel]
     * @param {module:echarts/model/Global} [ecModel]
     */
    function Model(option, parentModel, ecModel) {
        /**
         * @type {module:echarts/model/Model}
         * @readOnly
         */
        this.parentModel = parentModel;
 
        /**
         * @type {module:echarts/model/Global}
         * @readOnly
         */
        this.ecModel = ecModel;
 
        /**
         * @type {Object}
         * @protected
         */
        this.option = option;
 
        // Simple optimization
        // if (this.init) {
        //     if (arguments.length <= 4) {
        //         this.init(option, parentModel, ecModel, extraOpt);
        //     }
        //     else {
        //         this.init.apply(this, arguments);
        //     }
        // }
    }
 
    Model.prototype = {
 
        constructor: Model,
 
        /**
         * Model 的初始化函数
         * @param {Object} option
         */
        init: null,
 
        /**
         * 从新的 Option merge
         */
        mergeOption: function (option) {
            zrUtil.merge(this.option, option, true);
        },
 
        /**
         * @param {string|Array.<string>} path
         * @param {boolean} [ignoreParent=false]
         * @return {*}
         */
        get: function (path, ignoreParent) {
            if (path == null) {
                return this.option;
            }
 
            return doGet(
                this.option,
                this.parsePath(path),
                !ignoreParent && getParent(this, path)
            );
        },
 
        /**
         * @param {string} key
         * @param {boolean} [ignoreParent=false]
         * @return {*}
         */
        getShallow: function (key, ignoreParent) {
            var option = this.option;
 
            var val = option == null ? option : option[key];
            var parentModel = !ignoreParent && getParent(this, key);
            if (val == null && parentModel) {
                val = parentModel.getShallow(key);
            }
            return val;
        },
 
        /**
         * @param {string|Array.<string>} path
         * @param {module:echarts/model/Model} [parentModel]
         * @return {module:echarts/model/Model}
         */
        getModel: function (path, parentModel) {
            var obj = path == null
                ? this.option
                : doGet(this.option, path = this.parsePath(path));
 
            var thisParentModel;
            parentModel = parentModel || (
                (thisParentModel = getParent(this, path))
                    && thisParentModel.getModel(path)
            );
 
            return new Model(obj, parentModel, this.ecModel);
        },
 
        /**
         * If model has option
         */
        isEmpty: function () {
            return this.option == null;
        },
 
        restoreData: function () {},
 
        // Pending
        clone: function () {
            var Ctor = this.constructor;
            return new Ctor(zrUtil.clone(this.option));
        },
 
        setReadOnly: function (properties) {
            clazzUtil.setReadOnly(this, properties);
        },
 
        // If path is null/undefined, return null/undefined.
        parsePath: function(path) {
            if (typeof path === 'string') {
                path = path.split('.');
            }
            return path;
        },
 
        /**
         * @param {Function} getParentMethod
         *        param {Array.<string>|string} path
         *        return {module:echarts/model/Model}
         */
        customizeGetParent: function (getParentMethod) {
            clazzUtil.set(this, 'getParent', getParentMethod);
        },
 
        isAnimationEnabled: function () {
            if (!env.node) {
                if (this.option.animation != null) {
                    return !!this.option.animation;
                }
                else if (this.parentModel) {
                    return this.parentModel.isAnimationEnabled();
                }
            }
        }
    };
 
    function doGet(obj, pathArr, parentModel) {
        for (var i = 0; i < pathArr.length; i++) {
            // Ignore empty
            if (!pathArr[i]) {
                continue;
            }
            // obj could be number/string/... (like 0)
            obj = (obj && typeof obj === 'object') ? obj[pathArr[i]] : null;
            if (obj == null) {
                break;
            }
        }
        if (obj == null && parentModel) {
            obj = parentModel.get(pathArr);
        }
        return obj;
    }
 
    function getParent(model, path) {
        var getParentMethod = clazzUtil.get(model, 'getParent');
        return getParentMethod ? getParentMethod.call(model, path) : model.parentModel;
    }
 
    // Enable Model.extend.
    clazzUtil.enableClassExtend(Model);
 
    var mixin = zrUtil.mixin;
    mixin(Model, require('./mixin/lineStyle'));
    mixin(Model, require('./mixin/areaStyle'));
    mixin(Model, require('./mixin/textStyle'));
    mixin(Model, require('./mixin/itemStyle'));
 
    return Model;
});
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/src/util/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/src/util/

Statements: 2.3% (5 / 217)      Branches: 0% (0 / 154)      Functions: 0% (0 / 34)      Lines: 2.39% (5 / 209)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/src/util/
File Statements Branches Functions Lines
format.js 1.45% (1 / 69) 0% (0 / 43) 0% (0 / 13) 1.45% (1 / 69)
number.js 2.7% (4 / 148) 0% (0 / 111) 0% (0 / 21) 2.86% (4 / 140)
Code coverage report for node-npmtest-echarts/node_modules/echarts/src/util/format.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/src/util/format.js

Statements: 1.45% (1 / 69)      Branches: 0% (0 / 43)      Functions: 0% (0 / 13)      Lines: 1.45% (1 / 69)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 2002                                                                                                                                                                                                                                                                                                                                                                                                              
define(function (require) {
 
    var zrUtil = require('zrender/core/util');
    var numberUtil = require('./number');
    var textContain = require('zrender/contain/text');
 
    var formatUtil = {};
 
    /**
     * 每三位默认加,格式化
     * @param {string|number} x
     * @return {string}
     */
    formatUtil.addCommas = function (x) {
        if (isNaN(x)) {
            return '-';
        }
        x = (x + '').split('.');
        return x[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,'$1,')
               + (x.length > 1 ? ('.' + x[1]) : '');
    };
 
    /**
     * @param {string} str
     * @param {boolean} [upperCaseFirst=false]
     * @return {string} str
     */
    formatUtil.toCamelCase = function (str, upperCaseFirst) {
        str = (str || '').toLowerCase().replace(/-(.)/g, function(match, group1) {
            return group1.toUpperCase();
        });
 
        if (upperCaseFirst && str) {
            str = str.charAt(0).toUpperCase() + str.slice(1);
        }
 
        return str;
    };
 
    /**
     * Normalize css liked array configuration
     * e.g.
     *  3 => [3, 3, 3, 3]
     *  [4, 2] => [4, 2, 4, 2]
     *  [4, 3, 2] => [4, 3, 2, 3]
     * @param {number|Array.<number>} val
     */
    formatUtil.normalizeCssArray = function (val) {
        var len = val.length;
        if (typeof (val) === 'number') {
            return [val, val, val, val];
        }
        else if (len === 2) {
            // vertical | horizontal
            return [val[0], val[1], val[0], val[1]];
        }
        else if (len === 3) {
            // top | horizontal | bottom
            return [val[0], val[1], val[2], val[1]];
        }
        return val;
    };
 
    var encodeHTML = formatUtil.encodeHTML = function (source) {
        return String(source)
            .replace(/&/g, '&amp;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;')
            .replace(/"/g, '&quot;')
            .replace(/'/g, '&#39;');
    };
 
    var TPL_VAR_ALIAS = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
 
    var wrapVar = function (varName, seriesIdx) {
        return '{' + varName + (seriesIdx == null ? '' : seriesIdx) + '}';
    };
 
    /**
     * Template formatter
     * @param {string} tpl
     * @param {Array.<Object>|Object} paramsList
     * @param {boolean} [encode=false]
     * @return {string}
     */
    formatUtil.formatTpl = function (tpl, paramsList, encode) {
        if (!zrUtil.isArray(paramsList)) {
            paramsList = [paramsList];
        }
        var seriesLen = paramsList.length;
        if (!seriesLen) {
            return '';
        }
 
        var $vars = paramsList[0].$vars || [];
        for (var i = 0; i < $vars.length; i++) {
            var alias = TPL_VAR_ALIAS[i];
            var val = wrapVar(alias, 0);
            tpl = tpl.replace(wrapVar(alias), encode ? encodeHTML(val) : val);
        }
        for (var seriesIdx = 0; seriesIdx < seriesLen; seriesIdx++) {
            for (var k = 0; k < $vars.length; k++) {
                var val = paramsList[seriesIdx][$vars[k]];
                tpl = tpl.replace(
                    wrapVar(TPL_VAR_ALIAS[k], seriesIdx),
                    encode ? encodeHTML(val) : val
                );
            }
        }
 
        return tpl;
    };
 
    /**
     * simple Template formatter
     *
     * @param {string} tpl
     * @param {Object} param
     * @param {boolean} [encode=false]
     * @return {string}
     */
    formatUtil.formatTplSimple = function (tpl, param, encode) {
        zrUtil.each(param, function (value, key) {
            tpl = tpl.replace(
                '{' + key + '}',
                encode ? encodeHTML(value) : value
            );
        });
        return tpl;
    };
 
 
    /**
     * @param {string} str
     * @return {string}
     * @inner
     */
    var s2d = function (str) {
        return str < 10 ? ('0' + str) : str;
    };
 
    /**
     * ISO Date format
     * @param {string} tpl
     * @param {number} value
     * @param {boolean} [isUTC=false] Default in local time.
     *           see `module:echarts/scale/Time`
     *           and `module:echarts/util/number#parseDate`.
     * @inner
     */
    formatUtil.formatTime = function (tpl, value, isUTC) {
        if (tpl === 'week'
            || tpl === 'month'
            || tpl === 'quarter'
            || tpl === 'half-year'
            || tpl === 'year'
        ) {
            tpl = 'MM-dd\nyyyy';
        }
 
        var date = numberUtil.parseDate(value);
        var utc = isUTC ? 'UTC' : '';
        var y = date['get' + utc + 'FullYear']();
        var M = date['get' + utc + 'Month']() + 1;
        var d = date['get' + utc + 'Date']();
        var h = date['get' + utc + 'Hours']();
        var m = date['get' + utc + 'Minutes']();
        var s = date['get' + utc + 'Seconds']();
 
        tpl = tpl.replace('MM', s2d(M))
            .toLowerCase()
            .replace('yyyy', y)
            .replace('yy', y % 100)
            .replace('dd', s2d(d))
            .replace('d', d)
            .replace('hh', s2d(h))
            .replace('h', h)
            .replace('mm', s2d(m))
            .replace('m', m)
            .replace('ss', s2d(s))
            .replace('s', s);
 
        return tpl;
    };
 
    /**
     * Capital first
     * @param {string} str
     * @return {string}
     */
    formatUtil.capitalFirst = function (str) {
        return str ? str.charAt(0).toUpperCase() + str.substr(1) : str;
    };
 
    formatUtil.truncateText = textContain.truncateText;
 
    return formatUtil;
});
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/src/util/number.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/src/util/number.js

Statements: 2.7% (4 / 148)      Branches: 0% (0 / 111)      Functions: 0% (0 / 21)      Lines: 2.86% (4 / 140)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405          2           1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   1                                                                                                                                                                                         1                                                    
/**
 * 数值处理模块
 * @module echarts/util/number
 */
 
define(function (require) {
 
    var number = {};
 
    var RADIAN_EPSILON = 1e-4;
 
    function _trim(str) {
        return str.replace(/^\s+/, '').replace(/\s+$/, '');
    }
 
    /**
     * Linear mapping a value from domain to range
     * @memberOf module:echarts/util/number
     * @param  {(number|Array.<number>)} val
     * @param  {Array.<number>} domain Domain extent domain[0] can be bigger than domain[1]
     * @param  {Array.<number>} range  Range extent range[0] can be bigger than range[1]
     * @param  {boolean} clamp
     * @return {(number|Array.<number>}
     */
    number.linearMap = function (val, domain, range, clamp) {
        var subDomain = domain[1] - domain[0];
        var subRange = range[1] - range[0];
 
        if (subDomain === 0) {
            return subRange === 0
                ? range[0]
                : (range[0] + range[1]) / 2;
        }
 
        // Avoid accuracy problem in edge, such as
        // 146.39 - 62.83 === 83.55999999999999.
        // See echarts/test/ut/spec/util/number.js#linearMap#accuracyError
        // It is a little verbose for efficiency considering this method
        // is a hotspot.
        if (clamp) {
            if (subDomain > 0) {
                if (val <= domain[0]) {
                    return range[0];
                }
                else if (val >= domain[1]) {
                    return range[1];
                }
            }
            else {
                if (val >= domain[0]) {
                    return range[0];
                }
                else if (val <= domain[1]) {
                    return range[1];
                }
            }
        }
        else {
            if (val === domain[0]) {
                return range[0];
            }
            if (val === domain[1]) {
                return range[1];
            }
        }
 
        return (val - domain[0]) / subDomain * subRange + range[0];
    };
 
    /**
     * Convert a percent string to absolute number.
     * Returns NaN if percent is not a valid string or number
     * @memberOf module:echarts/util/number
     * @param {string|number} percent
     * @param {number} all
     * @return {number}
     */
    number.parsePercent = function(percent, all) {
        switch (percent) {
            case 'center':
            case 'middle':
                percent = '50%';
                break;
            case 'left':
            case 'top':
                percent = '0%';
                break;
            case 'right':
            case 'bottom':
                percent = '100%';
                break;
        }
        if (typeof percent === 'string') {
            if (_trim(percent).match(/%$/)) {
                return parseFloat(percent) / 100 * all;
            }
 
            return parseFloat(percent);
        }
 
        return percent == null ? NaN : +percent;
    };
 
    /**
     * (1) Fix rounding error of float numbers.
     * (2) Support return string to avoid scientific notation like '3.5e-7'.
     *
     * @param {number} x
     * @param {number} [precision]
     * @param {boolean} [returnStr]
     * @return {number|string}
     */
    number.round = function (x, precision, returnStr) {
        if (precision == null) {
            precision = 10;
        }
        // Avoid range error
        precision = Math.min(Math.max(0, precision), 20);
        x = (+x).toFixed(precision);
        return returnStr ? x : +x;
    };
 
    number.asc = function (arr) {
        arr.sort(function (a, b) {
            return a - b;
        });
        return arr;
    };
 
    /**
     * Get precision
     * @param {number} val
     */
    number.getPrecision = function (val) {
        val = +val;
        if (isNaN(val)) {
            return 0;
        }
        // It is much faster than methods converting number to string as follows
        //      var tmp = val.toString();
        //      return tmp.length - 1 - tmp.indexOf('.');
        // especially when precision is low
        var e = 1;
        var count = 0;
        while (Math.round(val * e) / e !== val) {
            e *= 10;
            count++;
        }
        return count;
    };
 
    /**
     * @param {string|number} val
     * @return {number}
     */
    number.getPrecisionSafe = function (val) {
        var str = val.toString();
 
        // Consider scientific notation: '3.4e-12' '3.4e+12'
        var eIndex = str.indexOf('e');
        if (eIndex > 0) {
            var precision = +str.slice(eIndex + 1);
            return precision < 0 ? -precision : 0;
        }
        else {
            var dotIndex = str.indexOf('.');
            return dotIndex < 0 ? 0 : str.length - 1 - dotIndex;
        }
    };
 
    /**
     * Minimal dicernible data precisioin according to a single pixel.
     *
     * @param {Array.<number>} dataExtent
     * @param {Array.<number>} pixelExtent
     * @return {number} precision
     */
    number.getPixelPrecision = function (dataExtent, pixelExtent) {
        var log = Math.log;
        var LN10 = Math.LN10;
        var dataQuantity = Math.floor(log(dataExtent[1] - dataExtent[0]) / LN10);
        var sizeQuantity = Math.round(log(Math.abs(pixelExtent[1] - pixelExtent[0])) / LN10);
        // toFixed() digits argument must be between 0 and 20.
        var precision = Math.min(Math.max(-dataQuantity + sizeQuantity, 0), 20);
        return !isFinite(precision) ? 20 : precision;
    };
 
    // Number.MAX_SAFE_INTEGER, ie do not support.
    number.MAX_SAFE_INTEGER = 9007199254740991;
 
    /**
     * To 0 - 2 * PI, considering negative radian.
     * @param {number} radian
     * @return {number}
     */
    number.remRadian = function (radian) {
        var pi2 = Math.PI * 2;
        return (radian % pi2 + pi2) % pi2;
    };
 
    /**
     * @param {type} radian
     * @return {boolean}
     */
    number.isRadianAroundZero = function (val) {
        return val > -RADIAN_EPSILON && val < RADIAN_EPSILON;
    };
 
    var TIME_REG = /^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d\d)(?::(\d\d)(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/; // jshint ignore:line
 
    /**
     * @return {number} in minutes
     */
    number.getTimezoneOffset = function () {
        return (new Date()).getTimezoneOffset();
    };
 
    /**
     * @param {string|Date|number} value These values can be accepted:
     *   + An instance of Date, represent a time in its own time zone.
     *   + Or string in a subset of ISO 8601, only including:
     *     + only year, month, date: '2012-03', '2012-03-01', '2012-03-01 05', '2012-03-01 05:06',
     *     + separated with T or space: '2012-03-01T12:22:33.123', '2012-03-01 12:22:33.123',
     *     + time zone: '2012-03-01T12:22:33Z', '2012-03-01T12:22:33+8000', '2012-03-01T12:22:33-05:00',
     *     all of which will be treated as local time if time zone is not specified
     *     (see <https://momentjs.com/>).
     *   + Or other string format, including (all of which will be treated as loacal time):
     *     '2012', '2012-3-1', '2012/3/1', '2012/03/01',
     *     '2009/6/12 2:00', '2009/6/12 2:05:08', '2009/6/12 2:05:08.123'
     *   + a timestamp, which represent a time in UTC.
     * @return {Date} date
     */
    number.parseDate = function (value) {
        if (value instanceof Date) {
            return value;
        }
        else if (typeof value === 'string') {
            // Different browsers parse date in different way, so we parse it manually.
            // Some other issues:
            // new Date('1970-01-01') is UTC,
            // new Date('1970/01/01') and new Date('1970-1-01') is local.
            // See issue #3623
            var match = TIME_REG.exec(value);
 
            if (!match) {
                // return Invalid Date.
                return new Date(NaN);
            }
 
            var timezoneOffset = number.getTimezoneOffset();
            var timeOffset = !match[8]
                ? 0
                : match[8].toUpperCase() === 'Z'
                ? timezoneOffset
                : +match[8].slice(0, 3) * 60 + timezoneOffset;
 
            // match[n] can only be string or undefined.
            // But take care of '12' + 1 => '121'.
            return new Date(
                +match[1],
                +(match[2] || 1) - 1,
                +match[3] || 1,
                +match[4] || 0,
                +(match[5] || 0) - timeOffset,
                +match[6] || 0,
                +match[7] || 0
            );
        }
        else if (value == null) {
            return new Date(NaN);
        }
 
        return new Date(Math.round(value));
    };
 
    /**
     * Quantity of a number. e.g. 0.1, 1, 10, 100
     *
     * @param  {number} val
     * @return {number}
     */
    number.quantity = function (val) {
        return Math.pow(10, quantityExponent(val));
    };
 
    function quantityExponent(val) {
        return Math.floor(Math.log(val) / Math.LN10);
    }
 
    /**
     * find a “nice” number approximately equal to x. Round the number if round = true,
     * take ceiling if round = false. The primary observation is that the “nicest”
     * numbers in decimal are 1, 2, and 5, and all power-of-ten multiples of these numbers.
     *
     * See "Nice Numbers for Graph Labels" of Graphic Gems.
     *
     * @param  {number} val Non-negative value.
     * @param  {boolean} round
     * @return {number}
     */
    number.nice = function (val, round) {
        var exponent = quantityExponent(val);
        var exp10 = Math.pow(10, exponent);
        var f = val / exp10; // 1 <= f < 10
        var nf;
        if (round) {
            if (f < 1.5) { nf = 1; }
            else if (f < 2.5) { nf = 2; }
            else if (f < 4) { nf = 3; }
            else if (f < 7) { nf = 5; }
            else { nf = 10; }
        }
        else {
            if (f < 1) { nf = 1; }
            else if (f < 2) { nf = 2; }
            else if (f < 3) { nf = 3; }
            else if (f < 5) { nf = 5; }
            else { nf = 10; }
        }
        val = nf * exp10;
 
        // Fix 3 * 0.1 === 0.30000000000000004 issue (see IEEE 754).
        // 20 is the uppper bound of toFixed.
        return exponent >= -20 ? +val.toFixed(exponent < 0 ? -exponent : 0) : val;
    };
 
    /**
     * Order intervals asc, and split them when overlap.
     * expect(numberUtil.reformIntervals([
     *     {interval: [18, 62], close: [1, 1]},
     *     {interval: [-Infinity, -70], close: [0, 0]},
     *     {interval: [-70, -26], close: [1, 1]},
     *     {interval: [-26, 18], close: [1, 1]},
     *     {interval: [62, 150], close: [1, 1]},
     *     {interval: [106, 150], close: [1, 1]},
     *     {interval: [150, Infinity], close: [0, 0]}
     * ])).toEqual([
     *     {interval: [-Infinity, -70], close: [0, 0]},
     *     {interval: [-70, -26], close: [1, 1]},
     *     {interval: [-26, 18], close: [0, 1]},
     *     {interval: [18, 62], close: [0, 1]},
     *     {interval: [62, 150], close: [0, 1]},
     *     {interval: [150, Infinity], close: [0, 0]}
     * ]);
     * @param {Array.<Object>} list, where `close` mean open or close
     *        of the interval, and Infinity can be used.
     * @return {Array.<Object>} The origin list, which has been reformed.
     */
    number.reformIntervals = function (list) {
        list.sort(function (a, b) {
            return littleThan(a, b, 0) ? -1 : 1;
        });
 
        var curr = -Infinity;
        var currClose = 1;
        for (var i = 0; i < list.length;) {
            var interval = list[i].interval;
            var close = list[i].close;
 
            for (var lg = 0; lg < 2; lg++) {
                if (interval[lg] <= curr) {
                    interval[lg] = curr;
                    close[lg] = !lg ? 1 - currClose : 1;
                }
                curr = interval[lg];
                currClose = close[lg];
            }
 
            if (interval[0] === interval[1] && close[0] * close[1] !== 1) {
                list.splice(i, 1);
            }
            else {
                i++;
            }
        }
 
        return list;
 
        function littleThan(a, b, lg) {
            return a.interval[lg] < b.interval[lg]
                || (
                    a.interval[lg] === b.interval[lg]
                    && (
                        (a.close[lg] - b.close[lg] === (!lg ? 1 : -1))
                        || (!lg && littleThan(a, b, 1))
                    )
                );
        }
    };
 
    /**
     * parseFloat NaNs numeric-cast false positives (null|true|false|"")
     * ...but misinterprets leading-number strings, particularly hex literals ("0x...")
     * subtraction forces infinities to NaN
     *
     * @param {*} v
     * @return {boolean}
     */
    number.isNumeric = function (v) {
        return v - parseFloat(v) >= 0;
    };
 
    return number;
});
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/theme/

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/theme/

Statements: 58.68% (71 / 121)      Branches: 40% (48 / 120)      Functions: 68% (17 / 25)      Lines: 57.63% (68 / 118)      Ignored: none     

All files » node-npmtest-echarts/node_modules/echarts/theme/
File Statements Branches Functions Lines
dark.js 68.42% (13 / 19) 40% (6 / 15) 75% (3 / 4) 68.42% (13 / 19)
default.js 53.85% (7 / 13) 40% (6 / 15) 66.67% (2 / 3) 53.85% (7 / 13)
halloween.js 46.67% (7 / 15) 40% (6 / 15) 66.67% (2 / 3) 46.67% (7 / 15)
infographic.js 60% (9 / 15) 40% (6 / 15) 66.67% (2 / 3) 57.14% (8 / 14)
macarons.js 60% (9 / 15) 40% (6 / 15) 66.67% (2 / 3) 60% (9 / 15)
roma.js 60% (9 / 15) 40% (6 / 15) 66.67% (2 / 3) 57.14% (8 / 14)
shine.js 60% (9 / 15) 40% (6 / 15) 66.67% (2 / 3) 57.14% (8 / 14)
vintage.js 57.14% (8 / 14) 40% (6 / 15) 66.67% (2 / 3) 57.14% (8 / 14)
Code coverage report for node-npmtest-echarts/node_modules/echarts/theme/dark.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/theme/dark.js

Statements: 68.42% (13 / 19)      Branches: 40% (6 / 15)      Functions: 75% (3 / 4)      Lines: 68.42% (13 / 19)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 1531 1     1   1           1         1       1 1 4                                                           1 1                                                                                                                                                                                             1 1    
(function (root, factory) {
    Iif (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['exports', 'echarts'], factory);
    } else Eif (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
        // CommonJS
        factory(exports, require('echarts'));
    } else {
        // Browser globals
        factory({}, root.echarts);
    }
}(this, function (exports, echarts) {
    var log = function (msg) {
        if (typeof console !== 'undefined') {
            console && console.error && console.error(msg);
        }
    };
    Iif (!echarts) {
        log('ECharts is not Loaded');
        return;
    }
    var contrastColor = '#eee';
    var axisCommon = function () {
        return {
            axisLine: {
                lineStyle: {
                    color: contrastColor
                }
            },
            axisTick: {
                lineStyle: {
                    color: contrastColor
                }
            },
            axisLabel: {
                textStyle: {
                    color: contrastColor
                }
            },
            splitLine: {
                lineStyle: {
                    type: 'dashed',
                    color: '#aaa'
                }
            },
            splitArea: {
                areaStyle: {
                    color: contrastColor
                }
            }
        };
    };
 
    var colorPalette = ['#dd6b66','#759aa0','#e69d87','#8dc1a9','#ea7e53','#eedd78','#73a373','#73b9bc','#7289ab', '#91ca8c','#f49f42'];
    var theme = {
        color: colorPalette,
        backgroundColor: '#333',
        tooltip: {
            axisPointer: {
                lineStyle: {
                    color: contrastColor
                },
                crossStyle: {
                    color: contrastColor
                }
            }
        },
        legend: {
            textStyle: {
                color: contrastColor
            }
        },
        textStyle: {
            color: contrastColor
        },
        title: {
            textStyle: {
                color: contrastColor
            }
        },
        toolbox: {
            iconStyle: {
                normal: {
                    borderColor: contrastColor
                }
            }
        },
        dataZoom: {
            textStyle: {
                color: contrastColor
            }
        },
        visualMap: {
            textStyle: {
                color: contrastColor
            }
        },
        timeline: {
            lineStyle: {
                color: contrastColor
            },
            itemStyle: {
                normal: {
                    color: colorPalette[1]
                }
            },
            label: {
                normal: {
                    textStyle: {
                        color: contrastColor
                    }
                }
            },
            controlStyle: {
                normal: {
                    color: contrastColor,
                    borderColor: contrastColor
                }
            }
        },
        timeAxis: axisCommon(),
        logAxis: axisCommon(),
        valueAxis: axisCommon(),
        categoryAxis: axisCommon(),
 
        line: {
            symbol: 'circle'
        },
        graph: {
            color: colorPalette
        },
        gauge: {
            title: {
                textStyle: {
                    color: contrastColor
                }
            }
        },
        candlestick: {
            itemStyle: {
                normal: {
                    color: '#FD1050',
                    color0: '#0CF49B',
                    borderColor: '#FD1050',
                    borderColor0: '#0CF49B'
                }
            }
        }
    };
    theme.categoryAxis.splitLine.show = false;
    echarts.registerTheme('dark', theme);
}));
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/theme/default.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/theme/default.js

Statements: 53.85% (7 / 13)      Branches: 40% (6 / 15)      Functions: 66.67% (2 / 3)      Lines: 53.85% (7 / 13)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 241 1     1   1           1         1       1    
(function (root, factory) {
    Iif (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['exports', 'echarts'], factory);
    } else Eif (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
        // CommonJS
        factory(exports, require('echarts'));
    } else {
        // Browser globals
        factory({}, root.echarts);
    }
}(this, function (exports, echarts) {
    var log = function (msg) {
        if (typeof console !== 'undefined') {
            console && console.error && console.error(msg);
        }
    };
    Iif (!echarts) {
        log('ECharts is not Loaded');
        return;
    }
    echarts.registerTheme('default', {});
}));
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/theme/halloween.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/theme/halloween.js

Statements: 46.67% (7 / 15)      Branches: 40% (6 / 15)      Functions: 66.67% (2 / 3)      Lines: 46.67% (7 / 15)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 5302 2     2   2           2         2       2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
(function (root, factory) {
    Iif (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['exports', 'echarts'], factory);
    } else Eif (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
        // CommonJS
        factory(exports, require('echarts'));
    } else {
        // Browser globals
        factory({}, root.echarts);
    }
}(this, function (exports, echarts) {
    var log = function (msg) {
        if (typeof console !== 'undefined') {
            console && console.error && console.error(msg);
        }
    };
    Iif (!echarts) {
        log('ECharts is not Loaded');
        return;
    }
    var img = new Image();
    img.src = 'data:image/jpeg;charset=utf-8;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABkAAD/4QNxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6NTY6MjcgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6NkQyRUZBNDE0RTIwNjgxMTgyMkFEMTNCMDBCREZDQTUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RjUyNzZCMEM5NTFBMTFFNkFGN0JGOUFGQTREMUM0MTciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RjUyNzZCMEI5NTFBMTFFNkFGN0JGOUFGQTREMUM0MTciIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjcyMkVGQTQxNEUyMDY4MTE4MjJBRDEzQjAwQkRGQ0E1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjZEMkVGQTQxNEUyMDY4MTE4MjJBRDEzQjAwQkRGQ0E1Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwv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';
 
    echarts.registerTheme('halloween', {
        "color": [
            "#cf4830",
            "#e08929",
            "#eed841",
            "#538a41",
            "#9d3323",
            "#872168",
            "#f4a929"
        ],
        "backgroundColor": {
            "type": "pattern",
            "repeat": "repeat",
            "image": img
        },
        "textStyle": {},
        "title": {
            "textStyle": {
                "color": "#ffaf51"
            },
            "subtextStyle": {
                "color": "#eeeeee"
            }
        },
        "line": {
            "itemStyle": {
                "normal": {
                    "borderWidth": "2"
                }
            },
            "lineStyle": {
                "normal": {
                    "width": "3"
                }
            },
            "symbolSize": "8",
            "symbol": "path://M237.062,81.761L237.062,81.761c-12.144-14.24-25.701-20.1-40.68-19.072 c-10.843,0.747-20.938,5.154-30.257,13.127c-9.51-5.843-19.8-9.227-30.859-10.366c0.521-3.197,1.46-6.306,2.85-9.363 c3.458-7.038,8.907-12.741,16.331-17.296c-5.609-3.384-11.227-6.799-16.854-10.279c-16.257,8.104-25.06,20.601-26.463,38.417 c-7.599,1.705-14.685,4.486-21.247,8.437c-9.164-7.677-18.996-11.917-29.496-12.632c-14.819-0.998-28.467,4.787-40.938,18.827 C6.445,96.182,0,114.867,0,136.242c-0.007,6.371,0.674,12.646,2.053,18.738c4.593,22.785,15.398,41.367,32.558,55.344 c15.43,12.773,29.901,18.023,43.362,16.981c7.074-0.561,13.624-3.977,19.685-10.192c10.534,5.49,20.391,8.217,29.561,8.203 c9.856-0.012,20.236-2.953,31.125-8.898c6.227,6.692,12.966,10.346,20.211,10.933c13.795,1.073,28.614-4.111,44.377-16.84 c17.49-14.104,28.043-32.79,31.796-55.485c0.836-5.624,1.272-11.292,1.272-16.966C255.998,115.814,249.707,96.601,237.062,81.761z  M54.795,97.7l40.661,14.496c-4.402,8.811-10.766,13.219-19.06,13.219c-2.542,0-4.917-0.419-7.122-1.274 C58.103,118.38,53.263,109.572,54.795,97.7z M150.613,185.396l-9.156-8.389l-7.619,12.951c-3.391,0.341-6.615,0.514-9.665,0.514 c-4.401,0-8.635-0.263-12.708-0.777l-8.634-14.973l-9.151,9.909c-4.91-2.717-9.15-5.856-12.708-9.413 c-8.81-8.295-13.384-17.959-13.727-28.97c2.877,1.692,7.427,3.461,13.675,5.308l10.636,13.629l9.44-9.852 c4.734,0.702,9.234,1.12,13.466,1.275l10.689,11.498l9.671-11.949c3.559-0.173,7.285-0.515,11.182-1.01l9.924,10.159l10.933-14.227 c5.931-1.351,11.196-2.798,15.771-4.323C179.747,163.538,169.068,176.414,150.613,185.396z M175.258,124.907 c-2.209,0.849-4.66,1.273-7.369,1.273c-8.134,0-14.489-4.415-19.052-13.224l40.905-14.477 C191.105,110.331,186.273,119.141,175.258,124.907z",
            "smooth": false
        },
        "radar": {
            "itemStyle": {
                "normal": {
                    "borderWidth": "2"
                }
            },
            "lineStyle": {
                "normal": {
                    "width": "3"
                }
            },
            "symbolSize": "8",
            "symbol": "path://M237.062,81.761L237.062,81.761c-12.144-14.24-25.701-20.1-40.68-19.072 c-10.843,0.747-20.938,5.154-30.257,13.127c-9.51-5.843-19.8-9.227-30.859-10.366c0.521-3.197,1.46-6.306,2.85-9.363 c3.458-7.038,8.907-12.741,16.331-17.296c-5.609-3.384-11.227-6.799-16.854-10.279c-16.257,8.104-25.06,20.601-26.463,38.417 c-7.599,1.705-14.685,4.486-21.247,8.437c-9.164-7.677-18.996-11.917-29.496-12.632c-14.819-0.998-28.467,4.787-40.938,18.827 C6.445,96.182,0,114.867,0,136.242c-0.007,6.371,0.674,12.646,2.053,18.738c4.593,22.785,15.398,41.367,32.558,55.344 c15.43,12.773,29.901,18.023,43.362,16.981c7.074-0.561,13.624-3.977,19.685-10.192c10.534,5.49,20.391,8.217,29.561,8.203 c9.856-0.012,20.236-2.953,31.125-8.898c6.227,6.692,12.966,10.346,20.211,10.933c13.795,1.073,28.614-4.111,44.377-16.84 c17.49-14.104,28.043-32.79,31.796-55.485c0.836-5.624,1.272-11.292,1.272-16.966C255.998,115.814,249.707,96.601,237.062,81.761z  M54.795,97.7l40.661,14.496c-4.402,8.811-10.766,13.219-19.06,13.219c-2.542,0-4.917-0.419-7.122-1.274 C58.103,118.38,53.263,109.572,54.795,97.7z M150.613,185.396l-9.156-8.389l-7.619,12.951c-3.391,0.341-6.615,0.514-9.665,0.514 c-4.401,0-8.635-0.263-12.708-0.777l-8.634-14.973l-9.151,9.909c-4.91-2.717-9.15-5.856-12.708-9.413 c-8.81-8.295-13.384-17.959-13.727-28.97c2.877,1.692,7.427,3.461,13.675,5.308l10.636,13.629l9.44-9.852 c4.734,0.702,9.234,1.12,13.466,1.275l10.689,11.498l9.671-11.949c3.559-0.173,7.285-0.515,11.182-1.01l9.924,10.159l10.933-14.227 c5.931-1.351,11.196-2.798,15.771-4.323C179.747,163.538,169.068,176.414,150.613,185.396z M175.258,124.907 c-2.209,0.849-4.66,1.273-7.369,1.273c-8.134,0-14.489-4.415-19.052-13.224l40.905-14.477 C191.105,110.331,186.273,119.141,175.258,124.907z",
            "smooth": false
        },
        "bar": {
            "itemStyle": {
                "normal": {
                    "barBorderWidth": "0",
                    "barBorderColor": "#ccc"
                },
                "emphasis": {
                    "barBorderWidth": "0",
                    "barBorderColor": "#ccc"
                }
            }
        },
        "pie": {
            "itemStyle": {
                "normal": {
                    "borderWidth": "0",
                    "borderColor": "#ccc"
                },
                "emphasis": {
                    "borderWidth": "0",
                    "borderColor": "#ccc"
                }
            },
            "symbol": "path://M237.062,81.761L237.062,81.761c-12.144-14.24-25.701-20.1-40.68-19.072 c-10.843,0.747-20.938,5.154-30.257,13.127c-9.51-5.843-19.8-9.227-30.859-10.366c0.521-3.197,1.46-6.306,2.85-9.363 c3.458-7.038,8.907-12.741,16.331-17.296c-5.609-3.384-11.227-6.799-16.854-10.279c-16.257,8.104-25.06,20.601-26.463,38.417 c-7.599,1.705-14.685,4.486-21.247,8.437c-9.164-7.677-18.996-11.917-29.496-12.632c-14.819-0.998-28.467,4.787-40.938,18.827 C6.445,96.182,0,114.867,0,136.242c-0.007,6.371,0.674,12.646,2.053,18.738c4.593,22.785,15.398,41.367,32.558,55.344 c15.43,12.773,29.901,18.023,43.362,16.981c7.074-0.561,13.624-3.977,19.685-10.192c10.534,5.49,20.391,8.217,29.561,8.203 c9.856-0.012,20.236-2.953,31.125-8.898c6.227,6.692,12.966,10.346,20.211,10.933c13.795,1.073,28.614-4.111,44.377-16.84 c17.49-14.104,28.043-32.79,31.796-55.485c0.836-5.624,1.272-11.292,1.272-16.966C255.998,115.814,249.707,96.601,237.062,81.761z  M54.795,97.7l40.661,14.496c-4.402,8.811-10.766,13.219-19.06,13.219c-2.542,0-4.917-0.419-7.122-1.274 C58.103,118.38,53.263,109.572,54.795,97.7z M150.613,185.396l-9.156-8.389l-7.619,12.951c-3.391,0.341-6.615,0.514-9.665,0.514 c-4.401,0-8.635-0.263-12.708-0.777l-8.634-14.973l-9.151,9.909c-4.91-2.717-9.15-5.856-12.708-9.413 c-8.81-8.295-13.384-17.959-13.727-28.97c2.877,1.692,7.427,3.461,13.675,5.308l10.636,13.629l9.44-9.852 c4.734,0.702,9.234,1.12,13.466,1.275l10.689,11.498l9.671-11.949c3.559-0.173,7.285-0.515,11.182-1.01l9.924,10.159l10.933-14.227 c5.931-1.351,11.196-2.798,15.771-4.323C179.747,163.538,169.068,176.414,150.613,185.396z M175.258,124.907 c-2.209,0.849-4.66,1.273-7.369,1.273c-8.134,0-14.489-4.415-19.052-13.224l40.905-14.477 C191.105,110.331,186.273,119.141,175.258,124.907z"
        },
        "scatter": {
            "itemStyle": {
                "normal": {
                    "borderWidth": "0",
                    "borderColor": "#ccc"
                },
                "emphasis": {
                    "borderWidth": "0",
                    "borderColor": "#ccc"
                }
            },
            "symbol": "path://M237.062,81.761L237.062,81.761c-12.144-14.24-25.701-20.1-40.68-19.072 c-10.843,0.747-20.938,5.154-30.257,13.127c-9.51-5.843-19.8-9.227-30.859-10.366c0.521-3.197,1.46-6.306,2.85-9.363 c3.458-7.038,8.907-12.741,16.331-17.296c-5.609-3.384-11.227-6.799-16.854-10.279c-16.257,8.104-25.06,20.601-26.463,38.417 c-7.599,1.705-14.685,4.486-21.247,8.437c-9.164-7.677-18.996-11.917-29.496-12.632c-14.819-0.998-28.467,4.787-40.938,18.827 C6.445,96.182,0,114.867,0,136.242c-0.007,6.371,0.674,12.646,2.053,18.738c4.593,22.785,15.398,41.367,32.558,55.344 c15.43,12.773,29.901,18.023,43.362,16.981c7.074-0.561,13.624-3.977,19.685-10.192c10.534,5.49,20.391,8.217,29.561,8.203 c9.856-0.012,20.236-2.953,31.125-8.898c6.227,6.692,12.966,10.346,20.211,10.933c13.795,1.073,28.614-4.111,44.377-16.84 c17.49-14.104,28.043-32.79,31.796-55.485c0.836-5.624,1.272-11.292,1.272-16.966C255.998,115.814,249.707,96.601,237.062,81.761z  M54.795,97.7l40.661,14.496c-4.402,8.811-10.766,13.219-19.06,13.219c-2.542,0-4.917-0.419-7.122-1.274 C58.103,118.38,53.263,109.572,54.795,97.7z M150.613,185.396l-9.156-8.389l-7.619,12.951c-3.391,0.341-6.615,0.514-9.665,0.514 c-4.401,0-8.635-0.263-12.708-0.777l-8.634-14.973l-9.151,9.909c-4.91-2.717-9.15-5.856-12.708-9.413 c-8.81-8.295-13.384-17.959-13.727-28.97c2.877,1.692,7.427,3.461,13.675,5.308l10.636,13.629l9.44-9.852 c4.734,0.702,9.234,1.12,13.466,1.275l10.689,11.498l9.671-11.949c3.559-0.173,7.285-0.515,11.182-1.01l9.924,10.159l10.933-14.227 c5.931-1.351,11.196-2.798,15.771-4.323C179.747,163.538,169.068,176.414,150.613,185.396z M175.258,124.907 c-2.209,0.849-4.66,1.273-7.369,1.273c-8.134,0-14.489-4.415-19.052-13.224l40.905-14.477 C191.105,110.331,186.273,119.141,175.258,124.907z"
        },
        "boxplot": {
            "itemStyle": {
                "normal": {
                    "borderWidth": "0",
                    "borderColor": "#ccc"
                },
                "emphasis": {
                    "borderWidth": "0",
                    "borderColor": "#ccc"
                }
            },
            "symbol": "path://M237.062,81.761L237.062,81.761c-12.144-14.24-25.701-20.1-40.68-19.072 c-10.843,0.747-20.938,5.154-30.257,13.127c-9.51-5.843-19.8-9.227-30.859-10.366c0.521-3.197,1.46-6.306,2.85-9.363 c3.458-7.038,8.907-12.741,16.331-17.296c-5.609-3.384-11.227-6.799-16.854-10.279c-16.257,8.104-25.06,20.601-26.463,38.417 c-7.599,1.705-14.685,4.486-21.247,8.437c-9.164-7.677-18.996-11.917-29.496-12.632c-14.819-0.998-28.467,4.787-40.938,18.827 C6.445,96.182,0,114.867,0,136.242c-0.007,6.371,0.674,12.646,2.053,18.738c4.593,22.785,15.398,41.367,32.558,55.344 c15.43,12.773,29.901,18.023,43.362,16.981c7.074-0.561,13.624-3.977,19.685-10.192c10.534,5.49,20.391,8.217,29.561,8.203 c9.856-0.012,20.236-2.953,31.125-8.898c6.227,6.692,12.966,10.346,20.211,10.933c13.795,1.073,28.614-4.111,44.377-16.84 c17.49-14.104,28.043-32.79,31.796-55.485c0.836-5.624,1.272-11.292,1.272-16.966C255.998,115.814,249.707,96.601,237.062,81.761z  M54.795,97.7l40.661,14.496c-4.402,8.811-10.766,13.219-19.06,13.219c-2.542,0-4.917-0.419-7.122-1.274 C58.103,118.38,53.263,109.572,54.795,97.7z M150.613,185.396l-9.156-8.389l-7.619,12.951c-3.391,0.341-6.615,0.514-9.665,0.514 c-4.401,0-8.635-0.263-12.708-0.777l-8.634-14.973l-9.151,9.909c-4.91-2.717-9.15-5.856-12.708-9.413 c-8.81-8.295-13.384-17.959-13.727-28.97c2.877,1.692,7.427,3.461,13.675,5.308l10.636,13.629l9.44-9.852 c4.734,0.702,9.234,1.12,13.466,1.275l10.689,11.498l9.671-11.949c3.559-0.173,7.285-0.515,11.182-1.01l9.924,10.159l10.933-14.227 c5.931-1.351,11.196-2.798,15.771-4.323C179.747,163.538,169.068,176.414,150.613,185.396z M175.258,124.907 c-2.209,0.849-4.66,1.273-7.369,1.273c-8.134,0-14.489-4.415-19.052-13.224l40.905-14.477 C191.105,110.331,186.273,119.141,175.258,124.907z"
        },
        "parallel": {
            "itemStyle": {
                "normal": {
                    "borderWidth": "0",
                    "borderColor": "#ccc"
                },
                "emphasis": {
                    "borderWidth": "0",
                    "borderColor": "#ccc"
                }
            },
            "symbol": "path://M237.062,81.761L237.062,81.761c-12.144-14.24-25.701-20.1-40.68-19.072 c-10.843,0.747-20.938,5.154-30.257,13.127c-9.51-5.843-19.8-9.227-30.859-10.366c0.521-3.197,1.46-6.306,2.85-9.363 c3.458-7.038,8.907-12.741,16.331-17.296c-5.609-3.384-11.227-6.799-16.854-10.279c-16.257,8.104-25.06,20.601-26.463,38.417 c-7.599,1.705-14.685,4.486-21.247,8.437c-9.164-7.677-18.996-11.917-29.496-12.632c-14.819-0.998-28.467,4.787-40.938,18.827 C6.445,96.182,0,114.867,0,136.242c-0.007,6.371,0.674,12.646,2.053,18.738c4.593,22.785,15.398,41.367,32.558,55.344 c15.43,12.773,29.901,18.023,43.362,16.981c7.074-0.561,13.624-3.977,19.685-10.192c10.534,5.49,20.391,8.217,29.561,8.203 c9.856-0.012,20.236-2.953,31.125-8.898c6.227,6.692,12.966,10.346,20.211,10.933c13.795,1.073,28.614-4.111,44.377-16.84 c17.49-14.104,28.043-32.79,31.796-55.485c0.836-5.624,1.272-11.292,1.272-16.966C255.998,115.814,249.707,96.601,237.062,81.761z  M54.795,97.7l40.661,14.496c-4.402,8.811-10.766,13.219-19.06,13.219c-2.542,0-4.917-0.419-7.122-1.274 C58.103,118.38,53.263,109.572,54.795,97.7z M150.613,185.396l-9.156-8.389l-7.619,12.951c-3.391,0.341-6.615,0.514-9.665,0.514 c-4.401,0-8.635-0.263-12.708-0.777l-8.634-14.973l-9.151,9.909c-4.91-2.717-9.15-5.856-12.708-9.413 c-8.81-8.295-13.384-17.959-13.727-28.97c2.877,1.692,7.427,3.461,13.675,5.308l10.636,13.629l9.44-9.852 c4.734,0.702,9.234,1.12,13.466,1.275l10.689,11.498l9.671-11.949c3.559-0.173,7.285-0.515,11.182-1.01l9.924,10.159l10.933-14.227 c5.931-1.351,11.196-2.798,15.771-4.323C179.747,163.538,169.068,176.414,150.613,185.396z M175.258,124.907 c-2.209,0.849-4.66,1.273-7.369,1.273c-8.134,0-14.489-4.415-19.052-13.224l40.905-14.477 C191.105,110.331,186.273,119.141,175.258,124.907z"
        },
        "sankey": {
            "itemStyle": {
                "normal": {
                    "borderWidth": "0",
                    "borderColor": "#ccc"
                },
                "emphasis": {
                    "borderWidth": "0",
                    "borderColor": "#ccc"
                }
            },
            "symbol": "path://M237.062,81.761L237.062,81.761c-12.144-14.24-25.701-20.1-40.68-19.072 c-10.843,0.747-20.938,5.154-30.257,13.127c-9.51-5.843-19.8-9.227-30.859-10.366c0.521-3.197,1.46-6.306,2.85-9.363 c3.458-7.038,8.907-12.741,16.331-17.296c-5.609-3.384-11.227-6.799-16.854-10.279c-16.257,8.104-25.06,20.601-26.463,38.417 c-7.599,1.705-14.685,4.486-21.247,8.437c-9.164-7.677-18.996-11.917-29.496-12.632c-14.819-0.998-28.467,4.787-40.938,18.827 C6.445,96.182,0,114.867,0,136.242c-0.007,6.371,0.674,12.646,2.053,18.738c4.593,22.785,15.398,41.367,32.558,55.344 c15.43,12.773,29.901,18.023,43.362,16.981c7.074-0.561,13.624-3.977,19.685-10.192c10.534,5.49,20.391,8.217,29.561,8.203 c9.856-0.012,20.236-2.953,31.125-8.898c6.227,6.692,12.966,10.346,20.211,10.933c13.795,1.073,28.614-4.111,44.377-16.84 c17.49-14.104,28.043-32.79,31.796-55.485c0.836-5.624,1.272-11.292,1.272-16.966C255.998,115.814,249.707,96.601,237.062,81.761z  M54.795,97.7l40.661,14.496c-4.402,8.811-10.766,13.219-19.06,13.219c-2.542,0-4.917-0.419-7.122-1.274 C58.103,118.38,53.263,109.572,54.795,97.7z M150.613,185.396l-9.156-8.389l-7.619,12.951c-3.391,0.341-6.615,0.514-9.665,0.514 c-4.401,0-8.635-0.263-12.708-0.777l-8.634-14.973l-9.151,9.909c-4.91-2.717-9.15-5.856-12.708-9.413 c-8.81-8.295-13.384-17.959-13.727-28.97c2.877,1.692,7.427,3.461,13.675,5.308l10.636,13.629l9.44-9.852 c4.734,0.702,9.234,1.12,13.466,1.275l10.689,11.498l9.671-11.949c3.559-0.173,7.285-0.515,11.182-1.01l9.924,10.159l10.933-14.227 c5.931-1.351,11.196-2.798,15.771-4.323C179.747,163.538,169.068,176.414,150.613,185.396z M175.258,124.907 c-2.209,0.849-4.66,1.273-7.369,1.273c-8.134,0-14.489-4.415-19.052-13.224l40.905-14.477 C191.105,110.331,186.273,119.141,175.258,124.907z"
        },
        "funnel": {
            "itemStyle": {
                "normal": {
                    "borderWidth": "0",
                    "borderColor": "#ccc"
                },
                "emphasis": {
                    "borderWidth": "0",
                    "borderColor": "#ccc"
                }
            },
            "symbol": "path://M237.062,81.761L237.062,81.761c-12.144-14.24-25.701-20.1-40.68-19.072 c-10.843,0.747-20.938,5.154-30.257,13.127c-9.51-5.843-19.8-9.227-30.859-10.366c0.521-3.197,1.46-6.306,2.85-9.363 c3.458-7.038,8.907-12.741,16.331-17.296c-5.609-3.384-11.227-6.799-16.854-10.279c-16.257,8.104-25.06,20.601-26.463,38.417 c-7.599,1.705-14.685,4.486-21.247,8.437c-9.164-7.677-18.996-11.917-29.496-12.632c-14.819-0.998-28.467,4.787-40.938,18.827 C6.445,96.182,0,114.867,0,136.242c-0.007,6.371,0.674,12.646,2.053,18.738c4.593,22.785,15.398,41.367,32.558,55.344 c15.43,12.773,29.901,18.023,43.362,16.981c7.074-0.561,13.624-3.977,19.685-10.192c10.534,5.49,20.391,8.217,29.561,8.203 c9.856-0.012,20.236-2.953,31.125-8.898c6.227,6.692,12.966,10.346,20.211,10.933c13.795,1.073,28.614-4.111,44.377-16.84 c17.49-14.104,28.043-32.79,31.796-55.485c0.836-5.624,1.272-11.292,1.272-16.966C255.998,115.814,249.707,96.601,237.062,81.761z  M54.795,97.7l40.661,14.496c-4.402,8.811-10.766,13.219-19.06,13.219c-2.542,0-4.917-0.419-7.122-1.274 C58.103,118.38,53.263,109.572,54.795,97.7z M150.613,185.396l-9.156-8.389l-7.619,12.951c-3.391,0.341-6.615,0.514-9.665,0.514 c-4.401,0-8.635-0.263-12.708-0.777l-8.634-14.973l-9.151,9.909c-4.91-2.717-9.15-5.856-12.708-9.413 c-8.81-8.295-13.384-17.959-13.727-28.97c2.877,1.692,7.427,3.461,13.675,5.308l10.636,13.629l9.44-9.852 c4.734,0.702,9.234,1.12,13.466,1.275l10.689,11.498l9.671-11.949c3.559-0.173,7.285-0.515,11.182-1.01l9.924,10.159l10.933-14.227 c5.931-1.351,11.196-2.798,15.771-4.323C179.747,163.538,169.068,176.414,150.613,185.396z M175.258,124.907 c-2.209,0.849-4.66,1.273-7.369,1.273c-8.134,0-14.489-4.415-19.052-13.224l40.905-14.477 C191.105,110.331,186.273,119.141,175.258,124.907z"
        },
        "gauge": {
            "itemStyle": {
                "normal": {
                    "borderWidth": "0",
                    "borderColor": "#ccc"
                },
                "emphasis": {
                    "borderWidth": "0",
                    "borderColor": "#ccc"
                }
            },
            "symbol": "path://M237.062,81.761L237.062,81.761c-12.144-14.24-25.701-20.1-40.68-19.072 c-10.843,0.747-20.938,5.154-30.257,13.127c-9.51-5.843-19.8-9.227-30.859-10.366c0.521-3.197,1.46-6.306,2.85-9.363 c3.458-7.038,8.907-12.741,16.331-17.296c-5.609-3.384-11.227-6.799-16.854-10.279c-16.257,8.104-25.06,20.601-26.463,38.417 c-7.599,1.705-14.685,4.486-21.247,8.437c-9.164-7.677-18.996-11.917-29.496-12.632c-14.819-0.998-28.467,4.787-40.938,18.827 C6.445,96.182,0,114.867,0,136.242c-0.007,6.371,0.674,12.646,2.053,18.738c4.593,22.785,15.398,41.367,32.558,55.344 c15.43,12.773,29.901,18.023,43.362,16.981c7.074-0.561,13.624-3.977,19.685-10.192c10.534,5.49,20.391,8.217,29.561,8.203 c9.856-0.012,20.236-2.953,31.125-8.898c6.227,6.692,12.966,10.346,20.211,10.933c13.795,1.073,28.614-4.111,44.377-16.84 c17.49-14.104,28.043-32.79,31.796-55.485c0.836-5.624,1.272-11.292,1.272-16.966C255.998,115.814,249.707,96.601,237.062,81.761z  M54.795,97.7l40.661,14.496c-4.402,8.811-10.766,13.219-19.06,13.219c-2.542,0-4.917-0.419-7.122-1.274 C58.103,118.38,53.263,109.572,54.795,97.7z M150.613,185.396l-9.156-8.389l-7.619,12.951c-3.391,0.341-6.615,0.514-9.665,0.514 c-4.401,0-8.635-0.263-12.708-0.777l-8.634-14.973l-9.151,9.909c-4.91-2.717-9.15-5.856-12.708-9.413 c-8.81-8.295-13.384-17.959-13.727-28.97c2.877,1.692,7.427,3.461,13.675,5.308l10.636,13.629l9.44-9.852 c4.734,0.702,9.234,1.12,13.466,1.275l10.689,11.498l9.671-11.949c3.559-0.173,7.285-0.515,11.182-1.01l9.924,10.159l10.933-14.227 c5.931-1.351,11.196-2.798,15.771-4.323C179.747,163.538,169.068,176.414,150.613,185.396z M175.258,124.907 c-2.209,0.849-4.66,1.273-7.369,1.273c-8.134,0-14.489-4.415-19.052-13.224l40.905-14.477 C191.105,110.331,186.273,119.141,175.258,124.907z"
        },
        "candlestick": {
            "itemStyle": {
                "normal": {
                    "color": "#ffee51",
                    "color0": "#ffffff",
                    "borderColor": "#ff715e",
                    "borderColor0": "#797fba",
                    "borderWidth": "1"
                }
            }
        },
        "graph": {
            "itemStyle": {
                "normal": {
                    "borderWidth": "0",
                    "borderColor": "#ccc"
                }
            },
            "lineStyle": {
                "normal": {
                    "width": "1",
                    "color": "#888888"
                }
            },
            "symbolSize": "8",
            "symbol": "path://M237.062,81.761L237.062,81.761c-12.144-14.24-25.701-20.1-40.68-19.072 c-10.843,0.747-20.938,5.154-30.257,13.127c-9.51-5.843-19.8-9.227-30.859-10.366c0.521-3.197,1.46-6.306,2.85-9.363 c3.458-7.038,8.907-12.741,16.331-17.296c-5.609-3.384-11.227-6.799-16.854-10.279c-16.257,8.104-25.06,20.601-26.463,38.417 c-7.599,1.705-14.685,4.486-21.247,8.437c-9.164-7.677-18.996-11.917-29.496-12.632c-14.819-0.998-28.467,4.787-40.938,18.827 C6.445,96.182,0,114.867,0,136.242c-0.007,6.371,0.674,12.646,2.053,18.738c4.593,22.785,15.398,41.367,32.558,55.344 c15.43,12.773,29.901,18.023,43.362,16.981c7.074-0.561,13.624-3.977,19.685-10.192c10.534,5.49,20.391,8.217,29.561,8.203 c9.856-0.012,20.236-2.953,31.125-8.898c6.227,6.692,12.966,10.346,20.211,10.933c13.795,1.073,28.614-4.111,44.377-16.84 c17.49-14.104,28.043-32.79,31.796-55.485c0.836-5.624,1.272-11.292,1.272-16.966C255.998,115.814,249.707,96.601,237.062,81.761z  M54.795,97.7l40.661,14.496c-4.402,8.811-10.766,13.219-19.06,13.219c-2.542,0-4.917-0.419-7.122-1.274 C58.103,118.38,53.263,109.572,54.795,97.7z M150.613,185.396l-9.156-8.389l-7.619,12.951c-3.391,0.341-6.615,0.514-9.665,0.514 c-4.401,0-8.635-0.263-12.708-0.777l-8.634-14.973l-9.151,9.909c-4.91-2.717-9.15-5.856-12.708-9.413 c-8.81-8.295-13.384-17.959-13.727-28.97c2.877,1.692,7.427,3.461,13.675,5.308l10.636,13.629l9.44-9.852 c4.734,0.702,9.234,1.12,13.466,1.275l10.689,11.498l9.671-11.949c3.559-0.173,7.285-0.515,11.182-1.01l9.924,10.159l10.933-14.227 c5.931-1.351,11.196-2.798,15.771-4.323C179.747,163.538,169.068,176.414,150.613,185.396z M175.258,124.907 c-2.209,0.849-4.66,1.273-7.369,1.273c-8.134,0-14.489-4.415-19.052-13.224l40.905-14.477 C191.105,110.331,186.273,119.141,175.258,124.907z",
            "smooth": false,
            "color": [
                "#cf4830",
                "#e08929",
                "#eed841",
                "#538a41",
                "#9d3323",
                "#872168",
                "#f4a929"
            ],
            "label": {
                "normal": {
                    "textStyle": {
                        "color": "#333333"
                    }
                }
            }
        },
        "map": {
            "itemStyle": {
                "normal": {
                    "areaColor": "#555555",
                    "borderColor": "#999999",
                    "borderWidth": 0.5
                },
                "emphasis": {
                    "areaColor": "rgba(255,175,81,0.5)",
                    "borderColor": "#ffaf51",
                    "borderWidth": 1
                }
            },
            "label": {
                "normal": {
                    "textStyle": {
                        "color": "#ffffff"
                    }
                },
                "emphasis": {
                    "textStyle": {
                        "color": "rgb(255,238,81)"
                    }
                }
            }
        },
        "geo": {
            "itemStyle": {
                "normal": {
                    "areaColor": "#555555",
                    "borderColor": "#999999",
                    "borderWidth": 0.5
                },
                "emphasis": {
                    "areaColor": "rgba(255,175,81,0.5)",
                    "borderColor": "#ffaf51",
                    "borderWidth": 1
                }
            },
            "label": {
                "normal": {
                    "textStyle": {
                        "color": "#ffffff"
                    }
                },
                "emphasis": {
                    "textStyle": {
                        "color": "rgb(255,238,81)"
                    }
                }
            }
        },
        "categoryAxis": {
            "axisLine": {
                "show": true,
                "lineStyle": {
                    "color": "#666666"
                }
            },
            "axisTick": {
                "show": false,
                "lineStyle": {
                    "color": "#333"
                }
            },
            "axisLabel": {
                "show": true,
                "textStyle": {
                    "color": "#999999"
                }
            },
            "splitLine": {
                "show": true,
                "lineStyle": {
                    "color": [
                        "#555555"
                    ]
                }
            },
            "splitArea": {
                "show": false,
                "areaStyle": {
                    "color": [
                        "rgba(250,250,250,0.05)",
                        "rgba(200,200,200,0.02)"
                    ]
                }
            }
        },
        "valueAxis": {
            "axisLine": {
                "show": true,
                "lineStyle": {
                    "color": "#666666"
                }
            },
            "axisTick": {
                "show": false,
                "lineStyle": {
                    "color": "#333"
                }
            },
            "axisLabel": {
                "show": true,
                "textStyle": {
                    "color": "#999999"
                }
            },
            "splitLine": {
                "show": true,
                "lineStyle": {
                    "color": [
                        "#555555"
                    ]
                }
            },
            "splitArea": {
                "show": false,
                "areaStyle": {
                    "color": [
                        "rgba(250,250,250,0.05)",
                        "rgba(200,200,200,0.02)"
                    ]
                }
            }
        },
        "logAxis": {
            "axisLine": {
                "show": true,
                "lineStyle": {
                    "color": "#666666"
                }
            },
            "axisTick": {
                "show": false,
                "lineStyle": {
                    "color": "#333"
                }
            },
            "axisLabel": {
                "show": true,
                "textStyle": {
                    "color": "#999999"
                }
            },
            "splitLine": {
                "show": true,
                "lineStyle": {
                    "color": [
                        "#555555"
                    ]
                }
            },
            "splitArea": {
                "show": false,
                "areaStyle": {
                    "color": [
                        "rgba(250,250,250,0.05)",
                        "rgba(200,200,200,0.02)"
                    ]
                }
            }
        },
        "timeAxis": {
            "axisLine": {
                "show": true,
                "lineStyle": {
                    "color": "#666666"
                }
            },
            "axisTick": {
                "show": false,
                "lineStyle": {
                    "color": "#333"
                }
            },
            "axisLabel": {
                "show": true,
                "textStyle": {
                    "color": "#999999"
                }
            },
            "splitLine": {
                "show": true,
                "lineStyle": {
                    "color": [
                        "#555555"
                    ]
                }
            },
            "splitArea": {
                "show": false,
                "areaStyle": {
                    "color": [
                        "rgba(250,250,250,0.05)",
                        "rgba(200,200,200,0.02)"
                    ]
                }
            }
        },
        "toolbox": {
            "iconStyle": {
                "normal": {
                    "borderColor": "#999999"
                },
                "emphasis": {
                    "borderColor": "#666666"
                }
            }
        },
        "legend": {
            "textStyle": {
                "color": "#999999"
            }
        },
        "tooltip": {
            "axisPointer": {
                "lineStyle": {
                    "color": "#cccccc",
                    "width": 1
                },
                "crossStyle": {
                    "color": "#cccccc",
                    "width": 1
                }
            }
        },
        "timeline": {
            "lineStyle": {
                "color": "#ffaf51",
                "width": 1
            },
            "itemStyle": {
                "normal": {
                    "color": "#ffaf51",
                    "borderWidth": 1
                },
                "emphasis": {
                    "color": "#ffaf51"
                }
            },
            "controlStyle": {
                "normal": {
                    "color": "#ffaf51",
                    "borderColor": "#ffaf51",
                    "borderWidth": 0.5
                },
                "emphasis": {
                    "color": "#ffaf51",
                    "borderColor": "#ffaf51",
                    "borderWidth": 0.5
                }
            },
            "checkpointStyle": {
                "color": "#ff715e",
                "borderColor": "rgba(255,113,94,0.4)"
            },
            "label": {
                "normal": {
                    "textStyle": {
                        "color": "#ff715e"
                    }
                },
                "emphasis": {
                    "textStyle": {
                        "color": "#ff715e"
                    }
                }
            }
        },
        "visualMap": {
            "color": [
                "#ff715e",
                "#ffee51",
                "#797fba"
            ]
        },
        "dataZoom": {
            "backgroundColor": "rgba(255,255,255,0)",
            "dataBackgroundColor": "rgba(222,222,222,1)",
            "fillerColor": "rgba(255,113,94,0.2)",
            "handleColor": "#cccccc",
            "handleSize": "100%",
            "textStyle": {
                "color": "#999999"
            }
        },
        "markPoint": {
            "label": {
                "normal": {
                    "textStyle": {
                        "color": "#333333"
                    }
                },
                "emphasis": {
                    "textStyle": {
                        "color": "#333333"
                    }
                }
            }
        }
    });
}));
 
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/theme/infographic.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/theme/infographic.js

Statements: 60% (9 / 15)      Branches: 40% (6 / 15)      Functions: 66.67% (2 / 3)      Lines: 57.14% (8 / 14)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 2051     1   1           1         1         1           1                                                                                                                                                                                                                                                                                                                                                             1    
(function (root, factory) {Iif (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['exports', 'echarts'], factory);
    } else Eif (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
        // CommonJS
        factory(exports, require('echarts'));
    } else {
        // Browser globals
        factory({}, root.echarts);
    }
}(this, function (exports, echarts) {
    var log = function (msg) {
        if (typeof console !== 'undefined') {
            console && console.error && console.error(msg);
        }
    };
    Iif (!echarts) {
        log('ECharts is not Loaded');
        return;
    }
 
    var colorPalette = [
        '#C1232B','#27727B','#FCCE10','#E87C25','#B5C334',
        '#FE8463','#9BCA63','#FAD860','#F3A43B','#60C0DD',
        '#D7504B','#C6E579','#F4E001','#F0805A','#26C0C0'
    ];
 
    var theme = {
 
        color: colorPalette,
 
        title: {
            textStyle: {
                fontWeight: 'normal',
                color: '#27727B'
            }
        },
 
        visualMap: {
            color:['#C1232B','#FCCE10']
        },
 
        toolbox: {
            iconStyle: {
                normal: {
                    borderColor: colorPalette[0]
                }
            }
        },
 
        tooltip: {
            backgroundColor: 'rgba(50,50,50,0.5)',
            axisPointer : {
                type : 'line',
                lineStyle : {
                    color: '#27727B',
                    type: 'dashed'
                },
                crossStyle: {
                    color: '#27727B'
                },
                shadowStyle : {
                    color: 'rgba(200,200,200,0.3)'
                }
            }
        },
 
        dataZoom: {
            dataBackgroundColor: 'rgba(181,195,52,0.3)',
            fillerColor: 'rgba(181,195,52,0.2)',
            handleColor: '#27727B'
        },
 
        categoryAxis: {
            axisLine: {
                lineStyle: {
                    color: '#27727B'
                }
            },
            splitLine: {
                show: false
            }
        },
 
        valueAxis: {
            axisLine: {
                show: false
            },
            splitArea : {
                show: false
            },
            splitLine: {
                lineStyle: {
                    color: ['#ccc'],
                    type: 'dashed'
                }
            }
        },
 
        timeline: {
            lineStyle: {
                color: '#27727B'
            },
            controlStyle: {
                normal: {
                    color: '#27727B',
                    borderColor: '#27727B'
                }
            },
            symbol: 'emptyCircle',
            symbolSize: 3
        },
 
        line: {
            itemStyle: {
                normal: {
                    borderWidth:2,
                    borderColor:'#fff',
                    lineStyle: {
                        width: 3
                    }
                },
                emphasis: {
                    borderWidth:0
                }
            },
            symbol: 'circle',
            symbolSize: 3.5
        },
 
        candlestick: {
            itemStyle: {
                normal: {
                    color: '#C1232B',
                    color0: '#B5C334',
                    lineStyle: {
                        width: 1,
                        color: '#C1232B',
                        color0: '#B5C334'
                    }
                }
            }
        },
 
        graph: {
            color: colorPalette
        },
 
        map: {
            label: {
                normal: {
                    textStyle: {
                        color: '#C1232B'
                    }
                },
                emphasis: {
                    textStyle: {
                        color: 'rgb(100,0,0)'
                    }
                }
            },
            itemStyle: {
                normal: {
                    areaColor: '#ddd',
                    borderColor: '#eee'
                },
                emphasis: {
                    areaColor: '#fe994e'
                }
            }
        },
 
        gauge: {
            axisLine: {
                lineStyle: {
                    color: [[0.2, '#B5C334'],[0.8, '#27727B'],[1, '#C1232B']]
                }
            },
            axisTick: {
                splitNumber: 2,
                length: 5,
                lineStyle: {
                    color: '#fff'
                }
            },
            axisLabel: {
                textStyle: {
                    color: '#fff'
                }
            },
            splitLine: {
                length: '5%',
                lineStyle: {
                    color: '#fff'
                }
            },
            title : {
                offsetCenter: [0, -20]
            }
        }
    };
 
    echarts.registerTheme('infographic', theme);
}));
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/theme/macarons.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/theme/macarons.js

Statements: 60% (9 / 15)      Branches: 40% (6 / 15)      Functions: 66.67% (2 / 3)      Lines: 60% (9 / 15)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 1991 1     1   1           1         1         1               1                                                                                                                                                                                                                                                                                                                                           1    
(function (root, factory) {
    Iif (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['exports', 'echarts'], factory);
    } else Eif (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
        // CommonJS
        factory(exports, require('echarts'));
    } else {
        // Browser globals
        factory({}, root.echarts);
    }
}(this, function (exports, echarts) {
    var log = function (msg) {
        if (typeof console !== 'undefined') {
            console && console.error && console.error(msg);
        }
    };
    Iif (!echarts) {
        log('ECharts is not Loaded');
        return;
    }
 
    var colorPalette = [
        '#2ec7c9','#b6a2de','#5ab1ef','#ffb980','#d87a80',
        '#8d98b3','#e5cf0d','#97b552','#95706d','#dc69aa',
        '#07a2a4','#9a7fd1','#588dd5','#f5994e','#c05050',
        '#59678c','#c9ab00','#7eb00a','#6f5553','#c14089'
    ];
 
 
    var theme = {
        color: colorPalette,
 
        title: {
            textStyle: {
                fontWeight: 'normal',
                color: '#008acd'
            }
        },
 
        visualMap: {
            itemWidth: 15,
            color: ['#5ab1ef','#e0ffff']
        },
 
        toolbox: {
            iconStyle: {
                normal: {
                    borderColor: colorPalette[0]
                }
            }
        },
 
        tooltip: {
            backgroundColor: 'rgba(50,50,50,0.5)',
            axisPointer : {
                type : 'line',
                lineStyle : {
                    color: '#008acd'
                },
                crossStyle: {
                    color: '#008acd'
                },
                shadowStyle : {
                    color: 'rgba(200,200,200,0.2)'
                }
            }
        },
 
        dataZoom: {
            dataBackgroundColor: '#efefff',
            fillerColor: 'rgba(182,162,222,0.2)',
            handleColor: '#008acd'
        },
 
        grid: {
            borderColor: '#eee'
        },
 
        categoryAxis: {
            axisLine: {
                lineStyle: {
                    color: '#008acd'
                }
            },
            splitLine: {
                lineStyle: {
                    color: ['#eee']
                }
            }
        },
 
        valueAxis: {
            axisLine: {
                lineStyle: {
                    color: '#008acd'
                }
            },
            splitArea : {
                show : true,
                areaStyle : {
                    color: ['rgba(250,250,250,0.1)','rgba(200,200,200,0.1)']
                }
            },
            splitLine: {
                lineStyle: {
                    color: ['#eee']
                }
            }
        },
 
        timeline : {
            lineStyle : {
                color : '#008acd'
            },
            controlStyle : {
                normal : { color : '#008acd'},
                emphasis : { color : '#008acd'}
            },
            symbol : 'emptyCircle',
            symbolSize : 3
        },
 
        line: {
            smooth : true,
            symbol: 'emptyCircle',
            symbolSize: 3
        },
 
        candlestick: {
            itemStyle: {
                normal: {
                    color: '#d87a80',
                    color0: '#2ec7c9',
                    lineStyle: {
                        color: '#d87a80',
                        color0: '#2ec7c9'
                    }
                }
            }
        },
 
        scatter: {
            symbol: 'circle',
            symbolSize: 4
        },
 
        map: {
            label: {
                normal: {
                    textStyle: {
                        color: '#d87a80'
                    }
                }
            },
            itemStyle: {
                normal: {
                    borderColor: '#eee',
                    areaColor: '#ddd'
                },
                emphasis: {
                    areaColor: '#fe994e'
                }
            }
        },
 
        graph: {
            color: colorPalette
        },
 
        gauge : {
            axisLine: {
                lineStyle: {
                    color: [[0.2, '#2ec7c9'],[0.8, '#5ab1ef'],[1, '#d87a80']],
                    width: 10
                }
            },
            axisTick: {
                splitNumber: 10,
                length :15,
                lineStyle: {
                    color: 'auto'
                }
            },
            splitLine: {
                length :22,
                lineStyle: {
                    color: 'auto'
                }
            },
            pointer : {
                width : 5
            }
        }
    };
 
    echarts.registerTheme('macarons', theme);
}));
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/theme/roma.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/theme/roma.js

Statements: 60% (9 / 15)      Branches: 40% (6 / 15)      Functions: 66.67% (2 / 3)      Lines: 57.14% (8 / 14)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 681     1   1           1         1         1           1                                                                           1    
(function (root, factory) {Iif (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['exports', 'echarts'], factory);
    } else Eif (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
        // CommonJS
        factory(exports, require('echarts'));
    } else {
        // Browser globals
        factory({}, root.echarts);
    }
}(this, function (exports, echarts) {
    var log = function (msg) {
        if (typeof console !== 'undefined') {
            console && console.error && console.error(msg);
        }
    };
    Iif (!echarts) {
        log('ECharts is not Loaded');
        return;
    }
 
    var colorPalette = ['#E01F54','#001852','#f5e8c8','#b8d2c7','#c6b38e',
        '#a4d8c2','#f3d999','#d3758f','#dcc392','#2e4783',
        '#82b6e9','#ff6347','#a092f1','#0a915d','#eaf889',
        '#6699FF','#ff6666','#3cb371','#d5b158','#38b6b6'
    ];
 
    var theme = {
        color: colorPalette,
 
        visualMap: {
            color:['#e01f54','#e7dbc3'],
            textStyle: {
                color: '#333'
            }
        },
 
        candlestick: {
            itemStyle: {
                normal: {
                    color: '#e01f54',
                    color0: '#001852',
                    lineStyle: {
                        width: 1,
                        color: '#f5e8c8',
                        color0: '#b8d2c7'
                    }
                }
            }
        },
 
        graph: {
            color: colorPalette
        },
 
        gauge : {
            axisLine: {
                lineStyle: {
                    color: [[0.2, '#E01F54'],[0.8, '#b8d2c7'],[1, '#001852']],
                    width: 8
                }
            }
        }
    };
 
    echarts.registerTheme('roma', theme);
}));
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/theme/shine.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/theme/shine.js

Statements: 60% (9 / 15)      Branches: 40% (6 / 15)      Functions: 66.67% (2 / 3)      Lines: 57.14% (8 / 14)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 1581     1   1           1         1         1         1                                                                                                                                                                                                                                                                 1    
(function (root, factory) {Iif (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['exports', 'echarts'], factory);
    } else Eif (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
        // CommonJS
        factory(exports, require('echarts'));
    } else {
        // Browser globals
        factory({}, root.echarts);
    }
}(this, function (exports, echarts) {
    var log = function (msg) {
        if (typeof console !== 'undefined') {
            console && console.error && console.error(msg);
        }
    };
    Iif (!echarts) {
        log('ECharts is not Loaded');
        return;
    }
 
    var colorPalette = [
        '#c12e34','#e6b600','#0098d9','#2b821d',
        '#005eaa','#339ca8','#cda819','#32a487'
    ];
 
    var theme = {
 
        color: colorPalette,
 
        title: {
            textStyle: {
                fontWeight: 'normal'
            }
        },
 
        visualMap: {
            color:['#1790cf','#a2d4e6']
        },
 
        toolbox: {
            iconStyle: {
                normal: {
                    borderColor: '#06467c'
                }
            }
        },
 
        tooltip: {
            backgroundColor: 'rgba(0,0,0,0.6)'
        },
 
        dataZoom: {
            dataBackgroundColor: '#dedede',
            fillerColor: 'rgba(154,217,247,0.2)',
            handleColor: '#005eaa'
        },
 
        timeline: {
            lineStyle: {
                color: '#005eaa'
            },
            controlStyle: {
                normal: {
                    color: '#005eaa',
                    borderColor: '#005eaa'
                }
            }
        },
 
        candlestick: {
            itemStyle: {
                normal: {
                    color: '#c12e34',
                    color0: '#2b821d',
                    lineStyle: {
                        width: 1,
                        color: '#c12e34',
                        color0: '#2b821d'
                    }
                }
            }
        },
 
        graph: {
            color: colorPalette
        },
 
        map: {
            label: {
                normal: {
                    textStyle: {
                        color: '#c12e34'
                    }
                },
                emphasis: {
                    textStyle: {
                        color: '#c12e34'
                    }
                }
            },
            itemStyle: {
                normal: {
                    borderColor: '#eee',
                    areaColor: '#ddd'
                },
                emphasis: {
                    areaColor: '#e6b600'
                }
            }
        },
 
        gauge: {
            axisLine: {
                show: true,
                lineStyle: {
                    color: [[0.2, '#2b821d'],[0.8, '#005eaa'],[1, '#c12e34']],
                    width: 5
                }
            },
            axisTick: {
                splitNumber: 10,
                length:8,
                lineStyle: {
                    color: 'auto'
                }
            },
            axisLabel: {
                textStyle: {
                    color: 'auto'
                }
            },
            splitLine: {
                length: 12,
                lineStyle: {
                    color: 'auto'
                }
            },
            pointer: {
                length: '90%',
                width: 3,
                color: 'auto'
            },
            title: {
                textStyle: {
                    color: '#333'
                }
            },
            detail: {
                textStyle: {
                    color: 'auto'
                }
            }
        }
    };
    echarts.registerTheme('shine', theme);
}));
 
Code coverage report for node-npmtest-echarts/node_modules/echarts/theme/vintage.js

npmtest-echarts (v0.0.1)

Code coverage report for node-npmtest-echarts/node_modules/echarts/theme/vintage.js

Statements: 57.14% (8 / 14)      Branches: 40% (6 / 15)      Functions: 66.67% (2 / 3)      Lines: 57.14% (8 / 14)      Ignored: none     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 311 1     1   1           1         1       1 1                
(function (root, factory) {
    Iif (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['exports', 'echarts'], factory);
    } else Eif (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
        // CommonJS
        factory(exports, require('echarts'));
    } else {
        // Browser globals
        factory({}, root.echarts);
    }
}(this, function (exports, echarts) {
    var log = function (msg) {
        if (typeof console !== 'undefined') {
            console && console.error && console.error(msg);
        }
    };
    Iif (!echarts) {
        log('ECharts is not Loaded');
        return;
    }
    var colorPalette = ['#d87c7c','#919e8b', '#d7ab82',  '#6e7074','#61a0a8','#efa18d', '#787464', '#cc7e63', '#724e58', '#4b565b'];
    echarts.registerTheme('vintage', {
        color: colorPalette,
        backgroundColor: '#fef8ef',
        graph: {
            color: colorPalette
        }
    });
}));